Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Integers sortieren funktioniert nicht (https://www.delphipraxis.net/119653-integers-sortieren-funktioniert-nicht.html)

bl3nder 29. Aug 2008 09:31


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 ?

DeddyH 29. Aug 2008 09:36

Re: Integers sortieren funktioniert nicht
 
Da steht ja 2 mal das Gleiche:
Zitat:

Delphi-Quellcode:
  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).

bl3nder 29. Aug 2008 09:40

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

DeddyH 29. Aug 2008 09:54

Re: Integers sortieren funktioniert nicht
 
Ich hab mal einen Test mit einer Listbox gemacht:
Delphi-Quellcode:
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.

manfred23 29. Aug 2008 10:09

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

spaxxn 29. Aug 2008 10:15

Re: Integers sortieren funktioniert nicht
 
Hab weder bei der Listbox noch beim Grid Probleme.

p80286 29. Aug 2008 16:57

Re: Integers sortieren funktioniert nicht
 
Hallo zusammen,

zunächst einmal scheint mir hier der Wurm drin zu stecken:
Delphi-Quellcode:
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:
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 29. Aug 2008 17:02

Re: Integers sortieren funktioniert nicht
 
Meine Fassung mit TryStrToInt in #4 hast Du aber gesehen, oder? :zwinker:

p80286 29. Aug 2008 17:06

Re: Integers sortieren funktioniert nicht
 
Naklar

ÜBER sehen

Omnia mea culpa, ....

K-H


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