![]() |
class function <> normale function mit Klassenzugehöri
Also ich probiere immernoch meine Sortierte Liste zu erstellen...
Nach dem ich mit den interfaces auf die Schnauze gefallen bin, versuche ich es jetzt mal anders:
Delphi-Quellcode:
Weil ich immer eine AV bekommen habe, habe ich da mal durchgesteppt. Stoppunkt an Stelle 1.
unit USortedList;
interface uses SysUtils, Contnrs, Dialogs; type TSortedList =class(TObjectList) public Compare: function(o1,o2: TObject):integer; procedure Sort; end; TIntTest =class public v: integer; class function Compare(o1,o2: TObject):integer; end; implementation class function TIntTest.Compare(o1,o2: TObject):integer; begin result :=TIntTest(o1).v-TIntTest(o2).v; //Stelle 3 end; procedure TSortedList.Sort; procedure QuickSort(iLo, iHi: Integer); var Lo, Hi: Integer; Mid: TObject; begin Lo := iLo; Hi := iHi; Mid :=Items[(Lo + Hi) div 2]; //Stelle 1 repeat while Compare(Mid,Items[Lo]) < 0 do Inc(Lo); //Stelle 2 while Compare(Mid,Items[Hi]) > 0 do Dec(Hi); if Lo <= Hi then begin Exchange(Lo,Hi); Inc(Lo); Dec(Hi); end; until Lo > Hi; if Hi > iLo then QuickSort(iLo, Hi); if Lo < iHi then QuickSort(Lo, iHi); end; begin if Assigned(Compare) then QuickSort(0,Count-1); end; end. Dann drücke ich F7 und erwarte, dass das Programm an Stelle 2 geht. Dies ist jedoch nicht der Fall, sondern es geht an Stelle 3 und ich kann mir keinen Reim darauf machen. Es gibt doch wirklich 0 Grund dazu. Das kann eigentlich nur an einem Fehlverständnis von class functions meinerseits liegen, oder? Die Delphiohilöfe macht sich zumindets bei mir nicht die Mühe diese zu dokumentieren... Könnt ihr mich aufklären (Ich ging bisher davon aus, dass dies eine ganz normale Funktion ist, die zwar von Name her zur Klasse gehört, aber sonst eigentlich eine ganz normale Funktion ist (das was in Java static ist) |
Re: class function <> normale function mit Klassenzuge
Class methods haben einen impliziten Parameter, in dem ein Zeiger auf die class reference übergeben wird.
So wie self bei einer Instanzmethode. Ab Delphi2006 kann man class methods als "static" deklarieren, dadurch fällt der Parameter weg und sie verhalten sich exakt wie globale Funktionen. |
Re: class function <> normale function mit Klassenzuge
Was hesisst ein implizieter Parameter? Wo kommt der denn her?
Und wie erklärt sich meine AV daraus? |
Re: class function <> normale function mit Klassenzuge
Zitat:
Wie kommt wohl das self in eine Instanzmethode? Und rate mal warum du self auch in Klassenmethoden benutzen kannst, nur ist dort self die MetaClass und nicht die Instanz. Zitat:
Genau das versuchst du nämlich in deinem Code, noch klarer kann ich das nun wirklich nicht ausdrücken. ;) |
Re: class function <> normale function mit Klassenzuge
Zitat:
Wie auch immer. Wenn es hier nur um normale Funktionen gehen würde würde ich dir zustimmen. Aber nicht so:
Delphi-Quellcode:
Du hast ja recht, das Self definiert ist, aber wo kommt es her??
tmp :=TSortedList.Create;
tmp.Compare :=@TIntTest.Compare; Zitat:
Zitat:
Es kann ja wohl nicht sein, dass es eine Unmöglichkeit ist class-Functions aufzurufen. Und noch ein Problem habe ich mir der Sache: Wenn ich mit F7 da durchsteppe, wird meine class-Function schon aufgerufen bevor ich sie jemals aufrufe. WTF? |
Re: class function <> normale function mit Klassenzuge
Hallo,
folgendes zu diesem Thema: TObjectList ist von TList abgeleitet, und TList hat die Methode Sort, der eine Adresse auf eine selbst zu erstellende Funktion übergeben wird, die 2 Objekte vergleicht (mehr in der Delphi Hilfe und TList - Sort). Beispiel:
Delphi-Quellcode:
Gruß,
program Project1;
{$APPTYPE CONSOLE} uses sysutils, Contnrs; type TIntTest =class public v: integer; end; function CompareObjects(Item1, Item2: pointer): integer; begin {CompareObject} result := 0; if TIntTest(Item1).v < TIntTest(Item2).v then result := -1 else if TIntTest(Item1).v > TIntTest(Item2).v then result := 1; end; {CompareObjects} var i: integer; MeineListe: TObjectList; MeinObject: TIntTest; begin try MeineListe := TObjectList.Create; // Testobject anlegen for i := 0 to 10 do begin MeinObject := TIntTest.Create; MeinObject.v := Random(100); MeineListe.Add(MeinObject); end; writeln('Vorher:'); for i := 0 to MeineListe.Count - 1 do writeln(TIntTest(MeineListe[i]).v); MeineListe.Sort(CompareObjects); writeln('Nachher:'); for i := 0 to MeineListe.Count - 1 do writeln(TIntTest(MeineListe[i]).v); readln; // Aufräumen... for i := 0 to MeineListe.Count - 1 do begin MeinObject := TIntTest(MeineListe[i]); MeinObject.Free; end; finally MeineListe.Free; end; end. Gunter |
Re: class function <> normale function mit Klassenzuge
Zitat:
Zitat:
2. Aber die Suche in der DelphiPraxis ergibt 4 Threads bei mir, wobei die letzten beide das gut erklären. Zitat:
Zitat:
Zitat:
Wie würdest du folgendes Problem lösen: Du hast ein Bohrloch mit metrischen Schraubgewinde. Dazu stehen dir eine passende Schraube zur Verfügung sowie eine Nietmaschine, deren Nieten den gleichen Umfang haben. Womit würdest du nun ein Blech mit Loch an dem Loch mit Gewinde anbringen? In deinem Code machst du es zZ mit der Niete obwohl der Compiler sich sogar dagegen wehrt. Sort() gibt fest vor, welche Art von Procedure/Funktion er in welcher Form haben will. Dies braucht er auch, damit er so den Aufruf tätigen kann und somit auch fest weiss wieviele Parameter er übergeben muss und auch entsprechend wann abräumen muss. Wenn du nun aber ganz stur mit deiner Niete (Class Method) kommst, dann wird das nix. Sort will keine Class Procedure und somit steht es hier ausser Frage unbedingt eine nehmen zu wollen. Sort gibt dir vor, wie deine Sortierungsfunktion auszusehen hat - wenn du das nicht willst oder die Class Procedure nutzen willst, dann implementiere Sort komplett selber. Und zu deiner Grundaussage zu kommen: Sort ruft die Procedure auf und nicht du, somit kannst du auch nicht einen Parameter zusätzlich übergeben. |
Re: class function <> normale function mit Klassenzuge
Zitat:
Zitat:
Zitat:
Aber vielleicht kannst du ja mal einen Links posten. Zitat:
... Vom Rest deines Beitrages lese ich, dass du mir schreiben willst, dass dies:
Delphi-Quellcode:
falsch ist. Aber WIE mache ich es denn richtig???
TSortedList =class(TObjectList)
public Compare: function(o1,o2: TObject):integer; // hier procedure Sort; @heuckeg: Wenn ich bednke, wie oft ich schon kritisiert habe, dass Delphi eine solche Funktion nicht hat und mir nie jemand wiedersprochen hat, ist das ganz schön überraschend, dass sowas mal kommt. Aber gut zu wissen, dann kann ich ja eigentlich auch die benutzen ;-) |
Re: class function <> normale function mit Klassenzuge
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz