AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Integers sortieren funktioniert nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Integers sortieren funktioniert nicht

Ein Thema von bl3nder · begonnen am 29. Aug 2008 · letzter Beitrag vom 29. Aug 2008
Antwort Antwort
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#1

Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 10:31
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

Re: Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 10:36
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).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bl3nder

Registriert seit: 18. Aug 2006
89 Beiträge
 
#3

Re: Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 10:40
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

Re: Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 10:54
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
manfred23

Registriert seit: 29. Aug 2008
Ort: Nürnberg
9 Beiträge
 
Delphi 6 Enterprise
 
#5

Re: Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 11:09
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üß.
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#6

Re: Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 11:15
Hab weder bei der Listbox noch beim Grid Probleme.
"Hey Süße,
hol mir mal was zu trinken! Du wirst schon wieder hässlich!"

Zitat eines Betrunkenen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 17:57
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

Re: Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 18:02
Meine Fassung mit TryStrToInt in #4 hast Du aber gesehen, oder?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Integers sortieren funktioniert nicht

  Alt 29. Aug 2008, 18:06
Naklar

ÜBER sehen

Omnia mea culpa, ....

K-H
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 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