2010-07-13 3 views
3

J'utilise une liste pour afficher une liste simple de noms de fichiers. J'ai aussi un composant d'édition qui me permet de rechercher les articles par un simple:Delphi et l'affichage d'un élément de liste de liste

procedure TForm1.Edit1Change(Sender: TObject); 
const 
    indexStart = -1; 
var 
    search : array[0..256] of Char; 
begin 
    if edit1.Text='' then exit; 
    StrPCopy(search, Edit1.Text) ; 
    ListBox1.ItemIndex := ListBox1.Perform(LB_SELECTSTRING, indexStart, LongInt(@search)); 
end; 

Maintenant, est-il un moyen de articles d'affichage « sélective » sur une zone de liste? Ce que je veux dire est que si je recherche un élément qui commence par "bonjour", alors SEULEMENT ceux qui vont bonjour seront affichés, soit en les atténuant que ceux qui ne le font pas ou en rendant visible: = faux tout à fait. Existe-t-il un moyen d'effectuer cela avec une liste déroulante?

merci!

Oh, il est Delphi 7 ...

Répondre

7

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 
+0

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

+0

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

+0

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

1

Ce que vous demandez peut être mis en œuvre en raccordant l'interface API Win32 standard IAutoComplete à un TEdit standard, pas TListBox nécessaire. Il n'est pas trop difficile de raccorder un objet TStrings à IAutoComplete afin qu'il sache quelles chaînes sont disponibles pour la recherche.