Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Listbox sortierverfahren für text + Zahl (https://www.delphipraxis.net/86756-listbox-sortierverfahren-fuer-text-zahl.html)

Van HelF 19. Feb 2007 11:55


Listbox sortierverfahren für text + Zahl
 
Hallo,
ich habe mich im forum ungesehen, aber nur sortierverfahren für text oder zahl gefunden.
Ich möchte z.b. folgendes sortieren:

reihe 1 eintrag 1
reihe 1 eintrag 2
.
.
reihe 2 eintrag 1
reihe 2 eintrag 2
.
.
reihe 10 eintrag 1
reihe 10 eintrag 2

beim normales sorted der listbox steht dann reihe 10 vor reihe 2.
gibt es eine möglichkeit beides zu berücksichtigen, so dass es praktisch wie oben angezeigt wird?

stahli 19. Feb 2007 13:03

Re: Listbox sortierverfahren für text + Zahl
 
Hallo Van HelF,

das wird Dir mit einer Standardsortierfunktion nicht gelingen.

Wo bekommst die die Werte her? Kannst Du die Stringlist nicht gleich sortiert erzeugen?

Ggf. könntest Du die Einträge sonst auch so normalisieren, dass sie als String sortierbar sind...
reihe 001 eintrag 001
reihe 001 eintrag 002
.
.
reihe 002 eintrag 001
reihe 002 eintrag 002
.
.
reihe 010 eintrag 001
reihe 010 eintrag 002

Ansonsten kannst Du die Daten in eine TStringlist übertragen dieser eine Sortierfunktion zuweisen.
Über MyStringList.Sort(MySortFunction) kannst Du diese dann sortieren. In MySortFunction musst Du die Zeichenketten auswerten und sagen, welche nach oben oder unten gehören...
Nach dem Sortieren die Daten dann wieder in deine ListBox zurück schreiben.

Stahli

shmia 19. Feb 2007 13:21

Re: Listbox sortierverfahren für text + Zahl
 
Man nennt das natürliche Sortierung.
Siehe: http://www.delphipraxis.net/internal...ct.php?t=56869

dAb 24. Okt 2007 17:47

Re: Listbox sortierverfahren für text + Zahl
 
Hallo,


Ich habe auch so ein Problem. Mein Programm erstellt beliebig viele ListBox-Einträge. Es geht um eine Punktetabelle, die dann natürlich bei listbox.sorted:=true falsch rum sortiert wird.

Wie kann ich das ganze jetzt umkehren? Ist das möglich?

Idee Nummer 1: Die Einträge nach dem Sortieren vertauschen

Den ersten und letzten Eintrag kann ich ja ohne Probleme austauschen lassen. Aber wenn es mehrere Einträge sind, kann man das dann auch irgendwie machen?


Code:
listbox1.Sorted:=true;
if listbox1.count > 1 
then begin
listbox1.Items.Exchange(listbox1.Count-1,listbox1.Count-listbox1.count);
end;

Idee Nummer 2: Selbst sortieren

Oder das ganze vllt mit einer extra Prozedur regeln? Habe hier mal zwei, allerdings kommt da dann beim "then begin" bzw. "do begin" ein Fehler. :gruebel:

Code:
procedure sortieren;
var i,j,k,m:byte;
    puffer:pointer;
    listbox1:TList;
begin
 for j:=1 to (m-1) do begin
  for i:=j+1 to m do
  if listbox1.Items[j]>listbox1.Items[i] then begin

  puffer:=listbox1.Items[j];
  listbox1.Items[j]:=listbox1.Items[i];
  listbox1.Items[i]:=puffer;
  end;
  end;

 end;

Code:
procedure sortieren;
var
temp, i:byte;
listbox1: TList;
begin
for i:=0 to (listbox1.Count / 2) do begin
temp := listbox1.Items[i];
listbox1.Items[i] := listbox1.Items[listbox1.Count - 1 - i];
listbox1.Items[listbox1.Count - 1 - i] := temp;
end;
end;

Wäre überaus nett, wenn mir jemand helfen kann. :)

3_of_8 24. Okt 2007 17:50

Re: Listbox sortierverfahren für text + Zahl
 
Beim ersten Codestück wird m nicht initialisiert und beim zweiten hast du einen Integer als Laufvariable und versuchst, ihn bis zu einem Float-Wert laufen zu lassen. Verwende statt / einfach div.

(Außerdem bezweifle ich, dass das funktioniert... woher hast du denn den Code? Warum wird da ein Pointer als Temp-Variable verwendet?)

dAb 24. Okt 2007 17:54

Re: Listbox sortierverfahren für text + Zahl
 
Das erste selbst gemacht, das zweite hat jemand anders gemacht. Also das mit m könntest du vllt verbessern?

Und beim Zweiten kommen dann zwei Fehler von wegen "Incompatible types: 'Byte' and 'Pointer'


Edit: Ok, vbeim Ersten müsste dann vor die Schleife listbox1.count:=m denke ich mal. Wurde vergessen. Bleibt aber trotzdem der Fehler "Operator not applicable to this operand type"

3_of_8 24. Okt 2007 18:04

Re: Listbox sortierverfahren für text + Zahl
 
Ich bin mir nicht ganz sicher, aber es könnte sein, dass man in Delphi Strings nicht mit größer/kleiner verlgeichen kann. Such mal nach Funktionen wie StrCompare, AnsiStrCompare usw.

hoika 24. Okt 2007 18:05

Re: Listbox sortierverfahren für text + Zahl
 
Hallo,

wenn es eine normale ListBox ist,
würde ich die Einträge zuerst in eine TStringList packen,
dann CustomSort benutzen (siehe Hilfe) und die Einträge
dann frei sortiert in die ListBox packen.

Stehen Sie schon drin, trotzdem genau so.
Aus der ListBox in die StringList: StringList.Assign(ListBox.Items)
sortieren, ListBox leeren und wieder sortiert rein.


Heiko

dAb 24. Okt 2007 18:17

Re: Listbox sortierverfahren für text + Zahl
 
Danke.

Wie bekomme ich denn die TStringList in den Code? :mrgreen:

Kenne mich nicht so aus...

Zu CutsomSort? Wie benutze ich das? Kann mit der Hilfe nicht viel anfangen. :oops:

hoika 24. Okt 2007 18:33

Re: Listbox sortierverfahren für text + Zahl
 
Hallo,

also ein bisschen Suchen solltest du schon mal.
Zu CustomSort gibt es in Google Beispiele.

Delphi-Quellcode:
var
  SL: TStringList;
begin
  SL:= TStringList.Create;
  try
   SL.Assign ...

   CustomSort
  finally
    SL.Free;
  end;
end;

Heiko


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