lunchbox
Messages postés5Date d'inscriptionjeudi 21 juillet 2005StatutMembreDernière intervention23 octobre 2006
-
21 oct. 2006 à 18:34
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 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;
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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;
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 ;).
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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;
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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".