views:

101

answers:

2
+2  Q: 

ListBox Filtering

I Have A ListBox With 10,000 Items And Many Many Duplicate Items! I Wonna Save It To A File Without Duplicate Items (One Item Instead All Copies!) And I Use This Way:

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 Use Code Above To Detect A Existing Item And Following Procedure To Save It:

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;

But It Takes A Very Very Long Time To Proceed. Is There Any Better And Fast Way? Thanks.

+6  A: 

Try this one

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');
end;
Bharat
Just to add to Bharat's answer: Since Delphi6 TStringList has a CaseSensitive property that controls how strings are evaluated for "duplicate-ness".
Marjan Venema
Do not forget to add a StrList.Free at the end (best after a try .. finally).
mjustin
+1  A: 

Watch out for the infamous CompareString() effect...

Insert 59A, 5-9A, 59-A, -59-A into sorted list 1. The list becomes 59A, -59-A, 5-9A, 59-A and .Find() or .IndexOf() will fail to locate 59-A.

Now insert the same values into sorted list 2, but insert in the order 59A, -59-A, 5-9A, 59-A. The list becomes 59A, 59-A, -59-A, 5-9A. .Find() and .IndexOf() can locate 59-A.

See this blog for more details.

joe snyder