"Classic"-Compiler mögen diese Deklaration nicht.
Also mit anderen Worten:
static ist kein Schlüsselwort, sondern wird als Feldname innerhalb des Objektes interpretiert. Daher die - völlig korrekte - Fehlermeldung!
Es geht aber doch (gerade probiert mit Delphi 5) - mit einem ganz tiefen Griff in die Trickkiste:
Delphi-Quellcode:
type
TMyObject = class(...)
...
end;
TMyObjectList = class(TObjectList)
public
procedure MySort;
published
{class} function CompareKey1(Item1{, Item2}: TMyObject): Integer;
end;
{class} function TMyObjectList.CompareKey1(Item1{, Item2}: TMyObject): Integer;
begin
Result:=Mein_Vergleich(TMyObject(self),Item1); //!!!
end;
procedure TMyObjectList.MySort;
begin
Sort(MethodAddress('CompareKey1'));
end;
Und es funktioniert tatsächlich!
Trick 1:
Beim Aufruf von
Sort in der Methode
MySort wird lediglich die Methodenadresse übergeben - also wie bei einer herkömmlichen Prozedur/Funktion. Da es sich dabei nur um einen Zeiger handelt, akzeptiert das der Compiler ohne Widerspruch.
Wichtig: Damit die Methodenadresse gefunden werden kann, muss sie als
published deklariert werden - ansonsten muss man
RTTI-Mechanismen bemühen.
Trick 2:
Da ist es bei
CompareKey1 trotz Lüge an den Compiler um eine Methode handelt, gibt es beim Aufruf einen "unsichtbaren" Parameter - nämlich
self. Der ist bei herkömmlichen Objektmethoden mit einem Zeiger auf das Objekt belegt - bei Klassenmethoden eben mit der Klasse, in der sich die Methode befindet. Ich "mißbrauche" ihn einfach zur Übergabe des ersten Items. Das geht gut, weil es sich in allen Fällen um Zeiger handelt. Und da ist es völlig egal, was darin enthalten ist.