![]() |
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:
Index ist die Spalte.
property CustomSortCompareFunction[Index : Longint] : TSortCompare read GetCustomSortCompareFunction write SetCustomSortCompareFunction;
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:
aber ich möchte die Funktion an die Klasse binden:
function CustomSortCompareFunction(const Str1, Str2: String; SortDirection : TSortDirection): integer;
... ComboBox.CustomSortCompareFunction[1] := @CustomSortCompareFunction;
Delphi-Quellcode:
Hat jemand eine Idee wie ich das bewerkstelligen kann?
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; Danke David |
AW: Methodenzeiger für Methoden in Klassen/Objekten
Wie ist TSortCompare deklariert und was für ein Typ ist ComboBox.CustomSortCompareFunction[1]?
|
AW: Methodenzeiger für Methoden in Klassen/Objekten
Der Funktionszeigertyp TSortCompare ist ja so deklariert:
Delphi-Quellcode:
Jetzt hängst du hinten ein
type
TSortCompare = function(const Str1, Str2: String; SortDirection : TSortDirection): integer;
Delphi-Quellcode:
ran und es entsteht ein Methodenzeiger:
of object
Delphi-Quellcode:
Ein Methodenzeiger besteht intern aus zwei Zeigern mit folgendem Aufbau:
type
TSortCompare = function(const Str1, Str2: String; SortDirection : TSortDirection): integer of object;
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; |
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) |
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:
Soll nur die Sortierrichtung angeben.
type
TSortDirection = (sdGridAscending, sdGridDescending);
Delphi-Quellcode:
Hier sollen die Vergleichsfunktionen für die einzelnen Spalten angegeben werden können.
property CustomSortCompareFunction[Index : Longint] : TSortCompare read GetCustomSortCompareFunction write SetCustomSortCompareFunction;
@shmia und himitsu: Es geht mir ja gerade darum die Vergleichsfunktion in eine Klasse zu kapseln, ein
Delphi-Quellcode:
funktioniert dann aber nicht.
of object;
nochmal zur Erklärung:
Delphi-Quellcode:
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.
TWertlisteKlasse = class (...)
function CustomSortCompareFunction(const Str1, Str2: String; SortDirection : TSortDirection): integer of object; end; |
AW: Methodenzeiger für Methoden in Klassen/Objekten
Das
Delphi-Quellcode:
ist für die Methodenzeiger (Typen/Variablen) ala TSortCompare, um damit anzugeben "was" in dieser Variable gespeichert werden kann,
of object
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. |
AW: Methodenzeiger für Methoden in Klassen/Objekten
Vielen Dank, manchmal sieht man den Wald vor lauter Bäumen nicht.
nochmal zusammengefasst:
Delphi-Quellcode:
Ich hab's mal aufs wesentliche reduriert.
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 Danke nochmal an himitsu für den Hinweis. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:29 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