Comprendre un code...

lunchbox Messages postés 5 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 23 octobre 2006 - 21 oct. 2006 à 18:34
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 24 oct. 2006 à 21:55
bonjours, j'ai besoins d'une procédure pour extraire plusieurs strings d'une seul qui utilise des virgules pour les séparer...
pour faire cela, j'ai trouvé ce code:

procedure SeperateIntoTokens(S:String;var List:TStringList);
begin
  List.Clear;
  while pos(',',s) > 0 do
    begin
      List.Add(Copy(s,1,pos(',',s)-1));
      s := copy(s,pos(',',s)+1,length(s));
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s:String;
  MyList:TStringList;

begin
  s:=Edit1.Text;
  MyList := TStringList.Create;
  SeperateIntoTokens(s,MyList);
  edit2.Text := MyList[0];
  edit3.Text := MyList[1];
  edit4.Text := MyList[2];
end;

ces procédures fonctionnent à merveille mais j'aimerais bien comprendre comment le tout fonctionne et ajouter des commentaires... merci

9 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
21 oct. 2006 à 20:28
ta methode est trop lourde, surtout que TStrings permet de le faire sans rien d'autre.

procedure ExplodeStr(const S : string; const Delimiter : char; List : TStrings);
begin
  with List do begin
     Clear; // efface la liste
     BeginUpdate; // notifie la liste qu'on vas la modifiée
     Delimiter     := Delimiter; // on place le delimiteur
     DelimitedText := S; // on injecte S
     EndUpdate; // notifie la liste qu'on a finit les modification
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var tsl : TStringList;
begin
  // on crée l'objet liste.
  Tsl := TStringList.Create;

  // on explode la chaine de edit1
  ExplodeStr(Edit1.Text,',',TSL);
  // on place les chaine dans les tedit
  if tsl.count > 0 then edit2.Text := tsl.Strings[0];
  if tsl.count > 1 then edit3.Text := tsl.Strings[1];
  if tsl.count > 2 then edit4.Text := tsl.Strings[2];

  // on libere l'objet tsl pour eviter les fuites memoires
  tsl.free;
end;

<hr size="2" width="100%" />Croc (click me)
0
lunchbox Messages postés 5 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 23 octobre 2006
22 oct. 2006 à 12:50
merci ces procédures fonctionnent mais quand je mets un espace et pas quand j'écris une virgule dans l'edit1.

c'est possible de le faire avec des virgules?
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 oct. 2006 à 13:13
Oo ...chez moi ça marche avec n'importe quoi ... , ; : / \ ! ? " ' ( ) | ect...





<hr size="2" width="100%" />
Croc (click me)
0
lunchbox Messages postés 5 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 23 octobre 2006
22 oct. 2006 à 13:48
chez moi toujours que les espaces...

il y a pas une autre facon de faire, un peu plus simple??

je vous donne l'exemple de ce que j'ai besoin pour une meilleure comprehension:

je reçois: edit1.text := '12,345,23,556,65';

et je voudrais: edit2.text :='12';
                         edit3.text := '345';
                         edit4.text := '23';
et ainsi de suite...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
22 oct. 2006 à 16:12
Salut,

Je confirme : le code de f0xi fonctionne très bien (Fait un simple copier-coller DelphiFr->Form). Ca méthode est très simple et très rapide. Elle est mieux que celle que tu as posté : tu devrais donc l'utiliser ;).
0
lunchbox Messages postés 5 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 23 octobre 2006
22 oct. 2006 à 18:27
hello merci, j'ai trouvé le problème...

j'ai essayé avec lazarus, qui est à peut près pareil que delphi mais sous linux...

je viens de booter sous ma session windows et là ça fonctionne beaucoup mieux...

merci pour l'aide et les commentaires

a+
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
23 oct. 2006 à 06:03
sinon y'a toujours cette solution :

procedure ExplodeStr(const S,Delimiter : string; List : TStrings);
begin
  with List do begin
     Clear; // efface la liste
     BeginUpdate; // notifie la liste qu'on vas la modifiée

     // remplace Delimiter par une fin de ligne dans la chaine S
     Text := StringReplace(S,Delimiter,#13#10,[rfReplaceAll]);

     EndUpdate; // notifie la liste qu'on a finit les modification
  end;
end;

<hr size="2" width="100%" />Croc (click me)
0
lunchbox Messages postés 5 Date d'inscription jeudi 21 juillet 2005 Statut Membre Dernière intervention 23 octobre 2006
23 oct. 2006 à 10:19
merci ca va bien aussi mais tu peux m'expliquer plus clairement cette procédure, j'aimerais bien comprendre comme il faut comment ça fonctionne...
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
24 oct. 2006 à 21:55
dans la derniere methode, qui est un peu moins rapide, on remplace tout simplement le texte "delimiter" dans la chaine "S" par une code de fin de ligne (eoln = #13#10), bien sur grace au flag "rfReplaceAll" on remplace toute les occurences de "delimiter".

exemple :

StringReplace('1,2,3,4', ',', #13#10, [rfReplaceAll]) = $31 0D0A 32 0D0A 33 0D0A 34 =
1
2
3
4

<hr size="2" width="100%" />Croc (click me)
0
Rejoignez-nous