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 :

Probleme avec tstringlist


Sujet :

Delphi

  1. #1
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut Probleme avec tstringlist
    Voila, j'ai un problème avec les StringLists...
    J'ai 2 stringlist: la première contient le text suivant:
    vitesse du véhicule
    force du vent
    masse du véhicule
    résistance au sol

    La deuxième contient:
    force du vent
    masse du véhicule

    Je voudrait remplacer le text de la première stringlist par <aucune info> en fonction de la deuxième.

    Je fais donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringList1.text:=AnsiReplaceStr(Text,Stringlist2.Text, ' <aucune info> ')
    Et là rien ne marche!!! Mais si je passe par un mémo intermédiaire, là ca marche !!!
    Mais moi ce que je veux, c'est traiter ceci en mémoire et pas avec un mémo !!!
    Merci d'avance.....

  2. #2
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    Salut
    Citation Envoyé par aide(D6)
    Appelez AnsiReplaceStr pour analyser la chaîne spécifiée par AText et remplacer toutes les occurrences de la chaîne spécifiée par AFromText par la chaîne spécifiée par AToText. Les occurrences de AFromText sont identifiées par une comparaison tenant compte de la casse. L'identification des sous-chaînes n'est pas récursive : si la substitution de AToText aboutit à une nouvelle correspondance de AFromText, celle-ci n'est pas remplacée.
    Citation Envoyé par petitprince
    Je fais donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringList1.text:=AnsiReplaceStr(Text,Stringlist2.Text, ' <aucune info> ')
    Sauf erreur de ma part, ton code fait ça :
    Remplacer dans Text, toutes les occurences de Stringlist2.Text par ' <aucune info> '

    Compte tenu de ce que tu décris, ça ne peut pas fonctionner
    Les occurences à remplacer ne sont pas Stringlist2.Text

    Si ?

  3. #3
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    Mon code remplace dans stringlist1 par <aucune info> les occurence contenu par stringlist2
    Je fais: Stringlist1.Add.......
    Si Si, elles sont bien présente !!

  4. #4
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    Citation Envoyé par aide D6 TStrings.Text
    Enumère les chaînes de l'objet TStrings sous forme d'une seule chaîne où les chaînes individuelles sont séparées par des séquences retour chariot, passage à la ligne.

    property Text: string;

    Description

    La propriété Text permet de définir ou d'obtenir toutes les chaînes d'un objet TStrings à l'aide d'une seule chaîne délimitée par des séquences retour chariot, passage à la ligne.
    es tu sûr que Stringlist2.Text constitue une occurence à remplacer, sachant que ce string contient l'ensemble de tes chaines (stringlist2[0]+stringlist2[1]+stringlist2[2]...) séparées par des séquences retour chariot ?

  5. #5
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    euh ...........
    ben voila mon code, mais en effet ce que tu me dit me fait réfléchir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    procedure TForm1.Button3Click(Sender: TObject);
    var
    Streaming:TMemoryStream;
    StringList1,StringList2: TStringList;
    i:integer;
    begin
    Streaming:=TMemoryStream.Create;
    RxRichEdit1.Lines.SaveToStream(streaming);
    Streaming.Position := 0;
    Res := TResourceStream.Create(0,'MONTEXT','TEXT');
    StringList2 := TStringList.Create;
    memo3.Lines.LoadFromStream(Res);
     
    StringList1 := TStringList.Create;
      try
        with StringList1 do begin
          LoadFromStream(Streaming);
          Text := AnsiReplaceStr(Text,memo3.Lines.Text, ' <aucune info> ');
          end;
        with memo2 do begin
          Lines.Assign(StringList1);
        end;
      finally
        StringList1.free;
        StringList2.Free;
    Streaming.Free;
    Res.Free;
      end;
     
     
    end;
    Note que dans mon exemple la Stringlist2 est là en touriste, et remplacé par memo3 (comme j'ai que ca marchais qu'avec le memo)
    Et je charge dans stringlist1 un text issu d'un richedit, et dans la stringlist2 (enfin dans le memo3 !!!!) un text issu de mes ressources...
    Voila...
    En effet, ca doit merder au niveau des retours chariot

  6. #6
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    Alor, personne n'a de solution pour mon problème ?
    En tout cas merci OutOfRange...

  7. #7
    Membre éclairé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Par défaut
    Salut petitprince

    Pourrais-tu m'expliquer un peu mieux ce que tu fais ?
    Je crois comprendre que lorsque une ou + données ne sont pas présentes dans la 2ème liste (dans ton exemple vitesse du véhicule et résistance au sol), tu remplaces les chaînes correspondantes de la 1ère liste par ' <aucune info> '.
    Si c'est le cas, dans ton exemple, la 1ère liste devient :

    <aucune info>
    force du vent
    masse du véhicule
    <aucune info>

    C'est bien ça ?

  8. #8
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    salut !
    Non ce n'est pas vraiment ca: voici la liste 1
    vitesse du véhicule
    force du vent
    masse du véhicule
    résistance au sol

    je doit remplacer "force du vent" et "masse du véhicule" par une seule occurence <aucune info> et obtenir
    vitesse du véhicule
    <aucune info>
    résistance au sol

    voila où est le souci, et à l'heure où j'écrit, j'ai toujours rien trouvé !!

  9. #9
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    La première contient
    vitesse du véhicule
    force du vent
    masse du véhicule
    résistance au sol

    La deuxième contient:
    force du vent
    masse du véhicule

    L'idée est de trier ta première liste puis de rechercher chaque élément de la seconde et si il y est et que l'élt "aucune valeur" n'y est pas alors ajouter l'élt "aucune valeur".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    procedure TForm3.FormCreate(Sender: TObject);
    var
      List1, List2 : TStringList;
      i,j          : integer;
    begin
      List1.Sorted := true;
      For i:=0 to List2.Count-1 do
      begin
        j := List1.IndexOf(List2.strings[i]);
        if (j<>-1) then
        begin
          List1.Delete(j);
          if List1.IndexOf('aucune valeur')=-1 then
            List1.Add('aucune valeur');
        end;
      end;
    end;
    Est-il nécessaire de trier List1 je ne sais plus.
    a+

  10. #10
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    Bizarre, j'ai un message d'erreur, indice hors limite .... ?

  11. #11
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Tu as compilé le code que je t'ai donné tel qul sans remplir tes listes ni les créer ?

  12. #12
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    quand même ......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    procedure TForm1.FormCreate(Sender: TObject);
     
    var
      List1, List2 : TStringList;
      i,j          : integer;
    begin
       List1:=TStringList.Create;
       List2:=TStringList.Create;
       with List1 do begin
       Add('vitesse du véhicule');
       Add('force du vent');
       Add('masse du véhicule');
       Add('résistance au sol');
       end;
       with List2 do begin
       Add('force du vent');
       Add('masse du véhicule');
       end;
      List1.Sorted := true;
      For i:=0 to List2.Count-1 do
      begin
        j := List1.IndexOf(List2.strings[i]);
        if (j<>-1) then
        begin
          List1.Delete(j);
          if List1.IndexOf('aucune valeur')=-1 then
            List1.Add('aucune valeur');
            Memo1.Lines.Text:= List1.Text;
            List1.Free;
            List2.Free;
        end;
      end;
    end;
    c bon? remarque je débute en delphi alors j'ai du oublier un truc ......

  13. #13
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    procedure TForm1.FormCreate(Sender: TObject);
    var
      List1, List2 : TStringList;
      i,j          : integer;
    begin
       List1:=TStringList.Create;
       List2:=TStringList.Create;
       try
         with List1 do begin
         Add('vitesse du véhicule');
         Add('force du vent');
         Add('masse du véhicule');
         Add('résistance au sol');
         end;
         with List2 do begin
         Add('force du vent');
         Add('masse du véhicule');
         end;
        List1.Sorted := true;
        For i:=0 to List2.Count-1 do
        begin
          j := List1.IndexOf(List2.strings[i]);
          if (j<>-1) then
          begin
            List1.Delete(j);
            if List1.IndexOf('aucune valeur')=-1 then
              List1.Add('aucune valeur');
              Memo1.Lines.Text:= List1.Text;
          end;
        end;
      finally
        List1.Free;
        List2.Free;
      end;
    end;
    Utilise le débogueur c'est plus rapide que le forum.

    a+

  14. #14
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    bon Excuse pour try finally........
    Merci pour ta solution, elle fonctionne, mais le problème, elle met tout dans le désordre: comment faire pour ne pas changer l'ordre des chaine?
    A savoir:
    vitesse du véhicule
    aucune info
    résistance au sol

    Merci à plus !

  15. #15
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    procedure TForm1.FormCreate(Sender: TObject);
    var
      List1, List2 : TStringList;
      i,j          : integer;
    begin
       List1:=TStringList.Create;
       List2:=TStringList.Create;
       try
         with List1 do begin
         Add('vitesse du véhicule');
         Add('force du vent');
         Add('masse du véhicule');
         Add('résistance au sol');
         end;
         with List2 do begin
         Add('force du vent');
         Add('masse du véhicule');
         end;
    //    List1.Sorted := true;
        For i:=0 to List2.Count-1 do
        begin
          j := List1.IndexOf(List2.strings[i]);
          if (j<>-1) then
          begin
            List1.Delete(j);
            if List1.IndexOf('aucune valeur')=-1 then
            begin
              if j<List1.Count-1 then
                List1.insert(j,'aucune valeur')
              else List1.Add('aucune valeur');
            end;
            Memo1.Lines.Text:= List1.Text;
          end;
        end;
      finally
        List1.Free;
        List2.Free;
      end;
    end;
    Et Yoh, pif, paf, pouf.

    a+

  16. #16
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    Comment te remercier!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Un grand merci en tout cas !
    Mais............
    J'ai fait le teste avec carément 2 fichiers textes (un dans chaque liste), et il ne supprime pas la première ni la dernière ligne de la list2, celle qui contient les occurences à remplacer......
    As-tu une chtite idée par hasard?

  17. #17
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    tu confirme ce cahier des charges :

    Supprimer de la liste 1 tous les élts présent dans la liste2 et les remplacer par la valeur : "aucune valeur".
    la valeur : "aucune valeur" ne doit être présente qu'une seule fois en List1.

    Ben non je ne vois pas !
    Refait ton test avec une liste triée pour voir et modifie cette ligne

    if j<List1.Count{-1} then
    List1.insert(j,'aucune valeur')
    else List1.Add('aucune valeur');

    Si tes fichiers ne sont pas trop gros (<1Mo) alors poste les pour voir.

  18. #18
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    Bon je vais tester...

    Tu va me trouver painible, tu va dire que j'abuse, mais y'a un second souci!, ca ne marche qu'une seule fois:
    'vitesse du véhicule';
    'force du vent';
    'masse du véhicule';
    'résistance au sol';
    'vitesse du véhicule';
    'force du vent';
    'masse du véhicule';
    'résistance au sol';

    Après suppression, ca me donne:
    'vitesse du véhicule';
    'aucune info';
    'résistance au sol';
    'vitesse du véhicule';
    'force du vent';
    'masse du véhicule';
    'résistance au sol';

    Après ca ne marche plus !!!! Faut-il refaire une boucle en fin de procédure?

  19. #19
    Membre émérite Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 16
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Par défaut
    Citation Envoyé par petitprince
    Après ca ne marche plus !!!! Faut-il refaire une boucle en fin de procédure?
    Que veux-tu dire ?
    Le bout de code que je t'ai fournit à la vite est sur le formcreate; il n'est donc lancé qu'une fois !

    KOIKIVAPAS !
    Sois + précis parce que je sèche.
    a+

  20. #20
    Membre éclairé Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Par défaut
    ben c pas clair? Bon comment le dire autrement.....

    Dans la liste 1, je veux remplacer 2 chaine par 'aucune info', jusque là ok. Mais dans la liste 1, ces 2 chaines en question apparaissent plusieurs fois, mais ca ne remplace que les 2 premières rencontrées...
    Et j'ai mit tout ca sur un bouton lol !

Discussions similaires

  1. Probleme avec TStringList
    Par apprenti0859 dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/03/2009, 14h35
  2. Probleme avec une TStringList
    Par davos56 dans le forum Delphi
    Réponses: 10
    Dernier message: 12/04/2007, 11h03
  3. Réponses: 5
    Dernier message: 25/09/2006, 11h06
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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