String Search-Function in Listbox [Résolu]

Signaler
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
-
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
-
Salut

j ai teste cet code. sa marche mais il y a un Problème. le code peut trouver un seul String dans chaque ligne
Example: je voudrais charcher sur "a" (Position) dans un ListBox :

le code ne peut pas trouver toutes les Strings "a" dans chaque Ligne !

10 réponses

Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Le code est simplifié dans ce cas-là :

var
 I, J: Integer;
 S, S2: String;
begin
 ListBox2.Items.BeginUpdate;
 try
 ListBox2.Items.Clear; // vider la liste avant
 S2 := Uppercase(Edit1.Text); // mettre le texte à rechercher ici
 for I := 0 to ListBox1.Items.Count - 1 do
  begin
   S := Uppercase(ListBox1.Items.Strings[I]);
   // on parcourt la ligne actuelle en cherchant des occurrences de S2
   for J := 1 to Length(S) - Length(S2) + 1 do
    if Copy(S, J, Length(S2)) = S2 then ListBox2.Items.Add(Format('%d, %d', [I, J]));
  end;
 finally
  ListBox2.Items.EndUpdate;
 end;
end;


Devrait marcher mais pas testé. C'est plus logique en fin de compte. Comme toujours remplacer I par I + 1 dans le Format si les lignes doivent commencer à 1 et pas à 0. Mais tu comprends au moins ou tu ne fais que copier ce que je te donnes ?

Cordialement, Bacterius !
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011

sorry. voila le code :
var
          i,p : Integer;
begin
          for i:=0 to ListBox1.Items.Count-1 do begin
              p := Pos(UpperCase(Edit1.Text),UpperCase(ListBox1.Items[i]));

              if p <> 0 then
                 ListBox2.Items.Add(Format('%d,%d',[i+1,p]));
          end;
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Salut,
normal il s'arrête au premier "a" rencontré pour chaque ligne ...

var
 I, J, P: Integer;
 S, S2: String;
begin
 S2 := Uppercase(Edit1.Text); // mettre le texte à rechercher ici
 for I := 0 to ListBox1.Items.Count - 1 do
  begin
   P := 0;
   S := Uppercase(ListBox1.Items.Strings[I]);
   // on parcourt la ligne actuelle en cherchant des occurrences de S2
   for J := 1 to Length(S) - Length(S2) + 1 do
    if Copy(S, J, Length(S2)) = S2 then Inc(P);

   // on affiche leur nombre si il y en a
   if P > 0 then ListBox2.Items.Add(Format('%d, %d',[I + 1, P]));
  end;
end;


Ca devrait marcher à priori, testé et approuvé.

Cordialement, Bacterius !
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011

sa ne marche pas correct
voila le test:
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Je vois pas le problème, il marche comme prévu, qu'est ce qui ne va pas ? Développe ton problème

Cordialement, Bacterius !
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011

le problem je suis debutant
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Je crois avoir compris tu veux la position pas le nombre. Essaye peut-être ceci :

var
 I, J: Integer;
 S, S2, R: String;
begin
 S2 := Uppercase(Edit1.Text); // mettre le texte à rechercher ici
 for I := 0 to ListBox1.Items.Count - 1 do
  begin
   R := IntToStr(I) + ', '; // on met le numéro de la ligne d'abord
   S := Uppercase(ListBox1.Items.Strings[I]);
   // on parcourt la ligne actuelle en cherchant des occurrences de S2
   for J := 1 to Length(S) - Length(S2) + 1 do
    if Copy(S, J, Length(S2)) = S2 then R := R + IntToStr(J) + ', ';

   // on affiche leur nombre si il y en a
   ListBox2.Items.Add(Copy(R, 1, Length(R) - 2));
  end;
end;


Voici le résultat :



Cordialement, Bacterius !
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
8
Corriger IntToStr(I) en IntToStr(I + 1) si tu veux que le numéro de la ligne commence à 1 et pas à 0.

Cordialement, Bacterius !
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011

sa marche merci
je voudrais chaqu'un dans Ligne
alors:
0,1
0,5
...
et pas
0,1,5

Comment changer le code ?
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011

sa marche tres bien

merci :)