IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

insérer ou remplacer une ligne string dans un fichier texte ?


Sujet :

Delphi

  1. #21
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    En même temps la propriété dans un TStringList c'est Strings[] et non Lines[]

    et il est bon rappeler que Lines renvoie un TStrings et que grace à la propriété tableau par défaut que Lines[] est en réalité Lines.Strings[]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MyStringList[i] := Edit1.Text; // propriété tableau Strings par défaut
    MyStringList.Strings[i] := Edit1.Text; // accès propriété explicite
     
    MyMemo.Lines[i] := Edit1.Text; // propriété tableau Strings par défaut
    MyMemo.Lines.Strings[i] := Edit1.Text; // accès propriété explicite

  2. #22
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Points : 37
    Points
    37
    Par défaut
    milles excuse j'ai juste copier la solution de la réponse de tourlourou
    juste pour l'explication

    Je te conseille de regarder l'objet TStringList qui permet de charger/sauver un fichier texte avec LoadFromFile/SaveToFile.
    Tu accèdes à chaque ligne grâce à la propriété Lines[i] (MyStringList.Lines[3] := 'My New Line' et dispose des méthodes Add (ajoute à la fin), Insert, Delete et tant d'autres.
    le vrais code le voila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fichier[ligne-1]:=MynewKey;
    bon j'ai résolu le problème de l'EDIT on sortant cette linge de la boucle

    mais je ne comprend toujours pas pourquoi ça ne marche pas a l’intérieur de la boucle

  3. #23
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    ShaiLeTroll :
    MyStringList[i] := Edit1.Text; // propriété tableau Strings par défaut
    MyStringList.Strings[i] := Edit1.Text; // accès propriété explicite
    Comme on peut utiliser ces deux possibilités, quelle est la meilleure ???
    ... Pour ma part je préfèrerais MyStringList[i] := à MyStringList.Strings[i] par flemme car avec MyStringList[i] ça fait des frappes-clavier en moins.
    ... mais il y a peut-etre un intérêt à préférer MyStringList.Strings[i] ???

    A+.

  4. #24
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 763
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 763
    Points : 13 381
    Points
    13 381
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Comme on peut utiliser ces deux possibilités, quelle est la meilleure ???
    C'est parfaitement identique. Le seul cas où on pourrait avoir besoin de Strings est dans un with.

  5. #25
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    Andnotor
    C'est parfaitement identique. Le seul cas où on pourrait avoir besoin de Strings est dans un with.
    Ok, merci beaucoup.

    A+.

  6. #26
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Bonjour,


    Citation:
    MyStringList.Lines[i] := Edit1.Text;

    Bizarre, car chez moi le compilo n'accepte même pas ça.
    En fait je crois bien qu'il faut attaquer .Strings[i] et non pas .Lines[i], tout simplement.

    Mais attention, cas particulier, si la liste est triée, tu auras un message d'erreur à l'exécution.

    A+

  7. #27
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    C'est parfaitement identique. Le seul cas où on pourrait avoir besoin de Strings est dans un with.
    Ou en C++Builder où l'appel de l'opérateur [] est peu lisible :

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    (*MyStringList)[i] = Edit1->Text; // opérateur [] sur le pointer déférencé
    MyStringList->Strings[i] = Edit1->Text; // accès propriété explicite 
     
    (*MyMemo->Lines)[i] = Edit1->Text; // opérateur [] sur le pointer déférencé
    MyMemo->Lines->Strings[i] = Edit1->Text; // accès propriété explicite

    En Delphi, c'est effectivement parfaitement identique
    En C++Builder, [] est une surcharge de l'opérateur qui appel Strings[]
    donc cela doit ajouter une ou deux instructions en plus par rapport à un accès explicite de la propriété Strings[]

    En C++Builder, un objet RTL\VCL\FMX est toujours un pointeur, on ne le voit en Delphi qui simplifie cela, mais en C++ c'est très marqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var
      SL: TStringList;
    begin
      SL := TStringList.Create();
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    {
      TStringList * SL = new TStringList();

    TStringList du Delphi c'est TStringList *,
    ^TStringList du Delphi c'est TStringList **.

  8. #28
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    A propos d'un remplacement du style MyStringList[i] := Edit1.Text;

    Peter27x :
    Mais attention, cas particulier, si la liste est triée, tu auras un message d'erreur à l'exécution.
    Vrai, mais uniquement dans le cas d'une insertion et non dans le cas d'un simple remplacement ... et même dans le cas d'une liste triée au préalable rien n'empêche de la déclarer comme non triée juste avant une insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyStringList.Sorted:=False;
    MyStringList.Insert(Index: Integer; const S: string)
    A+.

  9. #29
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Bonjour,

    A propos d'un remplacement du style MyStringList[i] := Edit1.Text;

    Peter27x :

    Vrai, mais uniquement dans le cas d'une insertion et non dans le cas d'un simple remplacement ... et même dans le cas d'une liste triée au préalable rien n'empêche de la déclarer comme non triée juste avant une insertion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MyStringList.Sorted:=False;
    MyStringList.Insert(Index: Integer; const S: string)
    A+.
    Ben non un strings[i] := ... sur une liste triée génèrera une tourmente Delphinesque. Il faut comme tu l'indiques alors la "dé-trier" temporairement le temps de faire notre petit Strings[i] := ... J'ai expérimenté ce cas de figure complet il y a peu.

  10. #30
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    Peter27x :
    Ben non un strings[i] := ... sur une liste triée génèrera une tourmente Delphinesque. Il faut comme tu l'indiques alors la "dé-trier" temporairement le temps de faire notre petit Strings[i] :=
    Bigre, t'as bien raison je viens de vérifier.
    ... Cela est certainement dû au fait que les lignes sont collées serrées entre elles et que le remplacement de l'une d'elles par une autre, généralement de longueur différente, n'est alors pas possible.

    A+.

  11. #31
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Re-bonjour,

    Peter27x :
    Bigre, t'as bien raison je viens de vérifier.
    ... Cela est certainement dû au fait que les lignes sont collées serrées entre elles et que le remplacement de l'une d'elles par une autre, généralement de longueur différente, n'est alors pas possible.

    A+.
    "Collées serrées" ça sent les DOM TOM tout ça, Paul Toth saura donc nous dire le pourquoi pas du comment de cette sombre histoire de Strings[i].

  12. #32
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Citation Envoyé par peter27x Voir le message
    Ben non un strings[i] := ... sur une liste triée génèrera une tourmente Delphinesque.
    Suffit de lire Classes.pas que cela a été pensé ainsi
    Put est l'accesseur Write du Strings[]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TStringList.Put(Index: Integer; const S: string);
    begin
      if Sorted then Error(@SSortedListError, 0);
     ...

    Citation Envoyé par Gilbert Geyer Voir le message
    Re-bonjour,
    le remplacement de l'une d'elles par une autre, généralement de longueur différente, n'est alors pas possible
    j'ai lu le code de la TStringList et TList de XE3, il y a eu du nettoyage depuis celui de D7 (même celui de D2007), plus de bidouille à base de GetMem et du MaxListSize : La question du 12h55 sur TList
    Embarcadero !

    Ce n'est pas un problème mémoire que la TStringList utilise un tableau de record associant un Object et une string, substituer une chaine ne pose pas de problème, il ne stocke pas les chaines ensemble 'collé-serré' comme la propriété Text nous le propose (qui fait un gros concat bien massif) mais sous la forme d'un tableau, chaque Strings[] étant indépendante l'une de l'autre
    le tableau lui ne stocke finalement que la référence du TObject et le pointer magique de la String
    Les Strings elle se balade ailleurs en mémoire,
    En D7, c'est Windows qui faisait le gros du boulot d'allocation, d'où la lenteur
    En D2007, via FastMM intégré, le tableau et ses chaines ne sont pas forcément dans le même bloc d'allocation, surtout si il y a du Grow à répétition,

    L'insertion manuel risquerait de nuire au tri, c'est refusé, car sinon lors de l'affectation, il faudrait qu'il assure le tri donc au final il a mis la chaine à un endroit imprévu par le développeur sans moyen de savoir où, le Add lui renvoie la position d'insertion, très utile parfois !

    Donc que le Put protège sur Sorted, c'est bien plus prudent !

    Pour la TMemoStrings ou TRichEditStrings, ce n'est même pas Delphi qui gère la mémoire ça mais Windows à coup de SendMessage EM_GETLINE\EM_REPLACESEL

  13. #33
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-bonjour,

    ShaiLeTroll :
    il y a eu du nettoyage depuis celui de D7 (même celui de D2007), plus de bidouille à base de GetMem .... substituer une chaine ne pose pas de problème
    OK, mais j'utilise encore D6 donc pour moi faudra pas que j'oublie le Sorted:=False après chaque tri.

    A+.

  14. #34
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Non, lorsque je parlais de " substituer une chaine ne pose pas de problème ", je parlais dans l'absolu pour la gestion mémoire !

    Pour le blocage du Put sur Sorted, que ce soit D6 ou XE4, c'est une limitation fonctionnelle toujours d'actualité !

    Sinon, au lieu d'un Sorted, utilise un Sort() ponctuel

  15. #35
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    ShaiLeTroll :
    Pour le blocage du Put sur Sorted, que ce soit D6 ou XE4, c'est une limitation fonctionnelle toujours d'actualité ! Sinon, au lieu d'un Sorted, utilise un Sort() ponctuel
    Ok, merci pour l'info et le conseil.

    A+.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Afficher une ligne Donnée dans un fichier texte existant
    Par M.sarah1988 dans le forum VB.NET
    Réponses: 2
    Dernier message: 20/09/2014, 01h20
  2. Suppression d'une ligne particulière dans un fichier texte
    Par Aymeric41 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 29/08/2011, 13h53
  3. Supprimer une ligne vide dans un fichier texte
    Par Tibà22 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/04/2011, 16h58
  4. Lire une ligne spécifique dans un fichier texte
    Par ZRemi dans le forum MATLAB
    Réponses: 2
    Dernier message: 26/04/2010, 13h58
  5. Chercher une ligne aléatoire dans un fichier texte
    Par pyopyo dans le forum Langage
    Réponses: 1
    Dernier message: 30/04/2008, 09h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo