begin process at 2012 05 27 20:41:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Trucs & Astuces

 > TROUVER LA POSITION (LIGNE, ET "COLONNE") D'UN MOT DANS UN TSTRINGS

TROUVER LA POSITION (LIGNE, ET "COLONNE") D'UN MOT DANS UN TSTRINGS


 Description

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

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


 Sources du même auteur

Source avec Zip Source avec une capture CRÉER DES MENUS N'IMPORTE OÙ SUR LA FICHE
Source avec Zip ASTUCE/COMPOSANT POUR ACCÉLERER LA CRÉATION DE COMPOSANTS VI...

 Sources de la même categorie

Source avec Zip 1 MILLION DE PARTICULES ACCESSIBLES EN MOINS DE 100 MS... par blueperfect
Source avec Zip TRI ET PRÉSENTATION DE LISTBOX par Toidil
Source avec Zip Source avec une capture LE TRI PAR CASIERS par pseudo3
Source avec Zip DICTIONNAIRE WORD DANS UN RICHEDIT par H60
Source avec Zip TRIER DU GREC DANS UNE APPLI EN CODE LOCAL FRANÇAIS. par fricot

 Sources en rapport avec celle ci

Source avec Zip MÉMORISE SIMPLEMENT LA POSITION ET LA TAILLE DE VOS FENÊTRES par RURUInc
Source avec Zip Source avec une capture TRI DANS LISTBOX/COMBOBOX (TSTRINGS) par MAURICIO
Source avec Zip FILTRAGE MULTIPLE D'UNE BASE DE DONNEES A PLUSIEURS COLONNES... par mihoubi3333
Source avec Zip Source avec une capture SÉLECTIONNNER, DÉPLACER, ÉTIRER DES LIGNES DANS UN CANVAS. par Caribensila
Source avec Zip EXEMPLE D'EDITEUR DE FENÊTRE (CONTENANT DES COMPOSANTS) : I... par assemple

Commentaires et avis

Commentaire de originalcompo le 30/09/2005 01:42:50

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;

Commentaire de Delphiprog le 02/10/2005 10:07:54 administrateur CS

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;

Commentaire de originalcompo le 22/10/2005 15:50:56

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)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

STRINGGRID [ par selma-elec ] Comment peut on faire dans un STRINGGRID en mode selection de ligne (gorowselect = true) avec une ligne fixe (fixedrows = 1) pour executer du code lor Retour a la ligne dans un titre de colonne [ par LolHolde ] Salut, Je voudrais pouvoir revenir a la ligne dans un titre de colonne d'un TBGrid. J'ai essaye les solutions donnees ici  precedement http:// Problème d'index [ par blinkseb ] Bonjour à tous, Je possède sur une form différent TImage, alignés en lignes et en colonnes. En sachant que les images sont r TListView et selection ... [ par ptitmanu ] Bonjour,J'ai une appli qui log des evenements. Pour chaque log je dispose d'informations comme l'heure, la date, le type de message, le contenu... Je Ajouter une ligne à la fin d'un dbgrid pour afficher les totaux des elements d'une colonne [ par kam81 ] Bonjour,Est il possible d'ajouter une ligne  à la fin d'un dbgrid qui sera semblable à une colonne mais de forme horizontale pour y aff Récupération valeur de la cellule de la ligne 3 de la colonne 4 d'un ListView [ par Mouchty8585 ] Bonjour a tous, je réalise un petit fichier Excel dans lequel j'ai une list view composé de 5 colonnes et 10 Ligne. J'aimerai quand j'appuie sur un b enregistrer les information une fois la ligne de la table acces selectionné [ par pratrick ] Bonjour J'ai actuellement une table access je localise la ligne dont je recherche la chaine de caractère [code=pas]adotable2.Locate('commune',DBEdit3. générer ligne de commande d'un signal video [ par broqua52 ] Bonsoir a tous, voilà j'aurais besoin d'aides j'ai un mot de 6bits (100000) a écrire pour un PIC30F mais je n'ai pas la moindre idée dans la façon de TListView avec 1ère colonne fixe [ par ch16089 ] Je recherche un composant dérivé de TListView et permettant d'affichier en permanence la 1ère colonne (l'utlisation de la barre de défilement horizont Généré un fichier txt [ par zer_you_19 ] Bonjour J’ai un fichier texte avec un format bien défini en nombre de caractères et d’espace dans chaque ligne, et j’ai besoin de g


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,780 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales