f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 2022
-
17 mai 2006 à 02:55
Utilisateur anonyme -
17 mai 2006 à 16:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Procedure ExtractText(Separateur, Ligne: String; Var aList : TStringList);
Var TmpText : String;
Begin
If aList = Nil Then Exit;
While Pos(Separateur, Ligne) > 0 Do
Begin
TmpText := Copy(Ligne, 1, Pos(Separateur, Ligne) - 1);
If TmpText <> EmptyStr Then aList.Add(TmpText);
Ligne := Copy(Ligne, Pos(Separateur, Ligne) + 1, High(Integer));
End;
If Ligne <> EmptyStr Then aList.Add(Ligne);
End;
Utilisation :
procedure TForm1.Button1Click(Sender: TObject);
Var aList : TStringList;
begin
aList := TStringList.Create;
ExtractText(' ', 'Le forum de CodeS SourceS à changé', aList);
Memo1.Lines.Clear;
Memo1.Lines.AddStrings(aList);
aList.Free;
end;
@+
Cirec
Harvester_
Messages postés36Date d'inscriptionvendredi 31 décembre 2004StatutMembreDernière intervention 8 juillet 2007 17 mai 2006 à 15:36
Merci bien, je ne me sert pas souvent des array et je ne connaissais pas cette petite "technique" toute bête !
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 17 mai 2006 à 12:00
Ah, au fait, si tu veux utiliser un tableau dynamique :
type TWordsContainer = array of string;
function TSplit.Count: Integer;
begin
Result := High(WordsContainer);
end;
function TSplit.Split(Str: string): TWordsContainer;
var i, Previous, Index: Integer;
begin
Previous := 0;
Index := 0;
Str := Str + ' ';
SetLength(Result, 1); // <- tu définis la longueur
for i := 0 to Length(Str) do
begin
if Str[i] = ' ' then
begin
Result[Index] := Copy(Str, Previous + 1, i - Previous - 1);
Index := Index + 1;
SetLength(Result, Index + 1); // <- tu définis la longueur
Previous := i;
end;
end;
end;
Tu peux remplacer la méthode "function TSplit.Count: Integer;", qui devient inutile, par une propriété accessible.
Bonne prog' :p
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 17 mai 2006 à 11:25
Intéressant.
Mais pourquoi vouloir en faire un composant ?
Ton code est un peu redondant :
function TSplit.Split(Str:string):TWordsContainer;
var i,a,b:integer;
begin
a:=0;
b:=0;
str:=str+' ';//On ajoute un espace sinon le dernier mot ne sera pas reconnu car
// la string se fini par un caractère.
for i:=0 to length(str) do
begin
if str[i]=' ' then //Si le char testé est un espace
begin
if Copy(str,a,i-a)=' ' then // On ajoute le mot en se repérant avec la dernière
a:=a+(i-a) // position de fin de mot ( ou de début de string ).
else
begin
result[b]:=Copy(str,a,i-a);
a:=a+(i-a);//On ajoute la position de la fin du dernier mot trouvé.
b:=b+1;//On passe à l'enregistrement suivant.
end;
end;
end;
end;
Sans toucher à l'essentiel (j'ai renommé les variables pour m'y retrouver), et en respectant le concept, j'aurais fait :
function TSplit.Split(Str: string): TWordsContainer;
var i, Previous, Index: Integer;
begin
Previous := 0;
Index := 0;
Str := Str + ' ';
for i := 0 to Length(Str) do
begin
if Str[i] = ' ' then
begin
Result[Index] := Copy(Str, Previous + 1, i - Previous - 1);
Index := Index + 1;
Previous := i;
end;
end;
end;
Bonne prog' :p
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 17 mai 2006 à 02:55
mmm ... bonne idée ... mais je crains que le compo soit
1 inutile
2 lourd
premierement, les TStrings possede une propriété Delimiter et DelimitedText qui permet de "spliter" les chaines contenues.
deuxiement, regarde la fonction "chainepos" ici dans les codes sources, je pense qu'elle vas t'interressé car elle permet de recuperer n'importe qu'elle partie d'un texte selon un delimiteur qui peut etre aussi bien un caractere qu'un mots ou encore une phrase ...
17 mai 2006 à 16:12
Une StringList n'aurait elle pas fait l'affaire ?
Procedure ExtractText(Separateur, Ligne: String; Var aList : TStringList);
Var TmpText : String;
Begin
If aList = Nil Then Exit;
While Pos(Separateur, Ligne) > 0 Do
Begin
TmpText := Copy(Ligne, 1, Pos(Separateur, Ligne) - 1);
If TmpText <> EmptyStr Then aList.Add(TmpText);
Ligne := Copy(Ligne, Pos(Separateur, Ligne) + 1, High(Integer));
End;
If Ligne <> EmptyStr Then aList.Add(Ligne);
End;
Utilisation :
procedure TForm1.Button1Click(Sender: TObject);
Var aList : TStringList;
begin
aList := TStringList.Create;
ExtractText(' ', 'Le forum de CodeS SourceS à changé', aList);
Memo1.Lines.Clear;
Memo1.Lines.AddStrings(aList);
aList.Free;
end;
@+
Cirec
17 mai 2006 à 15:36
17 mai 2006 à 12:00
type TWordsContainer = array of string;
function TSplit.Count: Integer;
begin
Result := High(WordsContainer);
end;
function TSplit.Split(Str: string): TWordsContainer;
var i, Previous, Index: Integer;
begin
Previous := 0;
Index := 0;
Str := Str + ' ';
SetLength(Result, 1); // <- tu définis la longueur
for i := 0 to Length(Str) do
begin
if Str[i] = ' ' then
begin
Result[Index] := Copy(Str, Previous + 1, i - Previous - 1);
Index := Index + 1;
SetLength(Result, Index + 1); // <- tu définis la longueur
Previous := i;
end;
end;
end;
Tu peux remplacer la méthode "function TSplit.Count: Integer;", qui devient inutile, par une propriété accessible.
Bonne prog' :p
17 mai 2006 à 11:25
Mais pourquoi vouloir en faire un composant ?
Ton code est un peu redondant :
function TSplit.Split(Str:string):TWordsContainer;
var i,a,b:integer;
begin
a:=0;
b:=0;
str:=str+' ';//On ajoute un espace sinon le dernier mot ne sera pas reconnu car
// la string se fini par un caractère.
for i:=0 to length(str) do
begin
if str[i]=' ' then //Si le char testé est un espace
begin
if Copy(str,a,i-a)=' ' then // On ajoute le mot en se repérant avec la dernière
a:=a+(i-a) // position de fin de mot ( ou de début de string ).
else
begin
result[b]:=Copy(str,a,i-a);
a:=a+(i-a);//On ajoute la position de la fin du dernier mot trouvé.
b:=b+1;//On passe à l'enregistrement suivant.
end;
end;
end;
end;
Sans toucher à l'essentiel (j'ai renommé les variables pour m'y retrouver), et en respectant le concept, j'aurais fait :
function TSplit.Split(Str: string): TWordsContainer;
var i, Previous, Index: Integer;
begin
Previous := 0;
Index := 0;
Str := Str + ' ';
for i := 0 to Length(Str) do
begin
if Str[i] = ' ' then
begin
Result[Index] := Copy(Str, Previous + 1, i - Previous - 1);
Index := Index + 1;
Previous := i;
end;
end;
end;
Bonne prog' :p
17 mai 2006 à 02:55
1 inutile
2 lourd
premierement, les TStrings possede une propriété Delimiter et DelimitedText qui permet de "spliter" les chaines contenues.
deuxiement, regarde la fonction "chainepos" ici dans les codes sources, je pense qu'elle vas t'interressé car elle permet de recuperer n'importe qu'elle partie d'un texte selon un delimiteur qui peut etre aussi bien un caractere qu'un mots ou encore une phrase ...