![]() |
Integers sortieren funktioniert nicht
Hallo,
In meinem Programm befindet sich eine StringGrid, in der einige Spalten aus reinen Zahlen bestehen, die ich gerne sortiert hätte. Bisher wurden diese Spalten alphabetisch sortiert. D.h. dass 99 > 100 ist etc. Nun habe ich eine Funktion gefunden, die eine Stringlist nach Integer sortiert. Allerdings funktioniert diese Funktion bei mir nicht, obwohl ich diese jetzt beim googlen schon öfter in Codes gefunden habe. Ich hab die Funktion lediglich umbenannt und je nachdem wie sortiert werden soll dem Result der Funktion ein Minus verpasst:
Delphi-Quellcode:
// Sort Integers asc function CompareIntAsc(List: TStringList; Index1, Index2: Integer): Integer; var d1, d2: Integer; r1, r2: Boolean; function IsInt(AString : string; var AInteger : Integer): Boolean; var Code: Integer; begin Val(AString, AInteger, Code); Result := (Code = 0); end; begin r1 := IsInt(List[Index1], d1); r2 := IsInt(List[Index2], d2); Result := ord(r1 or r2); if Result <> 0 then begin if d1 < d2 then Result := -1 else if d1 > d2 then Result := 1 else Result := 0; end else Result := lstrcmp(PChar(List[Index1]), PChar(List[Index2])); end; // Sort Integers desc function CompareIntDesc(List: TStringList; Index1, Index2: Integer): Integer; var d1, d2: Integer; r1, r2: Boolean; function IsInt(AString : string; var AInteger : Integer): Boolean; var Code: Integer; begin Val(AString, AInteger, Code); Result := (Code = 0); end; begin r1 := IsInt(List[Index1], d1); r2 := IsInt(List[Index2], d2); Result := ord(r1 or r2); if Result <> 0 then begin if d1 < d2 then Result := -1 else if d1 > d2 then Result := 1 else Result := 0; end else Result := -lstrcmp(PChar(List[Index1]), PChar(List[Index2])); end; // ... if (...) then begin Mylist.CustomSort(CompareIntAsc); NextTimeSort := 'desc'; end else if (...) then begin Mylist.CustomSort(CompareIntDesc); NextTimeSort := 'asc'; end; Kann mir jemand erklären wo sich bei meiner Anwendung der Funktion der Fehler eingeschlichen hat ? |
Re: Integers sortieren funktioniert nicht
Da steht ja 2 mal das Gleiche:
Zitat:
|
Re: Integers sortieren funktioniert nicht
Hmm,
Wenn ich am Ende das komplette Result einfach negiere dürfte das doch den gleichen Effekt haben. Hinzu kommt, dass weder ASC noch DESC funktioniert, denn ASC sortiert die Zahlen auch so : 1 100 101 11 Edit: Ups ja das muss in DESC so geändert werden, oder:
Delphi-Quellcode:
if Result <> 0 then
begin if d1 < d2 then Result := 1 else if d1 > d2 then Result := -1 else Result := 0; end Ist aber noch nicht die Lösung des Problems wie gesagt |
Re: Integers sortieren funktioniert nicht
Ich hab mal einen Test mit einer Listbox gemacht:
Delphi-Quellcode:
Funktioniert einwandfrei.
function CompareIntAsc(List: TStringlist; Index1, Index2: Integer): Integer;
var d1, d2: Integer; begin if TryStrToInt(List[Index1],d1) and TryStrToInt(List[Index2],d2) then begin if d1 < d2 then Result := -1 else if d1 > d2 then Result := 1 else Result := 0; end else Result := lstrcmp(PChar(List[Index1]), PChar(List[Index2])); end; function CompareIntDesc(List: TStringlist; Index1, Index2: Integer): Integer; var d1, d2: Integer; begin if TryStrToInt(List[Index1],d1) and TryStrToInt(List[Index2],d2) then begin if d1 < d2 then Result := 1 else if d1 > d2 then Result := -1 else Result := 0; end else Result := -lstrcmp(PChar(List[Index1]), PChar(List[Index2])); end; procedure TForm1.Button1Click(Sender: TObject); var sl: TStringlist; begin sl := TStringlist.Create; try sl.Assign(ListBox1.Items); sl.CustomSort(CompareIntAsc); ListBox1.Items.Assign(sl); finally sl.Free; end; end; procedure TForm1.Button2Click(Sender: TObject); var sl: TStringlist; begin sl := TStringlist.Create; try sl.Assign(ListBox1.Items); sl.CustomSort(CompareIntDesc); ListBox1.Items.Assign(sl); finally sl.Free; end; end; |
Re: Integers sortieren funktioniert nicht
Wie wäre es die Zahlen,
1 10 100 11 die ja eigentlich Strings sind '1' '10' '100' '11' mit vorhergehenden Nullen aufzufüllen, also '001' '010' '011' '100' Übrigens, mit ListBoxes habe ich auch nie "desc"-Sortierprobleme gehabt. Tschüß. |
Re: Integers sortieren funktioniert nicht
Hab weder bei der Listbox noch beim Grid Probleme.
|
Re: Integers sortieren funktioniert nicht
Hallo zusammen,
zunächst einmal scheint mir hier der Wurm drin zu stecken:
Delphi-Quellcode:
ist r1 false (=0) und r2 true (<>0) dann ist auch result<>0 und der Vergleich 0 und irgendetwas startet, da VAL bei fehlgeschlagenen Versuchen 0 einträgt.
begin
r1 := IsInt(List[Index1], d1); r2 := IsInt(List[Index2], d2); Result := ord(r1 or r2); if Result <> 0 then ..... Besser wäre da etwa so etwas:
Delphi-Quellcode:
Gruß
begin
Result:=0; r1 := IsInt(List[Index1], d1); r2 := IsInt(List[Index2], d2); if r1 and r2 then begin ..... else showmessage('falsche Eingabewerte'); K-H |
Re: Integers sortieren funktioniert nicht
Meine Fassung mit TryStrToInt in #4 hast Du aber gesehen, oder? :zwinker:
|
Re: Integers sortieren funktioniert nicht
Naklar
ÜBER sehen Omnia mea culpa, .... K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 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