Trouver la position (ligne, et "colonne") d'un mot dans un tstrings

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 514 fois - Téléchargée 32 fois

Contenu du snippet

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...

A voir également

Ajouter un commentaire

Commentaires

Messages postés
65
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
9 octobre 2007

J'ai construit initialement cette fonction pour chercher les commenatires dans des fichiers delphi (.pas), c'est à dire
'(*', '*)', '{', '}' 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)
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
28
La façon de faire est bonne.
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;
Messages postés
65
Date d'inscription
dimanche 3 avril 2005
Statut
Membre
Dernière intervention
9 octobre 2007

variante: (évite de construire un objet)

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.