AW: Delphi Listbox Items nach Teil String sortieren
Sorry! Das mit dem Quellcode Einfügen hab ich noch nicht so richtig drauf.
Bin noch neu im Forum. |
AW: Delphi Listbox Items nach Teil String sortieren
So das Ganze noch einmal:
Code:
//=====================================================================================================================
// Die eigentliche Sortier-Callback Funktion // Hier werden die eigentliche Liste, sowie zwei Indizes der Liste zur Verfügung gestellt. // Man muss nun die beiden Elemente der Liste miteinander Vergleichen, // die über die Indizes zur Verfügung stehen. // // Ist das Element der Liste mit dem Index1 größer als das Element der Liste mit dem Index2, // so muss man als Rückgabe Parameter 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ückgabe Parameter dieser Funktion eine -1 einsetzen. // // Sind beide Elemente gleich, // so muss man als Rückgabe Parameter dieser Funktion eine 0 einsetzen. // // Der eigentliche Sortieralgorithmus ist Quicksort, der vom Objekt TStringlist, // auf die hier gezeigte Weise zur Verfügung steht. // Man kann sogar 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.) //===================================================================================================================== // Die Führenden Ziffern des Strings als Integer interpretieren und danach sortieren, wie es eigentlich snnvoll ist. Function MySortByNumbersAsValue(list:TStringlist;Index1:Integer;Index2:Integer):Integer; Var A,B:Integer; begin Result:=0; 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; // Einfach die Strings sortieren wie sie sind, wie es z.b. der Explorer mit Dateinamen macht. 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; //===================================================================================================================== //Sortieren der Liste nach Nummern //===================================================================================================================== 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; //===================================================================================================================== //Füllen der Listbox mit Zufallswerten für den Test //===================================================================================================================== 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; 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; |
AW: Delphi Listbox Items nach Teil String sortieren
Moin...:P
Da gehst du in erweiteren Beitrag bearbeiten, markierst den Quelltext und drückst dem Button mit dem Helm...8-) Code ist für z.B. XML gedacht. Der Helm ist für Delphi Quelltext... |
AW: Delphi Listbox Items nach Teil String sortieren
Ein paar Erläuterungen zu meiner Arbeitsweise:
Listbox Co. verwende ich in der Regel nur zur Anzeige und dann mit OwnerDraw. Meine Daten selbst halte ich immer in Stringlisten vor, wobei ich hier maist die Objektliste verwende. Aus diese Weise lassen sich einzelne Datenelemente einfach und vor Allem schnell suchen, sortieren, und manipulieren. Ergänzungen an der Struktur, dem Verhalten und der Visualisierung sind so viel einfacher und flexibler. Einziger Nachteil ist der Aufwand beim Erstellen der Grundstruktur. Dieser Nachteil ist bereits nach kurzer Zeit ausgeglichen. |
AW: Delphi Listbox Items nach Teil String sortieren
Hi da bin ich wider. Nach dem alles super funktioniert hat bin ich wider da und knüpfe an diesem Beitrag eine Frage an und hoffe das sie gelesen wird ^^ . Dachte dass ich kein neuen Thread
aufmachen muss wenn die Frage zum Programm gehört. Falls es doch erwünscht ist mache ich es natürlich ^^ folgendes: ich möchte mit Listbox1.items.LoadFromFile(); mehrere txt datein einlesen, 71524 Tobi 7623 Müller 292748 Max 872 Müller 89237 Lucas 8723 Müller diese Datein beinhalten alle Zeilenweise die gleiche Syntax, soweit kein Problem für mich wenn ich im Quelltext bei LoadFromFile den Pfad explizit angebe. Allerding sind das datein welche zwar alles z.b Liste.txt heißen allerdings da es mehere sind würden sie bei mir entweder umbenannt werden damit sie im selben Pfad liegen können oder bekommen Liste(1).txt,Liste(2).txt... als namen. In jedem fall würde es so nicht im Quelltext drin stehen. Heißt ich brauche eine Möglichkeit wie ich flexibel die txt datein laden kann . hat jemand für mich deswegen vllt ein paar stichworte nach dem ich im Web suchen muss :D Lg Zeref |
AW: Delphi Listbox Items nach Teil String sortieren
Zitat:
Zitat:
|
AW: Delphi Listbox Items nach Teil String sortieren
wenn ich sage:"In jedem fall würde es so nicht im Quelltext drin stehen. Heißt ich brauche eine Möglichkeit wie ich flexibel die txt datein laden kann ."
ist gemeint, wie auch sonst, dass ich eine Möglichkeit brauche wie ich sie flexibel laden kann und wenn ich sage das ich sie flexibel laden möchte und hier aber steht:" soweit kein Problem für mich wenn ich im Quelltext bei LoadFromFile den Pfad explizit angebe." ist mit explizit gemeint, wie auch sonst, dass es eben nicht flexibel ist und ich nicht weiterkomme lg |
AW: Delphi Listbox Items nach Teil String sortieren
Nehmen wir an, dass die Dateien mit beliebigen Namen alle in einem Verzeichnis liegen, dann könntest Du recht einfach mit FindFirst arbeiten.
Oder wäre ein Dialog eine Alternative? Ein Dateiauswahldialog, den so konfigurieren, dass mehrere Dateien ausgewählt werden können und diese dann alle laden. (Klingt komplizierter, als es ist.) Einen Dialog nutzen, der "nur" zur Auswahl eines Verzeichnisses dient und dann im ausgewählten Verzeichnis alle Dateien lesen ... Mit LoadFromFile kann man aber nicht mehrere Dateien gleichzeitig laden, sondern immer nur eine. Aber: Items ist vom Typ TStrings und hat die Methode AddStrings. Damit kann man den Inhalt einer Stringliste zu den vorhandene Items hinzufügen. Grob ungefähr sowas (ungetestet hingedaddelt):
Delphi-Quellcode:
var
sl : TStringList; sr : TSearchRec; begin sl := TStringList.Create; Listbox1.Items.Clear; // Statt Liste*.txt irgendeinen Namensplatzhalter nach eigenen Wünschen. // Ggfls. auch noch 'nen Pfad mit angeben. If FindFirst('Liste*.txt',faAnyFile,sr) = 0 then begin Repeat sl.LoadFromFile(sr.Name); Listbox1.Items.AddStrings(sl); until FindNext(sr) <> 0; end; FindClose(sr); sl.Free; end; |
AW: Delphi Listbox Items nach Teil String sortieren
Cool also funktioniert hat es was echt super ist, lädt praktischer weise Zeilenweise xD
bloß noch die Frage es lädt nur nach der angegebenen Datei im Quellcode und nimmt so gesehen nicht die nächste lg Zeref |
AW: Delphi Listbox Items nach Teil String sortieren
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz