AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language FreePascal Delphi Listbox Items nach Teil String sortieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Listbox Items nach Teil String sortieren

Ein Thema von Zeref Darkmage · begonnen am 22. Dez 2017 · letzter Beitrag vom 1. Jan 2018
 
Solutor

Registriert seit: 24. Dez 2017
15 Beiträge
 
Delphi XE2 Enterprise
 
#10

AW: Delphi Listbox Items nach Teil String sortieren

  Alt 24. Dez 2017, 12:12
Das ist eine häufig benötigte Funktion.
Ich habe mal einen Lösungsvorschlag mit mehreren Varianten und hoffe ich ausreichenden Kommentaren.
Hiermit lassen sich die komplexesten Sortier Varianten erstellen, was ish selbst z.B. dazu verwende eine komplett im Arbeitsspeicher
vorgehaltene Musikdatenbank nach den verschiedensten Kriterien zu sortieren, was bei mehreren 10000 Einträgen rasant schnell funktioniert.

Es werden benötigt:
Eine Form mit, 1 Listbox und 2 Buttons.
Keine besondere Uses Anweisung notwendig.


Also los gehts:
//================================================== ================================================== =================
// Die eigentliche Sortier-Callback Funktion die an TStringlist übergeben werden kann.
// Es werden die eigentliche Liste, sowie zwei Indizes der Liste an die Funktion übergeben.
// Man muss nun die beiden Elemente der Liste miteinander Vergleichen,
// die über die Indizes zur Verfügung gestellt werden.
//
// Dazu muss man also folgendes tun:
// Ist das Element der Liste mit dem Index1 größer als das Element der Liste mit dem Index2,
// so muss man als Rückgabeparameter dieser Funktion eine 1 einsetzen.
//
// Ist das Element der Liste mit dem Index1 kleiner als das Element der Liste mit dem Index2,
// so muss man als Rückgabeparameter dieser Funktion eine -1 einsetzen.
//
// Sind beide Elemente gleich,
// so muss man als Rückgabeparameter dieser Funktion eine 0 einsetzen.
//
// Der eigentliche Sortieralgorithmus ist dann Quicksort, der vom Objekt TStringlist
// auf die hier gezeigte Weise zur Verfügung steht.
// Man kann anstelle der Strings auch in gewohnter Weise auf die Objektliste zugreifen.
// z.B. TIrgendetwas(List.Objects[index1])
//
// Ich habe hier beim Vergleichen die ausführliche Schreibweise der If Anweisungen gewählt.
// Bei einem Einfachen Vergleich ist das zwar nicht nötig, doch bei Erweiterungen bietet
// die Variante mit dem "Exit" in den jeweiligen Zweigen vielfältige Möglichkeiten um
// z.B. verschachtelt zu sortieren. (Wie man es z.b.von Excel kennt - Erst nach Spalte A dann nach Spalte C.... usw.)
//================================================== ================================================== =================


//================================================== ================================================== =================
// Variante 1
// Die Führenden Ziffern des Strings als Integer interpretieren und danach sortieren, wie es eigentlich snnvoll ist.
//================================================== ================================================== =================
Function MySortByNumbersAsValue(list:TStringlist;Index1:Int eger;Index2:Integer):Integer;
Var A,B:Integer;
begin
Result:=0;//Defaultrückgabewert auf 0 setzen.
a:=StrToInt(Copy(list[index1],1,Pos(#32,(list[index1]))-1));
b:=StrToInt(Copy(list[index2],1,Pos(#32,(list[index2]))-1));
if A>B then
begin
Result:=1;
Exit;
end;
if A<B then
begin
Result:=-1;
Exit;
end;
end;

//================================================== ================================================== =================
// Variante 2
// Einfach die Strings sortieren wie sie sind, wie es z.b. der Explorer mit Dateinamen macht, was aber nicht immer schön ist.
//================================================== ================================================== =================
Function MySortByFirstChars(list:TStringlist;Index1:Integer ;Index2:Integer):Integer;
Var A,B:String;
begin
Result:=0;
a:=list[index1];
b:=list[index2];
if A>B then
begin
Result:=1;
Exit;
end;
if A<B then
begin
Result:=-1;
Exit;
end;
end;

//================================================== ================================================== =================
// Aufruf - Sortieren der Liste nach Nummern
// Die wesentliche Zeile ist die mit "CustomSort"
//================================================== ================================================== =================
procedure TForm1.Button1Click(Sender: TObject);
Var l:Tstringlist;
begin
l:=TStringlist.Create;//Hilfsliste erzeugen
Listbox1.Items.BeginUpdate;//Listbox Zeichnen einfrieren
l.Assign(Listbox1.items);//Inhalt der Listbox in die Hilfsliste kopieren
l.CustomSort(MySortByNumbersAsValue);//Hilfsliste sortieren, wobei die führenden ziffern in Zahlen umgewandelt wurden.
Listbox1.Items.Assign(L);//Hilfsliste zurück in die Listbox kopieren
l.free;//Hilfsliste wieder freigeben
Listbox1.Items.EndUpdate;//Listbox Zeichnen wieder freigeben
end;

//================================================== ================================================== =================
// Aufruf - Sortieren der Liste nach dem kompletten String - also ganz normal aber unelegant.
// Die wesentliche Zeile ist die mit "CustomSort"
//================================================== ================================================== =================
procedure TForm1.Button2Click(Sender: TObject);
Var l:Tstringlist;
begin
l:=TStringlist.Create;//Hilfsliste erzeugen
Listbox1.Items.BeginUpdate;//Listbox Zeichnen einfrieren
l.Assign(Listbox1.items);//Inhalt der Listbox in die Hilfsliste kopieren
l.CustomSort(MySortByFirstChars);//Hilfsliste einfach nach Zeichen sortieren wie in einem Telefonbuch
Listbox1.Items.Assign(L);//Hilfsliste zurück in die Listbox kopieren
l.free;//Hilfsliste wieder freigeben
Listbox1.Items.EndUpdate;//Listbox Zeichnen wieder freigeben
end;


//================================================== ================================================== =================
//Füllen der Listbox mit Zufallswerten für den Test um was zum Spielen zu haben
//================================================== ================================================== =================
procedure TForm1.FormCreate(Sender: TObject);
Var i,j:Byte;
h:string;
begin
Listbox1.Items.BeginUpdate;//Listbox Zeichnen einfrieren
for i:= 1 to 100 do
begin
h:=Inttostr(Random(1000))+' ';
for j:=1 to Random(10)+5 do
begin
h:=h+Char(Random(25)+65);
end;
h:=h+' ';
h:=h+Inttostr(Random(1000))+' ';
for j:=1 to Random(10)+5 do
begin
h:=h+Char(Random(25)+65);
end;
Listbox1.Items.add(h);
end;
Listbox1.Items.EndUpdate;//Listbox Zeichnen wieder freigeben
end;
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz