Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Delphi Listbox Items nach Teil String sortieren (https://www.delphipraxis.net/194697-delphi-listbox-items-nach-teil-string-sortieren.html)

Zeref Darkmage 22. Dez 2017 19:55

Delphi-Version: 5

Delphi Listbox Items nach Teil String sortieren
 
Hey, ich bin auf der Suche nach der Lösung :D Ich habe mir in der Praxis die anscheinend zu gebrauchenden Befehle zusammengesucht, jedoch scheitere ich an der Zusammenführung selbst.

Das Problem in dessen Besitz ich bin ist, dass ich gern in der Form bzw. Oberfläche in einem Editfenster einen String eingeben möchte, soweit kein Problem(Syntax : Zahl Name Zahl Name)

diesen in eine Listbox schreibe, auch noch kein Problem, und dann nach der jeweils ersten Zahl sortiere, heißt, das es die gesamte liste abarbeiten soll, jeweils nur die erste Zahl der Syntax

benutzen soll, dann verschiebt, (nach oben der unten egal) um dann eine sortierte Liste zu haben ist die nach eben der ersten Zahl sortiert wurde. Jedoch den ganzen String in der Ausgabe

beinhaltet.

Die Zahlen sollen natürlich mir < oder > verglichen werden.



for i:=1 to Listbox1.items.count -1 do begin // hier soll es schonmal die ganze Liste in Agriff nehmen

for x:= 1 to length(listbox1.items[x]) do begin // hier jede einzelne Zeile bzw. item

if pos(' ',Listbox1.items[x]) then begin // hier da die erste Frage, wo ist der Fehler? - Sobald ein Leerzeichen kommt soll die Schleife beginnen


switch1:=copy(pos(' ',Listbox1.items[x])); // Es soll der Teilstring mit dem darunter liegenden String, welcher auch in einem Teilstring ist(die erste Zahl) verglichen werden


end;

end;

end;


- wie kann ich den Teilstring vergleichen, aber am Ende in der Ausgabe den ursprünglichen String eben nur nach der ersten Zahl sortiert bekommen?

Das Sortieren soll mit einem Knopfdruck auf dem Button "sortieren" passieren

die Befehle die ich einbauen wollen würde sind, pos,copy,split

ps: bin neu hoffe das es in die richtige Abteilung gepostet wurde, wenn nicht bitte ich um Entschuldigung ^^

LTE5 22. Dez 2017 20:07

AW: Delphi Listbox Items nach Teil String sortieren
 
Ich habe an folgender Stelle aufgehört zu lesen.
Sicher, dass da [x] stehen soll und nicht [i]?

Delphi-Quellcode:
for x:= 1 to length(listbox1.items[x]) do begin // hier jede einzelne Zeile bzw. item


Zitat:

ps: bin neu hoffe das es in die richtige Abteilung gepostet wurde
Hobby- oder Schulprojekt? :P

Zeref Darkmage 22. Dez 2017 20:10

AW: Delphi Listbox Items nach Teil String sortieren
 
nja es geht mir bei [x] oder [i] darum das es symbolisiert, hatte beides probiert. beides ging nicht ^^

hobby projekt was wenn es nicht weiter geht mit der hilfe des lehrers enden muss ^^

LTE5 22. Dez 2017 20:12

AW: Delphi Listbox Items nach Teil String sortieren
 
Zitat:

beides ging nicht ^^
Dann hast du aber den Sinn und/oder die Arbeitsweise einer verschachtelten Schleife noch nicht verstanden wenn du nicht weißt, ob da i oder x stehen muss.

Ghostwalker 23. Dez 2017 13:20

AW: Delphi Listbox Items nach Teil String sortieren
 
Zitat:

Zitat von Zeref Darkmage (Beitrag 1389520)
for i:=1 to Listbox1.items.count -1 do begin // hier soll es schonmal die ganze Liste in Agriff nehmen

Hier ist schonmal der erste Fehler drinn. Stringlisten (wie hier in der Listbox) fangen bei 0 an, nicht bei 1.

Korrekt währe also:

Delphi-Quellcode:
For i := 0 to Listbox1.items.count-1 do begin
Damit enthält i den index auf die Zeile.

[QUOTE]

for x:= 1 to length(listbox1.items[x]) do begin // hier jede einzelne Zeile bzw. item
[/QUOITE]

Hier soll wohl jedes einzelne ZEICHEN einer Zeile durchlaufen werden. Damit ist aber das x bei listbox1.items falsch. Hier müsste statt dessen i stehen, um die jeweilige Zeile zu referenzieren.

Korrekt währ also

Delphi-Quellcode:
for x := 1 to length(listbox1.items[i]) do begin
Damit hast in i den index auf die Zeile und in x den index des Zeichens.


Beim Rest muss ich leider passen, da sich mir noch nicht ganz erschlossen hat, was den eigentlich gemacht werdeen soll.

Vielleicht währe eine kleine Erklärung mit Datenbeispiel hilfreich :)

Luckie 23. Dez 2017 13:56

AW: Delphi Listbox Items nach Teil String sortieren
 
Ganz andere Idee. Wäre da ein Listview mit mehreren Spalten nicht einfacher? Und dann eben die erste Spalte sortieren.

Zeref Darkmage 23. Dez 2017 15:11

AW: Delphi Listbox Items nach Teil String sortieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang ist die Datei, danke schonmal für die berichtigung der fehler, bin noch bluts Anfänger :D

Es soll mit dem klick auf "sortieren" die Listbox nach der jeweils ersten Zahl im string vergleichen und danach verscheiben..

Bsp
71524 Tobi 7623 Müller
892748 Max 872 Müller
89237 Lucas 8723 Müller

hier wie gesagt die erste Zahl mit der jeweils anderen Zahl vergleichen um zu entscheiden was gerückt werden soll, danach aber wie gesagt den ganzen String sortiert anzeigen.

Das alles solang bis die kleinste Zahl unten steht und die größte oben

das weiter und zurück fügt es bzw. entfernt es aus der Listbox

lg

LTE5 23. Dez 2017 16:03

AW: Delphi Listbox Items nach Teil String sortieren
 
Zitat:

Das alles solang bis die kleinste Zahl unten steht und die größte oben
Guck dir dafür mal, auch als kleine Übung, BubbleSort an
https://de.wikipedia.org/wiki/Bubblesort

Amateurprofi 24. Dez 2017 01:40

AW: Delphi Listbox Items nach Teil String sortieren
 
@Zeref:
Ein Weihnachtsgeschenk für dich:

Delphi-Quellcode:
PROCEDURE SortListBoxBubbleSort(List:TStrings; Dsc:Boolean);
FUNCTION Compare(const A,B:String):Integer;
begin
   Result:=Pos(' ',A)-Pos(' ',B);
   if Result=0 then Result:=CompareStr(A,B);
   if Dsc then Result:=-Result;
end;
var I,First,Last:Integer; Sorted:Boolean; H:String;
begin
   List.BeginUpdate;
   First:=0;
   Last:=List.Count-1;
   repeat
      Dec(Last);
      Sorted:=true;
      for I:=First to Last do
         if Compare(List[I],List[I+1])>0 then begin
            Sorted:=false;
            H:=List[I];
            List[I]:=List[I+1];
            List[I+1]:=H;
         end;
   until Sorted;
   List.EndUpdate;
end;
Aufruf:
SortListBoxBubbleSort(ListBox1.Items,True);

Der zweite Parameter gibt an, ob die Liste aufsteigend (False) oder absteigend sortiert wird (True).

Achtung:
Das funktioniert nur, wenn alle Einträge mit einer vorzeichenlosen Ganzzahl ohne führende 0 beginnen und dieser Zahl ein Blank folgt.
Die Compare Funktion gibt 0 zurück wenn A = B ist, einen positiven Wert wenn A > B ist und einen negativen Wert, wenn A < B ist.


Wenn die Liste nur wenig Einträge hat (200 oder so) dann sollte die obige Version OK sein.
Bei mehr Einträgen hier die Quicksort-Version:

