AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi TList.sort(@nirvana) warum will TList.sort() nicht wie ich?
Thema durchsuchen
Ansicht
Themen-Optionen

TList.sort(@nirvana) warum will TList.sort() nicht wie ich?

Ein Thema von Corelgott · begonnen am 28. Nov 2005 · letzter Beitrag vom 25. Apr 2006
Antwort Antwort
Benutzerbild von Corelgott
Corelgott

Registriert seit: 11. Apr 2003
Ort: Lübeck
213 Beiträge
 
Delphi 2006 Enterprise
 
#1

TList.sort(@nirvana) warum will TList.sort() nicht wie ich?

  Alt 28. Nov 2005, 12:29
hi @ all,

ich habe eine Liste (TObjectList);

bei dieser liste rufe ich irgendwann Liste.sort (<- ist standard von TList; brauch nur ne funk und dann passt das) auf;
Nur mal so nebenbei: TCmd ist ein Obj abegleitet von TObject; Rechtprimitiv... wollte bloß keine record nehmen ^^

Code:
function elementSort(Item1, Item2: Pointer): Integer;
var
  res : Integer;
  obj1, obj2  : TCmd;

begin
  res := 1;

  obj2  := TCmd(item2^);
  obj1  := TCmd(Item1^);

  if ((obj1.priority < obj2.priority) and
      (obj1.processed = cmsPending)) then
    res := -1;

  result := res;
end;

procedure TForm1.OnWasWeissIch(foobar : TObject);
begin
  list.sort(@elementSort);
end;
So 1. darf elementSort keine funktion der klasse TForm1 sein... (Sonst passt das nicht; hmm villeicht, weil methoden von objekten in delphi nicht statisch seien können? Bzw. könne Sie das überhaupt und wenn ja wie? aber das mal nur so nebenbei... **das ist mal wieder ne super frage für Luckie ^^)

2. Bekomme ich beim casten von item1 auf obj1 immer eine AccessViolation... warum das?; Die daten in der Liste an sich sehen gut aus... (Keine seltsamen unsinnigen Pointer oder so)

Wenn ich das fieh debuggen will, und in die obj1, obj2 rein schauen will, kann es das nicht, weil die funktion ja gar nicht zum objekt gehört, sondern eine statische "Unit"-Prozedure ist (**unwissenheit + dünnes eis... gibt es so was überhaupt?)

So weit so gut.. Ich dachte mir da bemühe ich mal die Hilfe und schau wie die das machen:

So und nun wird es kriminell:

Code:
function CompareNames(Item1, Item2: Pointer): Integer;
begin
  Result := CompareText((Item1 as TComponent).Name, (Item2 as TComponent).Name);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  List1.Sort(@CompareText);
end;
von meinem verständnis her, wird hier die methode CompareNames, die man extra geschreiben hat, gar nicht benutzt?!
Weil der pointer der "Methode" die das Sortier-Kreterium ausrechnet ist ja hier CompareText und nicht CompareNames...
Passt durch Zufall auch... aber?!

Oder bin ich hier auf einem völlig falschen Dampfer?"

Hat da mal wer ne idee oder einen Anstroß für mich!?

thx & cya
Corelgott
wer Rächtschraibfehler findet daaf sie behalten...
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#2

Re: TList.sort(@nirvana) warum will TList.sort() nicht wie i

  Alt 28. Nov 2005, 13:00
Zu 1: Sort erwartet als Parameter halt eine 'einfache' Funktion und keine Methode.
Zu 2: Lass mal den Dreferenzierungsoperator weg oder caste mit as.
Zu 3: Das Beispiel aus der OH ist tatsächlich falsch.

Gruß, teebee
  Mit Zitat antworten Zitat
Benutzerbild von Corelgott
Corelgott

Registriert seit: 11. Apr 2003
Ort: Lübeck
213 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: TList.sort(@nirvana) warum will TList.sort() nicht wie i

  Alt 28. Nov 2005, 14:57
hmm thx
für die Antwort...


Zitat von teebee:
Zu 1: Sort erwartet als Parameter halt eine 'einfache' Funktion und keine Methode.
ok... **das @ streich...

Zitat von teebee:
Zu 2: Lass mal den Dreferenzierungsoperator weg oder caste mit as.
ok... habe ich gemacht & funzt... aber ist schon ertwas seltsam einen pointer nicht zu dereferenzieren und ihn einfach "zu" einen Object zu casten...

aber solage es geht

Zitat von teebee:
Zu 3: Das Beispiel aus der OH ist tatsächlich falsch.
*ohne worte*

hmm somit ist das ganze so wie es soll fertig...
Habe zwar noch ein paar kleinere probs mit der reihnfolge (@gleichwertige einträge nicht vertauschen..) aber sonst... nice!

thx & cya
Corelgott
wer Rächtschraibfehler findet daaf sie behalten...
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#4

Re: TList.sort(@nirvana) warum will TList.sort() nicht wie i

  Alt 28. Nov 2005, 15:46
Zitat von Corelgott:
ok... habe ich gemacht & funzt... aber ist schon ertwas seltsam einen pointer nicht zu dereferenzieren und ihn einfach "zu" einen Object zu casten...
Eine Objektreferenz ist auch nur ein typisierter Zeiger, mit dem Unterschied zu gewöhnlichen Zeigern, dass man ihn nicht explizit zu dereferenzieren braucht (darf man sogar nicht), das macht der Compiler für einen.

In diesem Kontext wird aber gar nicht dereferenziert, Du sagst dem Compiler nur "tu mal so, als hättest Du statt eines einfachen Pointers einen Zeiger auf ein Objekt bekommen", eben weil nicht das Objekt selbst übergeben wurde, sondern eine Referenz darauf.

Gruß, teebee
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: TList.sort(@nirvana) warum will TList.sort() nicht wie i

  Alt 28. Nov 2005, 16:37
Zitat von Corelgott:
Sonst passt das nicht; hmm villeicht, weil methoden von objekten in delphi nicht statisch seien können?
Doch, können sie.
class procedure Foo; Der Unterschied liegt aber darin, dass Methoden immer einen versteckten Self-Parameter besitzen. Deshalb gibt es getrennt Methoden- (mit .. of object) und "normale" Prozedurenzeigertypen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von ArmyMan
ArmyMan

Registriert seit: 25. Mai 2004
Ort: Wil Sg
193 Beiträge
 
#6

Re: TList.sort(@nirvana) warum will TList.sort() nicht wie i

  Alt 25. Apr 2006, 12:02
Wie kann ich nach 2 Spalten sortieren?
z.B. zuerst nach Spalte "a" dann nach Spalte "b" sortieren
Code:
Ausgangstabelle:  Diese Tabelle will ich:
+-------+          +-------+
| a | b |          | a | b |
+-------+          +-------+
| 4 | 4 |          | 1 | 6 |
| 3 | 9 |          | 2 | 6 |
| 2 | 6 |          | 3 | 2 |
| 3 | 2 |          | 3 | 9 |
| 4 | 7 |          | 4 | 4 |
| 1 | 6 |          | 4 | 7 |
+-------+          +-------+
Versteht ihr was ich meine??

Greetz
ArmyMan
Reden ist Schweigen, Silber ist Gold!
Der Soldat friert nicht. Er zittert nur vor Wut, weil es so kalt ist.
  Mit Zitat antworten Zitat
Benutzerbild von ArmyMan
ArmyMan

Registriert seit: 25. Mai 2004
Ort: Wil Sg
193 Beiträge
 
#7

Re: TList.sort(@nirvana) warum will TList.sort() nicht wie i

  Alt 25. Apr 2006, 16:13
Ich habe mal eine nicht 100%ige Lösung. In diesem Beispiel kann die Zahl in der Spalte b höchstens 999 sein. Falls man aber weiss wie gross die Zahl höchstens sein wird, kann man bei dem "*1000" einen grösseren / kleineren faktor nehmen.

Delphi-Quellcode:
type
  TItem = Record
            a : Integer;
            b : Integer;
          end;
  pItem = ^TItem;

...

var
  List : TList;

function CompareValues(Item1 : Pointer; Item2 : Pointer) : Integer;
var
  pItem1, pItem2 : pItem;
  z1, z2 : integer;
begin
  pItem1 := pItem(Item1);
  pItem2 := pItem(Item2);
  z1 := (pItem1^.a*1000)+pItem1^.b;
  z2 := (pItem2^.a*1000)+pItem2^.b;

  if z1 > z2
  then Result := 1
  else if z1 = z2
  then Result := 0
  else Result := -1;
end;

List.Sort(CompareValues);
Greetz
ArmyMan
Reden ist Schweigen, Silber ist Gold!
Der Soldat friert nicht. Er zittert nur vor Wut, weil es so kalt ist.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: TList.sort(@nirvana) warum will TList.sort() nicht wie i

  Alt 25. Apr 2006, 16:17
Du bist kreativ, das muss man dir lassen .
Delphi-Quellcode:
Result := Sign(Item1.a - Item2.a);
if Result = 0 then
  Result := Sign(Item1.b - Item2.b);
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von ArmyMan
ArmyMan

Registriert seit: 25. Mai 2004
Ort: Wil Sg
193 Beiträge
 
#9

Re: TList.sort(@nirvana) warum will TList.sort() nicht wie i

  Alt 25. Apr 2006, 16:24
Und warum kam das nicht früher?

Thx & Greetz
ArmyMan
Reden ist Schweigen, Silber ist Gold!
Der Soldat friert nicht. Er zittert nur vor Wut, weil es so kalt ist.
  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 07:41 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