Le but de cette fonction est de trouver la position (X, Y) d'un mot dans une TStrings (Tmemo, TListBox, TComboBox...)
Cette fonction s'utilise comme la fonction delphi "pos", et le résultat renvoyé est un TPoint.
Remarques:
Les TStrings étant des tableaux de chaînes dont l'indice commence à 0, je renvoie donc 0 si le mot se trouve sur la 1ere ligne, n-1 s'il se trouve sur la ligne n°n, et -1 s'il n'a rien trouvé.
Chaque chaine de la TString est un tableau dont l'indice commence à 1. Je renvoie donc 1 si le mot commence en début de chaine... et 0 si rien n'a été trouvé
Donc X et Y commencent respectivement à 1 et 0 (rien ne vous empêche de modifier ca, si vous voulez que ce soit plus "cohérent", j'ai personnellement préféré respecter la logique Delphi, surtout que les données sont directement utilisables telles qu'elles si on doit retravailler la TStrings)
Je vous propose cette fonction parceque j'en avais besoin et que finalement, j'ai trouvé une facon astucieuse de répondre au problème.
Source / Exemple :
function PosInStrings(Substr: string; s : TStrings) : TPoint;
var SLtemp : TStringList;
p : Integer;
begin
p := Pos(Substr, s.Text);
if p>0 then begin
SLtemp := TStringList.Create;
try
SLtemp.Text := Copy(S.Text, 1, p);
RESULT.Y := SLtemp.Count-1;
RESULT.X := Pos(Substr, s[RESULT.Y]);
finally
SLtemp.Free;
end;
end
else begin
RESULT.X := -1; // TStrings commencent à 0
RESULT.Y := 0; // string commence à 1
end;
end;
Conclusion :
Si vous connaissez une autre manière de faire, n'hésitez pas à m'en faire part.
Et n'hésitez pas à laisser des commentaires...
'(*', '*)', '{', '}' et '//'
Autant dire que la propriété CaseSensitive, je n'y ais pas pensé vu qu'elle ne me servait à rien, et que mon but ici était de donner un exemple sympa, pas de faire un code "universel" ;-)
Pour ceux que ca peut interesser, (encore que les variantes étant tellement faciles à faire par soit-même), j'ai mis sur mon site une version amméliorée (http://originalcompo.free.fr rubrique TRUCS ET ASTUCES)
Cependant, comme la fonction Pos fait la distinction entre majuscules et minuscules, les résultats obtenus pourraient parfois surprendre. Pour éviter cela, je propose le code légèrement modifié utilisant un paramètre supplémentaire CaseSensitive. Ce paramètre est à faux par défaut ce qui fait que tu n'auras même pas à changer ton code par ailleurs dans l'application.
function PosInStrings(const Substr: string; s: TStrings; CaseSensitive: boolean = false): TPoint;
var
SLtemp: TStringList;
p: Integer;
begin
Result.X := -1; // TStrings commencent à 0
Result.Y := 0; // string commence à 1
{ATTENTION : Pos fait la distinction majuscules/minuscules !}
if CaseSensitive then
p := Pos(Substr, s.Text)
else
p := Pos(UpperCase(SubStr), UpperCase(s.Text));
if p > 0 then
begin
SLtemp := TStringList.Create;
try
SLtemp.Text := Copy(S.Text, 1, p);
Result.Y := SLtemp.Count - 1;
if CaseSensitive then
Result.X := Pos(Substr, s[Result.Y])
else
Result.X := Pos(UpperCase(Substr), UpperCase(s[Result.Y]));
finally
SLtemp.Free;
end;
end;
end;
function PosInStrings(Substr: string; s : TStrings) : TPoint;
var save : string;
p : Integer;
begin
save := s.Text;
p := Pos(Substr, save);
if p>0 then begin
s.Text := Copy(Save, 1, p);
RESULT.Y := s.Count-1;
s.Text := save;
RESULT.X := Pos(Substr, s[RESULT.Y]);
end
else begin
RESULT.X := -1; // TStrings commencent à 0
RESULT.Y := 0; // string commence à 1
end;
end;
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.