Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Methodenzeiger für Methoden in Klassen/Objekten (https://www.delphipraxis.net/170662-methodenzeiger-fuer-methoden-klassen-objekten.html)

David Martens 27. Sep 2012 17:37

Delphi-Version: XE

Methodenzeiger für Methoden in Klassen/Objekten
 
Ich habe eine Combobox Komponenten für mehrere Spalten geschrieben. In dieser Komponente gibt es folgende Porperty:

Delphi-Quellcode:
property CustomSortCompareFunction[Index : Longint] : TSortCompare read GetCustomSortCompareFunction write SetCustomSortCompareFunction;
Index ist die Spalte.

Das Ganze funktioniert auch super, ABER jetzt will ich die Methode einer Klasse übergeben:

So funktioniert die Zuweisung wenn es eine "eigene" Funktion ist:

Delphi-Quellcode:
function CustomSortCompareFunction(const Str1, Str2: String; SortDirection : TSortDirection): integer;

...

ComboBox.CustomSortCompareFunction[1] := @CustomSortCompareFunction;
aber ich möchte die Funktion an die Klasse binden:

Delphi-Quellcode:
TWertlisteKlasse = class (...)
  function CustomSortCompareFunction(const Str1, Str2: String; SortDirection : TSortDirection): integer;

var
  Wertliste : TWertlisteKlasse;

...

for i := 0 to Wertliste.ColumnCount - 1 do
begin
  ComboBox.AddCol(Wertliste.Column[i]);
end;

...

ComboBox.CustomSortCompareFunction[1] := @Wertliste.CustomSortCompareFunction;
Hat jemand eine Idee wie ich das bewerkstelligen kann?

Danke David

Uwe Raabe 27. Sep 2012 17:50

AW: Methodenzeiger für Methoden in Klassen/Objekten
 
Wie ist TSortCompare deklariert und was für ein Typ ist ComboBox.CustomSortCompareFunction[1]?

shmia 27. Sep 2012 17:55

AW: Methodenzeiger für Methoden in Klassen/Objekten
 
Der Funktionszeigertyp TSortCompare ist ja so deklariert:
Delphi-Quellcode:
type
  TSortCompare = function(const Str1, Str2: String; SortDirection : TSortDirection): integer;
Jetzt hängst du hinten ein
Delphi-Quellcode:
of object
ran und es entsteht ein Methodenzeiger:
Delphi-Quellcode:
type
  TSortCompare = function(const Str1, Str2: String; SortDirection : TSortDirection): integer of object;
Ein Methodenzeiger besteht intern aus zwei Zeigern mit folgendem Aufbau:
Delphi-Quellcode:
  TMethod = record
    Code: Pointer; // zeigt auf die Adresse der Funktion/Procedure
    Data: Pointer; // zeigt auf das Objekt, dass implizit als "self" übergeben wird
  end;

himitsu 27. Sep 2012 19:15

AW: Methodenzeiger für Methoden in Klassen/Objekten
 
Und bei der Zuweisung kann man das @ auch man einfach "weglassen".

xxx of object = Methode oder Klassenmethode
xxx = Prozedur/Funktion
reference to xxx = anonyme Methode, Prozedur/Funktion, Methode oder Klassenmethode (also alles)

David Martens 4. Okt 2012 10:59

AW: Methodenzeiger für Methoden in Klassen/Objekten
 
Entschuldigt die späte Antwort, ich war ein paar Tage nicht da.

Zu euren Antworten:

@Uwe:
Delphi-Quellcode:
type
  TSortDirection = (sdGridAscending, sdGridDescending);
Soll nur die Sortierrichtung angeben.

Delphi-Quellcode:
    property CustomSortCompareFunction[Index : Longint] : TSortCompare read GetCustomSortCompareFunction write SetCustomSortCompareFunction;
Hier sollen die Vergleichsfunktionen für die einzelnen Spalten angegeben werden können.

@shmia und himitsu:

Es geht mir ja gerade darum die Vergleichsfunktion in eine Klasse zu kapseln, ein
Delphi-Quellcode:
of object;
funktioniert dann aber nicht.

nochmal zur Erklärung:
Delphi-Quellcode:
TWertlisteKlasse = class (...)
  function CustomSortCompareFunction(const Str1, Str2: String; SortDirection : TSortDirection): integer of object;
end;
In dieser Klasse (von TList) sind mehrere (DB)-Spalten enthalten. Nun wollte ich die Vergleichsfunktion für eine Spalte an das Objekt binden, da es was mit den Daten zu tun hat und alleine keinen weiteren Sinn macht. Das ist dann auch wirklich OO-Programmierung.

himitsu 4. Okt 2012 11:19

AW: Methodenzeiger für Methoden in Klassen/Objekten
 
Das
Delphi-Quellcode:
of object
ist für die Methodenzeiger (Typen/Variablen) ala TSortCompare, um damit anzugeben "was" in dieser Variable gespeichert werden kann,
also ob nur Funktionen/Prozeduren (nix), nur Methoden/Klassenmethoden (of object) oder alles Mögliche (reference to).

Ob es eine "Prozedur" auch eine Methode ist, entscheidet sich nicht durch soeinen Zusatz, sondern ausschließlich dadurch, wo sie deklariert ist, also z.B. innerhalb einer Klasse.

David Martens 4. Okt 2012 11:45

AW: Methodenzeiger für Methoden in Klassen/Objekten
 
Vielen Dank, manchmal sieht man den Wald vor lauter Bäumen nicht.

nochmal zusammengefasst:
Delphi-Quellcode:
type
  TSortCompare = function (const Str1, Str2: String; SortDirection : TSortDirection): integer of object; // of object, ist ja auch logisch
  TSortDirection = (sdGridAscending, sdGridDescending);

  TWertlisteKlasse = class (...)
    function CustomSortCompareFunction(const Str1, Str2: String; SortDirection : TSortDirection): integer;
  end;

  TMyComboBox = class (...)
    property CustomSortCompareFunction[Index : Longint] : TSortCompare read GetCustomSortCompareFunction write SetCustomSortCompareFunction;
  end;



  MyComboBox.CustomSortCompareFunction[1] := WertlisteKlasse.CustomSortCompareFunction; // ohne "of object" geht es hier schief
Ich hab's mal aufs wesentliche reduriert.

Danke nochmal an himitsu für den Hinweis.


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