SOUS-CHAINES

Signaler
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
-
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/23762-sous-chaines

Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
14
voici la fonction Parse de StringManager :

function TStringManager.Parse(const DelimStr : String; var s : String; IgnoreDelimAtStart : Boolean = True): String;
var p : Integer;
begin
p := Pos(DelimStr, s);
if p=1 then if IgnoreDelimAtStart then
begin
s := System.Copy(s, p+Length(DelimStr), Length(s));
p := Pos(DelimStr, s);
end;
if p=0 then
begin
Result := s;
s := '';
Exit;
end;
Result := System.Copy(s, 1, p-1);
s := System.Copy(s, p+Length(DelimStr), Length(s));
end;

puis aussi avec un CharSet :

function TStringManager.Parse(const aSet: TCharSet; var s: String; IgnoreDelimAtStart : Boolean = True): String;
var p : Integer;
begin
p := Pos(aSet, s);
if p=1 then if IgnoreDelimAtStart then
begin
s := System.Copy(s, p+1, Length(s));
p := Pos(aSet, s);
end;
if p=0 then
begin
Result := s;
s := '';
Exit;
end;
Result := System.Copy(s, 1, p-1);
s := System.Copy(s, p+1, Length(s));
end;

et pour finir direct dans eun TStringList :

procedure TStringManager.Parse(const DelimStr : String; s : String; const aList : TStrings; MopAlso : Boolean True; IgnoreDelimAtStart : Boolean True);
begin
if aList=nil then DoRaise('aList=nil','Parse');
while s<>'' do
begin
if MopAlso
then aList.Add(Mop(Parse(DelimStr, s, IgnoreDelimAtStart)))
else aList.Add(Parse(DelimStr, s, IgnoreDelimAtStart));
end;
end;

StrMan.pas dispo ici : http://diabloporc.Free.fr/delphi/strman/
Moi je pensait plus du cote de Mauricio avec les fonctions recursives voila ce que cela donne :

_______________________
procedure SeparerChaine(Chaine, Sep : string; Dans : TStrings);
var
Position : Integer;
begin
Position:=Pos(Sep,Chaine);
Dans.Add(Copy(Chaine,0,Position-1));
if Position <> 0 then
SeparerChaine(RightStr(Chaine,Length(Chaine)-Position),Sep,Dans)
else
Dans.Add(Chaine);
end;
_______________________

Voia c'est tres simple, très rapide et cela marche.

Apres si on veut compter le nombre de sous chaines, on peut mettre une variable comme Kenavo a fait et l'incrementer a chaque fois.
Mais il est bien plus intelligent d'utiliser la propriete Count du TStrings ou High(Result) pour la version de Kenavo.
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
On pourrait biensûr, cela va de soit, écrire une autre fonction pour changer les valeurs des sous-chaines mais bon, si qq' un a un idée...
Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Il serait plus intérssant (mais je ne sait pas comment faire) d' écrire une fonction dans le genre:

function STRING_SUBSTRING(Str: String; Separateur: Char; Position: Integer): String;

Exemple:
var SousChaine: String;
begin
SousChaine := STRING_SUBSTRING(maChaine, ';', 3);

Jusque là ça va mais moi, j' ai envie de pouvoir attribuer la valeur que je veux et à la position que je veux:
Exemple:
STRING_SUBSTRING(maChaine, ';', 3) := 'nouvelle valeur!!!';

Si vous savez comment faire...