2010-06-21 18 views
3

J'ai un ListBox avec 10 000 articles et beaucoup de nombreux articles en double! Je Wonna enregistrer dans un fichier sans les éléments en double (un élément plutôt que toutes les copies!) Et je l'utilise de cette façon:Filtrage ListBox

Function TMain.List_ExistsIn(ListBox_NAme: TListBox; EParameter: String): Integer; 
Var 
    i: Integer; 
Begin 
    EParameter := LowerCase(EParameter); 
    Result := -1; 
    For i:=0 To ListBox_Name.Items.Count - 1 Do 
    If EParameter = Lowercase(ListBox_Name.Items[i]) Then Begin 
     Result := i; 
     Break; 
    End; 
End; 

I Utilisez le code ci-dessus pour détecter un élément existant et suite à la procédure pour la sauver:

Procedure TMain.MakeList(ListBox_Name: TListBox; FileName: String); //================ 
Var 
    i: Integer; 
    Temp_ListBox: TListBox; 
Begin 
    Temp_ListBox := TListBox.Create(Main); 
    With Temp_ListBox Do Begin 
    Parent := Main; 
    Clear; 
    For i:=0 To ListBox_Name.Count - 1 Do 
     If Main.List_ExistsIn(Temp_ListBox, ListBox_Name.Items[i]) = -1 Then 
     Items.Add(ListBox_Name.Items[i]); 
    Items.SaveToFile(FileName); 
    Free; 
    End; 
End; 

Mais il faut très très longtemps pour procéder. Yat-il un moyen meilleur et rapide? Merci.

Répondre

7

Essayez celui

procedure TForm1.FormCreate(Sender: TObject); 
var 
    StrList: TStringList; 
    I: Integer; 
begin 
    StrList := TStringList.Create; 
    StrList.Sorted := True; 
    StrList.Duplicates := dupIgnore; 
    StrList.AddStrings(ListBox1.Items); //Your List Box Items 
    StrList.SaveToFile('C:\abc.txt'); 
    StrList.Free; //Cleanup 
end; 
+2

Juste pour ajouter à la réponse de Bharat: Depuis Delphi6 TStringList a une propriété CaseSensitive qui contrôle comment les chaînes sont évaluées pour "duplicate-ness". –

+8

Ne pas oublier d'ajouter un StrList.Free à la fin (meilleur après un essai .. enfin). – mjn

1

Faites attention aux effets CompareString infâme() ...

Insérer 59A, 5-9A, 59A, -59-A dans la liste triée 1. La liste devient 59A, -59-A, 5-9A, 59-A et .Find() ou .IndexOf() échouera à localiser 59-A.

Insérez maintenant les mêmes valeurs dans la liste triée 2, mais insérez dans l'ordre 59A, -59-A, 5-9A, 59-A. La liste devient 59A, 59-A, -59-A, 5-9A. .Find() et .IndexOf() peuvent localiser 59-A.

Voir this blog pour plus de détails.