Merkwürdige Sortierreihenfolge: TCustomListBox.Sorted

Rund um die LCL und andere Komponenten
Antworten
KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Merkwürdige Sortierreihenfolge: TCustomListBox.Sorted

Beitrag von KOBOLD Messring GmbH »

¡¡Ein fröhliches und erfolgreiches Neues Jahr 2009!!
Und schon gehen die Fragen los:
Habe folgendes Problem: Eine ListBox soll sortieren, die Eigenschaft Sorted:=true sortiert auch, aber Leerzeichen werden ignoriert, obwohl die beim (binären) sortieren doch eigentlich als (ASCII/ANSI-Code 32) VOR den Zahlen zu stehen hätten:
aus einer Liste (die Strings kommen natürlich aus einer DB - aus mehreren Abfragen zusammengesetzt, deshalb kann ich sie nicht auf SQL-Ebene sortieren, sondern nachher, ich dachte elegant in der ListBox):

Code: Alles auswählen

ListBox.Items.Add (' 20');
ListBox.Items.Add ('100');
ListBox.Items.Add (' 30');
ListBox.Items.Add (' 10');
müsste doch die sortierte Liste links werden:

Code: Alles auswählen

so soll es sein        so ist das Resultat
" 10"                            " 10"
" 20"                            "100"
" 30"                            " 20"
"100"                            " 30"
wenn jede Zeile ordentlich 3-stellig mit führenden Leerzeichen gefüllt wird. Geht aber leider nicht.
Auch das voranstellen von anderen Zeichen vor das Leerzeichen wird ignoriert.
Nur wenn ich 010, 020, 030, 100 schreiben würde mit führenden Nullen, entspricht das Ergebnis dem gewünschten, ist aber so schlecht zu lesen.
¿Wer weiss Rat? ¿kann man die Sortierung irgendwie beeinflussen durch (globale) Parameter oder so?
Habe auch in der Delphi-Hilfe dazu nichts gefunden.

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Merkwürdige Sortierreihenfolge: TCustomListBox.Sorted

Beitrag von theo »

http://www.swissdelphicenter.ch/en/showcode.php?id=1664" onclick="window.open(this.href);return false;

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: Merkwürdige Sortierreihenfolge: TCustomListBox.Sorted

Beitrag von KOBOLD Messring GmbH »

Vielen Dank Theo, so wie im swissdelphicenter aufgezeigt funktionierts (mit einem normalen Stringvergleich, da werden also die führenden Leerzeichen berücksichtigt, guck mal einer an).

Code: Alles auswählen

Function Vergleich (List: TStringList; Index1, Index2 : Integer) : Integer;
VAR s1, s2 : String;
Begin
  s1 := List [Index1];
  s2 := List [Index2];
  IF s1 = s2
    THEN Result := 0
    ELSE IF s1 < s2
           THEN Result := -1
           ELSE Result := 1;
End; { Vergleich }
 
Liste.CustomSort (@Vergleich);
Ich hätte gedacht, dass die interne Sort-Funktion genau das macht, nämlich die unveränderten Strings zu vergleichen ohne irgendwelche "intelligenten" Zusatzfeatures, aber anscheinend machen die viel mehr, ¿wie käme es sonst, dass Leerzeichen unberücksicht bleiben? Meine "echten" Listeneinträge sehen nämlich z.B. so aus:

Code: Alles auswählen

PP (Polypropylen);  40%; Acetaldehyd, Ethanal; 20°C; weniger geeignet
  PP (Polypropylen); 100%; Acetaldehyd, Ethanal; 60°C; ungeeignet
Nochmals vielen Dank, werde in Zukunft öfter mal bei diesem swissdelphicenter vorbeischauen.

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Merkwürdige Sortierreihenfolge: TCustomListBox.Sorted

Beitrag von marcov »

Ist es wirklich der Lazarus .sort? Oder einfach SQL der die leerzeichen stript?

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: Merkwürdige Sortierreihenfolge: TCustomListBox.Sorted

Beitrag von KOBOLD Messring GmbH »

Es muss der Lazarus .Sort sein, der die Leerzeichen strippt, denn die schreibe ich erst NACH der SQL-Abfrage rein. In der Datenbank stehen keine führenden Leerzeichen, ich mach im code:
WHILE Length (sKonz) < 5 DO sKonz := ' ' + sKonz;
(sKonz ist der bewusste String mit den Prozentangaben). Danach kommen noch die Temperatur, Chemikalien und Materialangaben davor und dahinter und das ganze Konstrukt kommt in die ListBox. Und dann wird sortiert mit obigen Ergebnissen.

Antworten