Je fais toujours comme ça (et je le fais assez souvent):
J'ai un array of string
ou un TStringList
contenant les éléments zone de liste. Ensuite, dans Edit1Change
, j'efface la propriété Items et n'ajoute que les chaînes qui correspondent au texte dans la zone d'édition.
tableau de chaînes
Si vous travaillez avec un tableau de chaînes, telles que
var
arr: array of string;
qui est initialisé en quelque sorte, comme dans
procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(arr, 3);
arr[0] := 'cat';
arr[1] := 'dog';
arr[2] := 'horse';
end;
vous pouvez alors faire
procedure TForm1.Edit1Change(Sender: TObject);
var
i: Integer;
begin
ListBox1.Items.BeginUpdate;
ListBox1.Items.Clear;
if length(Edit1.Text) = 0 then
for i := 0 to high(arr) do
ListBox1.Items.Add(arr[i])
else
for i := 0 to high(arr) do
if Pos(Edit1.Text, arr[i]) > 0 then
ListBox1.Items.Add(arr[i]);
ListBox1.Items.EndUpdate;
end;
Cela va o N'affichez les chaînes du tableau que contiennentEdit1.Text
; la chaîne n'a pas besoin commencer avec Edit1.Text
. Pour ce faire, remplacez
Pos(Edit1.Text, arr[i]) > 0
avec
Pos(Edit1.Text, arr[i]) = 1
TStringList
Dans le cas d'un TStringList
, comme dans
var
arr: TStringList;
et
procedure TForm1.FormCreate(Sender: TObject);
begin
arr := TStringList.Create;
arr.Add('cat');
arr.Add('dog');
arr.Add('horse');
end;
vous pouvez faire
procedure TForm1.Edit1Change(Sender: TObject);
var
i: Integer;
begin
ListBox1.Items.BeginUpdate;
ListBox1.Items.Clear;
if length(Edit1.Text) = 0 then
ListBox1.Items.AddStrings(arr)
else
for i := 0 to arr.Count - 1 do
if Pos(Edit1.Text, arr[i]) = 1 then
ListBox1.Items.Add(arr[i]);
ListBox1.Items.EndUpdate;
end;
Case-sensibilité
Le code ci-dessus utilise la correspondance sensible à la casse, de sorte que "bo" ne correspond pas à "Boston", par exemple.Pour rendre le code pas sensible à la casse, écrire
if Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(arr[i])) > 0 then
au lieu de
if Pos(Edit1.Text, arr[i]) > 0 then
qui pourrait fonctionner. le problème que je vois est que je ne sais pas combien d'éléments il y a dans la listbox. Ce n'est pas réparé. il sera difficile de définir la taille du tableau avec SetLength. à moins que ... puis-je utiliser SetLength plus tard pour réinitialiser la longueur du tableau? ou il est préférable d'utiliser un TStringList? – Uri
La plupart des gens travaillent toujours avec le 'TStringList', mais personnellement, je veux tout faire manuellement, donc je travaille toujours avec' array of string'. Vous pouvez modifier la longueur d'un tableau dynamique à tout moment au moyen de 'SetLength'. Si vous augmentez la longueur, les anciens éléments seront toujours là. –
hmmm. J'essaie avec une liste de diffusion. Quand j'ai essayé de chercher tous les objets disparaissent. Oh mon dieu, je le chargeais mal ... mais ça ne marche pas. J'ai un 2 fichiers appelés: livre 1 et livre 2. quand je recherche livre il trouve le "bo" d'un fichier appelé "places dans boston" mais c'est – Uri