![]() |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Ich möchte die zuvor beschriebene Lösung dahingehend erweitern, dass die übergebene Methode auf eine Windows Message reagiert.
Also in etwa so: Es existiert eine Klasse die unter anderem Windows Messages abarbeitet. Das Hauptprogramm, welches diese Klasse verwendet, soll der Klasse eine Methode übergeben, die dann ausgeführt wird, wenn die entsprechende Windows Message auftritt. Wie kann ich das realisieren, bzw. wie muss der oben beschriebene Quellcode angepasst werden? :?: |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Mal aus dem Kopf:
Delphi-Quellcode:
type
TOnBestimmteMessage = procedure of object; TDeineKlasse = class private FOnBestimmteMessage: TOnBestimmteMessage; procedure SetOnBestimmteMessage(const value: TOnBestimmteMessage); public procedure MachWas; property OnBestimmteMessage: TOnBestimmteMessage read FOnBestimmteMessage write SetOnBestimmteMessage; end; ... procedure TDeineKlasse.MachWas; begin //irgendwelcher Code if Assigned(FOnBestimmteMessage) then FOnBestimmteMessage; //ggf. weiterer Code end; ... procedure TForm1.FormCreate(Sender: TObject); begin DeineKlasse := TDeineKlasse.Create; DeineKlasse.OnBestimmteMessage := kompatible_Methode; end; |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Zitat:
Ich probiers mal: 1.0) Zuerst wird wieder ein eigener Datentyp definiert:
Delphi-Quellcode:
. Mit diesem kann man nun wieder Variablen deklarieren, die eine Methode darstellen. - Verstanden.
TOnBestimmteMessage = procedure of object;
2.1) Als nächstes wird dann wieder eine Variable/ein Feld von diesem Typ (
Delphi-Quellcode:
) und
FOnBestimmteMessage: TOnBestimmteMessage;
2.2) eine Prozedur
Delphi-Quellcode:
, die die Variable/das Feld setzen kann, deklariert. - Verstanden.
procedure SetOnBestimmteMessage(const value: TOnBestimmteMessage);
3.1) Nun wird die Prozedur
Delphi-Quellcode:
und
procedure MachWas;
3.2) die Eigenschaft/Property
Delphi-Quellcode:
zum Lesen und Schreiben von außerhalb der Klasse deklariert. - Soweit erst einmal verstanden.
property OnBestimmteMessage: TOnBestimmteMessage read FOnBestimmteMessage write SetOnBestimmteMessage;
4.0) Jetzt folgt noch die Definition der Methode "MachWas":
Delphi-Quellcode:
. - Die Methode "MachWas" für sich allein gesehen, habe ich wohl auch verstanden.
procedure TDeineKlasse.MachWas;
begin //irgendwelcher Code if Assigned(FOnBestimmteMessage) then FOnBestimmteMessage; //ggf. weiterer Code end; Die Methode prüft, ob die entsprechende Windows Message aufgetreten ist. Wenn dies der Fall ist, wird die zugewiesene Methode über des Feld
Delphi-Quellcode:
, das eine Methode darstellt ausgeführt, richtig?
FOnBestimmteMessage
Aber wann wird die Methode "MachWas" aufgerufen? Übernimmt Delphi die Erkennung der Windows Message und die automatische Ausführung der Methode "MachWas"? Wo wird Delphi das mitgeteilt? |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Wann die Methode aufgerufen wird, bestimmst Du doch selbst in Deiner Klasse. Nach Deiner eigenen Aussage wäre das dann die Behandlung einer bestimmten Windows-Message, so dass "MachWas" dann ein Message-Handler sein müsste.
|
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Zitat:
Ich mache das mit einer eigenen Message-Handling-Methode. Das ist hier ganz gut erklärt: ![]() Das Ganze funktioniert für ein Objekt auch tadellos. Wenn ich ein zweites, oder weitere Objekte erstelle (instanziiere), wird nur die Windows-Message für das zuletzt erstellte Objekt richtig verarbeitet. Ich habe auch schon eine Vermutung worin das Problem besteht, aber nicht, wie ich es beseitigen kann. Das Problem liegt wahrscheinlich in der Deklaration des Windows-Message-Nummer:
Delphi-Quellcode:
Jedes Objekt erhält in der Klasse dieselbe Windows-Message-Nummer.
[...schnipp...]
const WM = WM_APP + 400; [...schnipp...] Ich müßte die als Parameter mit übergeben. In etwa so:
Delphi-Quellcode:
Da dies aber eine Konstante sein muss und diese ganz am Anfang definiert wird, meckert der Compiler natürlich, dass er die Variable nicht kennt.
[...schnipp...]
const WM_variabel = WM_APP + iWMNr; //iWMNr soll der übergebene Parameter sein. [...schnipp...] Gibt es dafür eine andere Lösungsmöglichkeit? |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Delphi-Quellcode:
Notfalls kann man auch über
protected
procedure WndProc(var Message: TMessage); override; if Message.Msg = WM_APP + x then ![]() Siehe das Bild in "Understanding the message-handling system" WndProc ist die erste Anlaufstelle, wo alles durchkommt und (vermutlich) danach werden die entsprechenden Dispatch-Methoden ala
Delphi-Quellcode:
abgearbeitet.
procedure NAME(var Message: TWM_TYPE); message WM_MESSAGE;
|
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Zitat:
Delphi-Quellcode:
den Wert von "WM_MESSAGE" von außerhalb der Klasse als Parameter zu übergeben?
procedure NAME(var Message: TWM_TYPE); message WM_MESSAGE;
|
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Nein.
Dieses ist nunmal eine unveränderliche Konstante, welcher an dieser Stelle wärend des Compilierens genutzt wird. Zur Laufzeit läßt sich dieses dann eben nicht mehr ändern. Aber genau dafür kann man eben das WndProc (WindowProcedur) nutzen, wo alles vorbeikommt. |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Zitat:
Ist das nicht eher ein Reagieren auf eine schon vorhandene Windows-Message-Nr.? Ich möchte doch vielmehr jedem Objekt bei der Erzeugung/Instanziierung eine eigene Windows-Message-Nr. mitgeben, auf die es dann reagiert. |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Du gibst z.B. deinem Constructor die Message-ID mit, speicherst sie im Objekt und vergleichst dann damit via IF in WndProc und schon hat jedes Objekt seine eigene Nummer.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 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