Delphi-Quellcode:
PROCEDURE SortListBoxQuickSort(List:TStrings; Dsc:Boolean);
FUNCTION Compare(const A,B:String):Integer;
begin
   Result:=Pos(' ',A)-Pos(' ',B);
   if Result=0 then Result:=CompareStr(A,B);
   if Dsc then Result:=-Result;
end;
var M,H:String;
PROCEDURE QSort(First,Last:Integer);
var I,J:Integer;
begin
   I:=First;
   J:=Last;
   M:=List[(First+Last) shr 1];
   repeat
      while Compare(List[I],M)<0 do Inc(I);
      while Compare(List[J],M)>0 do Dec(J);
      if I<=J then begin
         H:=List[I];
         List[I]:=List[J];
         List[J]:=H;
         Inc(I);
         Dec(J);
      end;
   until i>j;
   if J>First then QSort(First,J);
   if I<Last then QSort(I,Last);
end;
begin
   List.BeginUpdate;
   QSort(0,List.Count-1);
   List.EndUpdate;
end;

Solutor 24. Dez 2017 12:12

AW: Delphi Listbox Items nach Teil String sortieren
 
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;

Solutor 24. Dez 2017 12:14

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.

Solutor 24. Dez 2017 12:16

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;

haentschman 24. Dez 2017 12:17

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...

Solutor 24. Dez 2017 12:23

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.

Zeref Darkmage 31. Dez 2017 16:01

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

LTE5 31. Dez 2017 16:07

AW: Delphi Listbox Items nach Teil String sortieren
 
Zitat:

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 .
Du hast dir deine Antwort schon selber gegeben
Zitat:

soweit kein Problem für mich wenn ich im Quelltext bei LoadFromFile den Pfad explizit angebe.

Zeref Darkmage 31. Dez 2017 16:34

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

Delphi.Narium 31. Dez 2017 16:36

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;

Zeref Darkmage 31. Dez 2017 16:52

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

LTE5 31. Dez 2017 16:55

AW: Delphi Listbox Items nach Teil String sortieren
 
Zitat:

Cool also funktioniert hat es was echt super ist, lädt praktischer weise Zeilenweise xD
Der Code lädt nicht zeilenweise. Wenn du denkst der Code würde genau das tun und dafür da sein, hast du ihn nicht verstanden.

Zitat:

bloß noch die Frage es lädt nur nach der angegebenen Datei im Quellcode und nimmt so gesehen nicht die nächste
Guck dir den Code an dann weißt du was du an deinen Dateien zu ändern hast.

Zeref Darkmage 31. Dez 2017 16:58

AW: Delphi Listbox Items nach Teil String sortieren
 
[QUOTE=LTE5;1389990]
Zitat:

Der Code lädt nicht zeilenweise. Wenn du denkst der Code würde genau das tun und dafür da sein, hast du ihn nicht verstanden.
Wenn ich sage es lädt zeilenweise, dann lädt es aus der datei die zeilen jeweils auch so wie sie drin stehen


UNd meine Frage an dich,hast du nichts zum beitragen oder warum machst du einen auf Korinthenkacker ?

lg

LTE5 31. Dez 2017 16:59

AW: Delphi Listbox Items nach Teil String sortieren
 
Ich mache nicht den Korinthenkacker. Aber man muss sich auch selber ein bisschen anstrengen statt nur zu kopieren und einzufügen.
Wo bleibt sonst der Lerneffekt?

Zeref Darkmage 31. Dez 2017 17:04

AW: Delphi Listbox Items nach Teil String sortieren
 
Lerneffekt ist wenn ich es nicht kann , es möchte, nach suchen nichts finde und dann nach erfolgreichen funktionieren des Programmes eine neue Anwendung schreibe die sich nur mit dem code Block

des anderen beschäftigt um auch die Funktionsweise zu verstehen. Also mach dir da mal keine Sorgen :) selbst wenn ich es nur rein kopieren sollte kommt der lern Effekt beim nächsten Programm.


Wie auch schon bei der ersten Hilfe mit Quick und Bubblesort.

Delphi.Narium 31. Dez 2017 17:14

