Composant de split

Soyez le premier à donner votre avis sur cette source.

Vue 5 259 fois - Téléchargée 8 758 fois

Description

Tout petit composant de split.

Conclusion :


On peut stocker au maximum 255 mot ( J'ai fixé cette limite, car je ne connais pas les capacités d'une array ).

Exemple d'utilisation du composant :

procedure TForm1.Button1Click(Sender: TObject);
var Split1:TSplit; i:integer;
begin
Split1:=TSplit.Create(Form1);
Split1.WordsContainer:=Split1.Split(edit1.text);
for i:=0 to Split1.Count do
showmessage(Split1.WordsContainer[i]);
end;

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Salut,

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
Harvester_
Messages postés
36
Date d'inscription
vendredi 31 décembre 2004
Statut
Membre
Dernière intervention
8 juillet 2007

Merci bien, je ne me sert pas souvent des array et je ne connaissais pas cette petite "technique" toute bête !
japee
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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és
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
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és
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
27
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 ...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.