AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Methodenzeiger für Methoden in Klassen/Objekten

Methodenzeiger für Methoden in Klassen/Objekten

Ein Thema von David Martens · begonnen am 27. Sep 2012 · letzter Beitrag vom 4. Okt 2012
Antwort Antwort
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#1

Methodenzeiger für Methoden in Klassen/Objekten

  Alt 27. Sep 2012, 18:37
Delphi-Version: XE
Ich habe eine Combobox Komponenten für mehrere Spalten geschrieben. In dieser Komponente gibt es folgende Porperty:

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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#2

AW: Methodenzeiger für Methoden in Klassen/Objekten

  Alt 27. Sep 2012, 18:50
Wie ist TSortCompare deklariert und was für ein Typ ist ComboBox.CustomSortCompareFunction[1]?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Methodenzeiger für Methoden in Klassen/Objekten

  Alt 27. Sep 2012, 18:55
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 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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#4

AW: Methodenzeiger für Methoden in Klassen/Objekten

  Alt 27. Sep 2012, 20:15
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#5

AW: Methodenzeiger für Methoden in Klassen/Objekten

  Alt 4. Okt 2012, 11:59
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.

    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 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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#6

AW: Methodenzeiger für Methoden in Klassen/Objekten

  Alt 4. Okt 2012, 12:19
Das 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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Okt 2012 um 12:23 Uhr)
  Mit Zitat antworten Zitat
David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#7

AW: Methodenzeiger für Methoden in Klassen/Objekten

  Alt 4. Okt 2012, 12:45
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:14 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