AW: Delphi Listbox Items nach Teil String sortieren
 
Hier
Delphi-Quellcode:
FindFirst('Liste*.txt',faAnyFile,sr)
steht im ersten Parameter von FindFirst ein Platzhalter für den Dateinamen.

Es werden also in dem Beispiel alle Dateien geladen, deren name dem Muster [i]Listeirgendwas.txt[(i] entsprechen. Wenn es da nur eine Datei gibt, wird auch nur die geladen. Hier sollten also alle Dateien mit den Namen Liste1.txt, Liste2.txt ... geladen werden.
Man könnte auch
Delphi-Quellcode:
FindFirst('*.*',faAnyFile,sr)
angeben, aber dann werden nicht nur Textdateien, sondern auch Exen, DLLs ... geladen, das wäre vermutlich eher suboptimal ;-)

Deine Namensvorstellungen von weiter oben (Liste(1).txt,Liste(2).txt ...) müssten mit der Routine eigentlich umsetzbar sein.

Die Routine fügt mit AddStrings die zuletzt gelesene Datei immer "hinten an". Der Inhalt von Items ist also nicht irgendwie sortiert.

Aber dem können wir abhelfen (wieder nur hingedadddelt und ungetestet):
Delphi-Quellcode:
var
  sl : TStringList;
  slAlles : TStringList;
  sr : TSearchRec;
begin
  sl := TStringList.Create;
  slAlles := 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);
      slAlles.AddStrings(sl);
    until FindNext(sr) <> 0;
  end;
  FindClose(sr);
  slAlles.Sort;
  Listbox1.Items.AddStrings(slAlles);
  slAlles.Free;
  sl.Free;
end;
Wenn Du Besonderheiten bei der Sortierung haben möchtest, so schau Dir mal die Möglichkeiten von TStringList an. Da gibt es auch die Option, eine eigene Sortierroutine zu nutzen. Dazu dient die Methode CustomSort, Infos dazu findest Du z. B. hier: TStringList CustomSort site:delphipraxis.net

Zeref Darkmage 31. Dez 2017 17:28

AW: Delphi Listbox Items nach Teil String sortieren
 
Danke! Ich hatte mir auf deinem Kommentar hin noch mal fix Open Dialog angeguckt und muss sagen das es wirklich um welten einfach zu handeln ist ^^

ich werde mich dafür entscheiden.ich hatte zu test auch die andere variante benutzt.

echt cool :D

Solutor 1. Jan 2018 13:09

AW: Delphi Listbox Items nach Teil String sortieren
 
Ich glaube, nun reden alle aneinander vorbei, bzw. werden jetzt zwei Probleme vermischt.
Der Fragende sieht nun den Wals vor lauter Bäumen nicht mehr und ohne zu erklären,
was man da postet, wird er nur verwirrt.

Ich versuche mal auseinanderzubröseln was ich bisher herauslese:

1. Das Sortieren von Strings nach "Spalten" in Listbox. (Wurde gelöst)
2. Das Einlesen von eben der zu sortierenden Listen in die Listbox. (Wurde alerdings nur an TStringlist beschrieben)
3. Unser Kollege möchte aber gerne mehrere Dateien nacheinander einlesen und in der Listbox aneinander hängen. (Merge)
4. Vermutlich werden diese Dateien in einem gemeinsamen Verzeichnis liegen.
(Beschrieben wurde aber nur wie man automatisiert, eine Liste von Dateien in eine Stringlist bekommt, nicht daber deren Inhalt).

Es geht vermutlich um die Kombination dieser Dinge:

1. Man übergibt ein Verzeichnis.
2. Die Textdateien in diesem Verzeichnis werden ermittelt und nacheinander eingelesen und deren Inhalt den Items der Listbox angehängt.
3. Der Inhalt der Listbox wird sortiert.

Ich schätze das ist der Ansatz.

Zeref Darkmage 1. Jan 2018 13:57

AW: Delphi Listbox Items nach Teil String sortieren
 
jojo wie gesagt der hinweis mit openDialog hat geholfen und das Problem gelöst :D


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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