Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Spezielle Sortierung in der TListbox


Bungo - Di 22.03.05 15:03
Titel: Spezielle Sortierung in der TListbox
Guden erstmal!

Ich müsste in einer Listbox die Daten so ordnen das sie ab dem heutigen Datum geordnet werden.
Also erst den 22.3.05, dann den 23.3.05, jedoch sollte die Jahreszahl keine Rolle spielen!

listbox1.Sorted:=true; funzt ja leider net...

Thx for help schonmal!

MfG Bungo

Moderiert von user profile iconTino: Titel geändert.


delfiphan - Di 22.03.05 15:10

:idea: Wenn du statt einer Listbox eine Listview nehmen würdest, könntest du den Event OnCompare nutzen.


Bungo - Di 22.03.05 15:16

user profile icondelfiphan hat folgendes geschrieben:
:idea: Wenn du statt einer Listbox eine Listview nehmen würdest, könntest du den Event OnCompare nutzen.

Mhhh, hab jetzt grad seit paar Monaten delphi... hab noch nie mit einer Listview gearbeitet!
Und die Listbox ist schon an sehr vielen stellen eingebunden...

Geht das mit dem datum prinzipiell gra nicht, oder ist es nur kompliziert?


Sprint - Di 22.03.05 15:38

user profile iconBungo hat folgendes geschrieben:
Geht das mit dem datum prinzipiell gra nicht, oder ist es nur kompliziert?

Doch natürlich geht das. Du schreibst dir eine eigene Funktion, die den neuen String in die ListBox schreiben soll. In dieser Funktion bestimmst du mit Insert wo der String hin soll. Texte kannst du z.B. mit CompareStr oder CompareText vergleichen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.AddToListBox(ListBox: TListBox; const S: String);
var
  I: Integer;
begin

  with ListBox.Items do
  begin
    for I := 0 to Count - 1 do
    begin
      // Hier kannst du nun selber bestimmen, wie deine Strings
      // verglichen werden sollen
      if CompareText(S, Strings[I]) < 0 then
      begin
        Insert(I, S);
        Exit;
      end;
      // ---
    end;
    Add(S);
  end;

end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
begin

  AddToListBox(ListBox1, 'Test');
  AddToListBox(ListBox1, 'ABC');
  AddToListBox(ListBox1, 'basd');
  AddToListBox(ListBox1, 'aa');

end;


delfiphan - Di 22.03.05 15:51

Wenn die ListBox schon Einträge drin hat, und du diese sortieren willst, würde ich allerdings Quicksort nehmen.
Die Quicksort Routine kannst du aus der Source von TStringList entnehmen. Oder du kannst den Inhalt der ListBox zuerst in eine TStringList kopieren, dort sortieren, und danach wieder zurückkopieren. Das ginge dann etwa so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function MySort(List: TStringList; Index1, Index2: Integer): Integer;
begin
 // Vergleich
end;

Var
 List : TStringList;
begin
 List := TStringList.Create;
 with List do
 try
  Assign(ListBox.Items);
  CustomSort(MySort);
  ListBox.Items.Assign(List);
 finally
  Free;
 end;
end;