 |
| |
|
|
 |
Autor |
Nachricht |
 |
| |
| bl3nder |
#1| Verfasst am: 29.08.2008, 09:31 Titel: Integers sortieren funktioniert nicht |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 89 angemeldet: 18.08.2006

|
Sprache: Delphi (Win32) 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: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · · · 35 · · · · 40 · · · · 45 · · · · 50 · · · · 55 · · · · 60 · · · · 65 · · · · 70 · · · · 75 · · 78
| // 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 ? |
Zuletzt bearbeitet von bl3nder am 29.08.2008, 09:32, insgesamt 1-mal bearbeitet. |
 |
|
|
|
| |
| DeddyH |
#2| Verfasst am: 29.08.2008, 09:36 Titel: Re: Integers sortieren funktioniert nicht |
 |
 |
 |
|
"Rüsselmops" ;-) Alter: 42 Status: offline Beiträge: 8.639 angemeldet: 17.09.2006 Wohnort: Schweina/Thüringen Delphi 2007 Professional

|
Da steht ja 2 mal das Gleiche: | Zitat: | | Delphi-Quellcode: | markieren | if Result <> 0 then
begin
if d1 < d2 then
Result := -1
else if d1 > d2 then
Result := 1
else
Result := 0;
end |
|
|
In der absteigenden Reihenfolge musst Du natürlich noch negieren (Vorzeichen umdrehen). |
 10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
If a train station is where the train stops, what the hell is a workstation? |
 |
|
|
|
| |
| bl3nder |
#3| Verfasst am: 29.08.2008, 09:40 Titel: Re: Integers sortieren funktioniert nicht |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 89 angemeldet: 18.08.2006

|
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: | markieren | 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 |
Zuletzt bearbeitet von bl3nder am 29.08.2008, 09:46, insgesamt 2-mal bearbeitet. |
 |
|
|
|
| |
| DeddyH |
#4| Verfasst am: 29.08.2008, 09:54 Titel: Re: Integers sortieren funktioniert nicht |
 |
 |
 |
|
"Rüsselmops" ;-) Alter: 42 Status: offline Beiträge: 8.639 angemeldet: 17.09.2006 Wohnort: Schweina/Thüringen Delphi 2007 Professional

|
Ich hab mal einen Test mit einer Listbox gemacht: Delphi-Quellcode: | zusammenfalten | markieren | 1 · · · 5 · · · · 10 · · · · 15 · · · · 20 · · · · 25 · · · · 30 · · · · 35 · · · · 40 · · · · 45 · · · · 50 · · · · 55 · 57
| 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; |
|
Funktioniert einwandfrei. |
 10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
If a train station is where the train stops, what the hell is a workstation? |
 |
|
|
|
| |
| manfred23 |
#5| Verfasst am: 29.08.2008, 10:09 Titel: Re: Integers sortieren funktioniert nicht |
 |
 |
 |
|
gerade reingestolpert Alter: 49 Status: offline Beiträge: 9 angemeldet: 29.08.2008 Wohnort: Nürnberg Delphi 6 Enterprise

|
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üß. |
|
 |
|
|
|
| |
| spaxxn |
#6| Verfasst am: 29.08.2008, 10:15 Titel: Re: Integers sortieren funktioniert nicht |
 |
 |
 |
|
Mitglied Alter: 28 Status: offline Beiträge: 182 angemeldet: 19.11.2004 Wohnort: Neumünster Delphi 7 Enterprise

|
Hab weder bei der Listbox noch beim Grid Probleme. |
 Lieber Herr Gott,
lass viel Gras wachsen, denn es sind wieder viele Rindviecher unterwegs. |
 |
|
|
|
| |
| p80286 |
#7| Verfasst am: 29.08.2008, 16:57 Titel: Re: Integers sortieren funktioniert nicht |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 156 angemeldet: 28.04.2008 Wohnort: Düsseldorf Delphi 7 Personal

|
Hallo zusammen,
zunächst einmal scheint mir hier der Wurm drin zu stecken:
| Delphi-Quellcode: | markieren | begin
r1 := IsInt(List[Index1], d1);
r2 := IsInt(List[Index2], d2);
Result := ord(r1 or r2);
if Result <> 0 then
..... |
|
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.
Besser wäre da etwa so etwas:
| Delphi-Quellcode: | markieren | begin
Result:=0;
r1 := IsInt(List[Index1], d1);
r2 := IsInt(List[Index2], d2);
if r1 and r2 then
begin
.....
else showmessage('falsche Eingabewerte'); |
|
Gruß
K-H |
|
 |
|
|
|
| |
| DeddyH |
#8| Verfasst am: 29.08.2008, 17:02 Titel: Re: Integers sortieren funktioniert nicht |
 |
 |
 |
|
"Rüsselmops" ;-) Alter: 42 Status: offline Beiträge: 8.639 angemeldet: 17.09.2006 Wohnort: Schweina/Thüringen Delphi 2007 Professional

|
Meine Fassung mit TryStrToInt in #4 hast Du aber gesehen, oder? |
 10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.
If a train station is where the train stops, what the hell is a workstation? |
 |
|
|
|
| |
| p80286 |
#9| Verfasst am: 29.08.2008, 17:06 Titel: Re: Integers sortieren funktioniert nicht |
 |
 |
 |
|
Mitglied Status: offline Beiträge: 156 angemeldet: 28.04.2008 Wohnort: Düsseldorf Delphi 7 Personal

|
Naklar
ÜBER sehen
Omnia mea culpa, ....
K-H |
|
 |
|
|
|
 |
|
 |
| |
|
|
| |
 
|
|
| |
|
Du darfst keine Beiträge in dieses Forum schreiben. Du darfst auf Beiträge in diesem Forum nicht antworten. Du darfst Deine Beiträge in diesem Forum nicht bearbeiten. Du darfst Deine Beiträge in diesem Forum nicht löschen. Du darfst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten. Du kannst Dateien in diesem Forum nicht herunterladen.
|
|
 |