Delphi-PRAXiS :: Das Forum für Fragen zu Delphi
Das Experten Forum für Delphi Programmierer
Hilfe für Borland Delphi gibts es hier im Forum
Delphi Quelltexte und Source Codes
 
Winter 2008 - lieben Dank an Julius für ds Bild
Delphi-PRAXiS :: Foren-ÜbersichtForen-Übersicht Delphi-PRAXiS Modul-ÜbersichtSite-Map Delphi-PRAXiS durchsuchenSuchen Delphi-PRAXiS Code-LibraryCode-Library Jetzt registrieren!Registrieren Login  
   
 
0
 
Delphi für Win32
Integers sortieren funktioniert nicht
Ein Delphi (Win32)-Thema von bl3nder.

Vorheriges Thema anzeigen  |  Nächstes Thema anzeigen
Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
Delphi-PRAXiS Forum - Übersicht -> Sonstige Fragen zu Delphi
Seite 1 von 1   [ 9 Beiträge ]  
 
 Autor 
 Nachricht 
 
bl3nder #1|Beitrag #933189Verfasst am: 29.08.2008, 09:31      Titel: Integers sortieren funktioniert nicht Antworten mit Zitat
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
// 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.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
DeddyH #2|Beitrag #933193Verfasst am: 29.08.2008, 09:36      Titel: Re: Integers sortieren funktioniert nicht Antworten mit Zitat
"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? Grübelnd...
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
bl3nder #3|Beitrag #933195Verfasst am: 29.08.2008, 09:40      Titel: Re: Integers sortieren funktioniert nicht Antworten mit Zitat
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.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
DeddyH #4|Beitrag #933201Verfasst am: 29.08.2008, 09:54      Titel: Re: Integers sortieren funktioniert nicht Antworten mit Zitat
"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
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? Grübelnd...
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
manfred23 #5|Beitrag #933207Verfasst am: 29.08.2008, 10:09      Titel: Re: Integers sortieren funktioniert nicht Antworten mit Zitat
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üß.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
spaxxn #6|Beitrag #933212Verfasst am: 29.08.2008, 10:15      Titel: Re: Integers sortieren funktioniert nicht Antworten mit Zitat
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.
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
p80286 #7|Beitrag #933349Verfasst am: 29.08.2008, 16:57      Titel: Re: Integers sortieren funktioniert nicht Antworten mit Zitat
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
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
DeddyH #8|Beitrag #933352Verfasst am: 29.08.2008, 17:02      Titel: Re: Integers sortieren funktioniert nicht Antworten mit Zitat
"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? Zwinkern

10 Minuten Nachdenken ersparen oftmals 10 Stunden Fehlersuche.

If a train station is where the train stops, what the hell is a workstation? Grübelnd...
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
 
p80286 #9|Beitrag #933355Verfasst am: 29.08.2008, 17:06      Titel: Re: Integers sortieren funktioniert nicht Antworten mit Zitat
Mitglied
Status: offline
Beiträge: 156
angemeldet: 28.04.2008
Wohnort: Düsseldorf
Delphi 7 Personal

Naklar

ÜBER sehen

Omnia mea culpa, ....

K-H
nach oben nach unten
Benutzer-Profile anzeigen Private Nachricht senden
Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen im Forum zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Google zu suchen. Markiere Begriffe im Text und klicke auf diesen Button, um nach zusätzlichen Informationen bei Wikipedia zu suchen.
 
Anzeige-Optionen:    
 
Delphi-PRAXiS Forum - Übersicht -> Sonstige Fragen zu Delphi Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1   [ 9 Beiträge ]  
 
  Neuen Beitrag schreiben Auf Beitrag antworten
als PDF-Datei herunterladenThema ausdrucken
 
   
Gehe zu:  
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.


Impressum / Kontakt
Allgemeine Geschäftsbedingungen
Verhaltenskodex & FAQ

Delphi-PRAXiS :: Das Forum für Delphi-Programmierer
Das Experten Forum für Delphi ProgrammiererHilfe für Borland Delphi gibts es hier im ForumDelphi Quelltexte und Source CodesDelphi-PRAXiS :: Das Forum für DelphiWindows APIInternet und NetzwerkeVCL und Datenbanken
 

Delphi-PRAXiS V.2005 III
© 2002-2008 by Daniel R. Wolf
powered by phpBB © phpBB Group

Impressum / Kontakt Allgemeine Geschäftsbedingungen