Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Objektliste sortieren (https://www.delphipraxis.net/114033-objektliste-sortieren.html)

Hansa 18. Mai 2008 18:07


Objektliste sortieren
 
Hi,

Kann man TObjectLists nur als string mit CompareText sortieren ? Momentan mache ich das so :

Delphi-Quellcode:
function VergleicheWerte (Item1, Item2: Pointer): Integer;
begin
(*
  Result := CompareText(TDatenObject(Item1).name,
                        TDatenObject(Item2).name);
*)
  Result := CompareText(TDatenObject(Item1).nr,
                        TDatenObject(Item2).nr);
end;
Aufruf so :

Delphi-Quellcode:
RohDaten.Sort(@VergleicheWerte); // Rohdaten = TObjectList
Das auskommentierte geht. Wie soll ich jetzt die nr = integer behandeln ? Die Items haben auch noch real, boolean usw. Felder. Da gehts dann weiter. Muss da immer der Typ umgewandelt werden, oder gibt es Alternativen zu CompareText ? Unschön ist auch noch, dass Delphi Warnungen bringt wegen Pointer und @. Wie kriegt man die weg ?

FAlter 18. Mai 2008 18:10

Re: Objektliste sortieren
 
Hi,

eventuell mit Result := TDatenObject(Item1).nr - TDatenObject(Item2).nr ?

Mfg
FAlter

Sharky 18. Mai 2008 18:11

Re: Objektliste sortieren
 
Hai Hansa,

ein CompareText auf einen Integerwert macht natürlich keinen Sinn. Warum gibst Du nicht einfach das gewünschte Ergebniss der Funktion direkt als Result zurück?

sx2008 18. Mai 2008 18:15

Re: Objektliste sortieren
 
Für jeden Datentyp eine eigene Hilfsfunktion schreiben:
Delphi-Quellcode:
function CompareInt(a,b:Integer):Integer;
begin
  if a > b then Result := 1
  else if a < b then Result := -1
  else Result := 0; // a = b
end;
Aus Optimierungsgründen wird der Fall a=b als letztes abgehandelt, da die Wahrscheinlichkeit
viel geringer als a > b oder a < b ist.

FAlter 18. Mai 2008 18:18

Re: Objektliste sortieren
 
Hi,

Zitat:

Zitat von sx2008
Für jeden Datentyp eine eigene Hilfsfunktion schreiben:
Delphi-Quellcode:
function CompareInt(a,b:Integer):Integer;
begin
  if a > b then Result := 1
  else if a < b then Result := -1
  else Result := 0; // a = b
end;
Aus Optimierungsgründen wird der Fall a=b als letztes abgehandelt, da die Wahrscheinlichkeit
viel geringer als a > b oder a < b ist.

Da es Delphi afaik nur darauf ankommt, ob das Ergebnis <, = oder > 0 ist, wäre es wohl optimierter, b - a zu schreiben - oder gleich oben die Subtraktion anzugeben. Es ist ja nicht nut "zufällig" so, dass es zwar für Strings, aber nicht für Integers fertige Funktionen gibt.

Mfg
FAlter

Hansa 18. Mai 2008 18:20

Re: Objektliste sortieren
 
Hai Hai,

So ungefähr ?

Delphi-Quellcode:
function VergleicheWerte (Item1, Item2: Pointer): boolean;
begin
  Result := TDatenObject(Item1).nr > TDatenObject(Item2).nr;
end;
Das da bringt momentan Zugriffsverletzung. Dem wird das miit @ übergebene boolean nicht schmecken.

himitsu 18. Mai 2008 18:22

Re: Objektliste sortieren
 
seit mindestens D7 Delphi-Referenz durchsuchenCompareValue

Delphi-Quellcode:
uses Math;

function VergleicheWerte(Item1, Item2: Pointer): boolean;
begin
  Result := CompareValue(TDatenObject(Item1).nr, TDatenObject(Item2).nr);
end;

Sharky 18. Mai 2008 18:23

Re: Objektliste sortieren
 
Zitat:

Zitat von Hansa
Hai Hai,

So ungefähr ?....

Hai Hansa,

schaue Dir mal die beiden Beiträge von FAlter an.

sx2008 18. Mai 2008 18:23

Re: Objektliste sortieren
 
Zitat:

Zitat von FAlter
...nur darauf ankommt, ob das Ergebnis <, = oder > 0 ist, wäre es wohl optimierter, b - a zu schreiben - oder gleich oben die Subtraktion anzugeben.

Ja, dem kann ich zustimmen - man müsste nur überlegen, was bei einem Integer-Überlauf so alles passieren kann. Wobei ein Überlauf bei Int32 eher selten vorkommt.

himitsu 18. Mai 2008 18:29

Re: Objektliste sortieren
 
Zitat:

Aus Optimierungsgründen wird der Fall a=b als letztes abgehandelt, da die Wahrscheinlichkeit
viel geringer als a > b oder a < b ist.
dann doch lieber gleich in ASM ... nur einmal vergleichen (CMP) und das Ergebnis mit mit mehreren Jumps (JL JG JE ...) auswerten

Apollonius 18. Mai 2008 18:36

Re: Objektliste sortieren
 
Wohl eher mit CMOVcc. :mrgreen:

Hansa 18. Mai 2008 18:43

Re: Objektliste sortieren
 
Uff, ihr schreibt noch den roten Kasten kaputt. :mrgreen: Nene, nicht noch Assembler. Es geht um kein AKW. Mit dem - das geht schon mal. Die Delphi Hilfe zeigt leider kein CompareValue bei "siehe auch". Das muss man eben kennen. Jetzt hat mir zufällig die Codevervollst. noch das hier beschert :

Zitat:

Zitat von DH
Delphi-Syntax:

function VarCompareValue(const A, B: Variant): TVariantRelationship;

Was gibts denn da noch alles ? :shock: Gut, das CompareValue dürfte passen. Füe Sonderfälle wäre ja noch das CompareText da. Jetzt gibts aber noch ein grundsätzliches Problem : der Aufruf der Vergleichsfunktion. Es geht konkret um Stringgrid-Sortierung. Die Zellen sind ja sowieso als Text da. Soll ich nicht besser Text Text sein lassen und darüber sortieren ? In einigen Spalten stehen zwar Zahlen, aber die Zellen selbst sind ja schon strings.

Luckie 18. Mai 2008 18:46

Re: Objektliste sortieren
 
Dann sortier mal die Zhalen eins bis hundert alphabetisch und guck, was passiert.

Jelly 18. Mai 2008 18:49

Re: Objektliste sortieren
 
Zitat:

Zitat von Luckie
Dann sortier mal die Zhalen eins bis hundert alphabetisch und guck, was passiert.

Genau, was passieren soll :mrgreen: :
Code:
1
10
100
11
12
13
14
...
2
20
21
...
99

Hansa 18. Mai 2008 18:56

Re: Objektliste sortieren
 
Wollt ihr mich für blöd verkaufen ? :warn: :mrgreen: Dafür hat man Funktionen
Delphi-Quellcode:
function rb (st : string;feldweite : byte) : string;
Ich werde jetzt das STringgrid mal bis zum platzen füllen und wirklich gucken, was los ist.

himitsu 18. Mai 2008 19:05

Re: Objektliste sortieren
 
Zitat:

Zitat von Apollonius
Wohl eher mit CMOVcc. :mrgreen:

nee, eher SETcc :tongue:

CMOVcc würd ich mehr für Min/Max-Funktionen nehmen ... hier braucht man doch mehr -1..1

Hansa 18. Mai 2008 19:27

Re: Objektliste sortieren
 
Jetzt gibts aber noch einen prinzipiellen Haken : ich sortiere gerne das Stringgrid über Click auf Titelzeile. Ich merke mir dazu die entsprechende Spalte über die dann sortiert wird. Wie bringe ich das jetzt der Vergleichs-Funktion bei ? Ich sehe nur 2 Möglichkeiten :

1. : für jede Spalte eine eigene Sortierfunktion aufrufen, oder
2. : innerhalb dieser Funktion entsprechend reagieren.

2.1 : Bei letzerem gäbe es wieder zwei Varianten : Parameter für die Funktion (glaube aber, der @ macht da nicht mit) oder

2.2 : protected Variable deklarieren.

Any ideas ? :wiejetzt: Der Klammeraffe muss allerdings sowieso noch weg wegen der Warnungen, oder nicht ?

zu 2.1 : Parameter kann ich ja nicht wegen dem @ benutzen. Scheidet wohl aus.

zu 2.2 : ich kriege die Vergleichs-Funktion nicht in die Form. Was jetzt ?

sx2008 18. Mai 2008 19:46

Re: Objektliste sortieren
 
TSortAString Grid v.1.2.0 FWS 10 k 18 Mar 1998
By Johan Godfried. Sort a StringGrid (or any descendant) anyway you like, Horizontal / Vertical, Ascending / Descending, Character / Numeric / Date. Single column sort key only at this time. This is not grid, but for grid.
http://www.torry.net/vcl/grids/stringgrids/sasg.zip

Hansa 18. Mai 2008 19:51

Re: Objektliste sortieren
 
Scheidet direkt aus, weil nicht vom Stringgrid abgeleitet, sondern bloß von TComponent.

sx2008 19. Mai 2008 01:45

Re: Objektliste sortieren
 
Zitat:

Zitat von Hansa
Scheidet direkt aus, weil nicht vom Stringgrid abgeleitet, sondern bloß von TComponent.

Hmm, versteh ich nicht. Die Komponente SASG ist von TComponent abgeleitet und ist in der Lage, jedes TStringGrid oder davon abgeleitete Grid zu sortieren.
Das TStringGrid kann so bleiben wie es ist, es wird ja "von aussen" sortiert.
Man könnte die Komponente SASG auch auf eine ganz "normale Klasse" reduzieren um Overhead zu sparen.

Hansa 19. Mai 2008 03:36

Re: Objektliste sortieren
 
Ah ja, ich sehe, die haben das Stringgrid als property eingebaut. Nützt aber auch nicht viel. Einarbeitungs-Aufwand > Eigenentwicklung.


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