String Search-Function in Listbox [Résolu]

Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
- - Dernière réponse : sarssor
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
- 20 févr. 2011 à 21:32
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 !
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
3
Merci
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 !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 131 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Bacterius
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
0
Merci
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;
Commenter la réponse de sarssor
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
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 !
Commenter la réponse de Bacterius
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
0
Merci
sa ne marche pas correct
voila le test:
Commenter la réponse de sarssor
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
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 !
Commenter la réponse de Bacterius
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
0
Merci
le problem je suis debutant
Commenter la réponse de sarssor
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
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 !
Commenter la réponse de Bacterius
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
5
0
Merci
Corriger IntToStr(I) en IntToStr(I + 1) si tu veux que le numéro de la ligne commence à 1 et pas à 0.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
0
Merci
sa marche merci
je voudrais chaqu'un dans Ligne
alors:
0,1
0,5
...
et pas
0,1,5

Comment changer le code ?
Commenter la réponse de sarssor
Messages postés
63
Date d'inscription
dimanche 22 juillet 2007
Statut
Membre
Dernière intervention
28 avril 2011
0
Merci
sa marche tres bien

merci :)
Commenter la réponse de sarssor