![]() |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Zitat:
Delphi-Quellcode:
müßte ich eine feste Liste für die verschiedenen Windows-Messages fest im Objekt integrieren und wäre dann darauf festgelegt.
procedure AdsRouterCallback( nEvent:Longint ); stdcall;
begin PostMessage(wndHandle, WM_ADSROUTERNOTIFICATION, nEvent, 0); end; Das wollte ich vermeiden. |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Delphi-Quellcode:
oder irgendwie so
TMyObject = class(TComponent)
private FMessageID: LongWord; protected procedure WndProc(Message: TMessage); override; public constructor Create(Owner: TComponent; MessageID: LongWord); property MessageID: LongWord read FMessageID; end; procedure TMyObject.WndProc(Message: TMessage); begin if Message.msg = MessageID then begin // mach was end; end; constructor TMyObject.Create(Owner: TComponent; MessageID: LongWord); begin inherited Create(Owner); FMessageID := MessageID; end; id := WM_APP + 123; obj := TMyObject.Create(nil, id); PostMessage(obj.Handle, id, nEvent, 0); obj.Perform(id, nEvent, 0); |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Zitat:
Ich habe noch zwei Fragen: 1.) Wird die Methode
Delphi-Quellcode:
automatisch aufgerufen, nachdem
.WndProc
Delphi-Quellcode:
ausgeführt wurde?
.Perform
2.)
Delphi-Quellcode:
und damit wohl auch
PostMessage
Delphi-Quellcode:
sollen innerhalb der Klasse aufgerufen werden. Wie muss das dann aussehen?
.Perform
|
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
WndProc ist der MessageHandler für alle Messages, die an Deine Komponente geschickt werden. Das bedeutet, dass sowohl PostMessage als auch Perform dazu führen (sollten), dass WndProc mit der entsprechenden Message durchlaufen wird. Falls nicht, hast Du irgend etwas falsch gemacht ;)
[edit] Achja, dazu müsste Deine Komponente aber von TControl abgeleitet sein, wenn ich nicht irre. [/edit] |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Also so wurde das über eine fest verknüpfte Message gemacht:
Delphi-Quellcode:
Die Windows-Message
[...schnipp...]
TMeineKlasse = class(TWinControl) procedure WMAdsDeviceNotification(var Message: TMessage); message WM_ADSDEVICENOTIFICATION; //feste Zuordnung von Methode zur Windows-Message [...schnipp...] Procedure NotificationCallback( pAddr:PAmsAddr; pNotification:PAdsNotificationHeader; hUser:Longword ); stdcall; begin PostMessage( HWND(hUser), WM_ADSDEVICENOTIFICATION, 0, 0); end; [...schnipp...]
Delphi-Quellcode:
ruft natürlich nur die Methode
message WM_ADSDEVICENOTIFICATION
Delphi-Quellcode:
auf.
procedure WMAdsDeviceNotification(var Message: TMessage)
Deshalb habe ich das jetzt folgendermaßen geändert:
Delphi-Quellcode:
Um diese feste Zuordnung aufzulösen, soll eine eigene Windows-Message, mit der bei der Erzeugung des Objektes übergebenen Message-ID ("lwMessageID") gesendet werden.
Procedure NotificationCallback( pAddr:PAmsAddr;
pNotification:PAdsNotificationHeader; hUser:Longword ); stdcall; begin PostMessage(HWND(hUser), lwMessageID , 0, 0); ???.Perform(lwMessageID, 0, 0); //Hier weiß ich nicht weiter end; Das
Delphi-Quellcode:
ist wohl richtig.
PostMessage
Aber anschließend muss ja noch
Delphi-Quellcode:
mit der entsprechenden Message durchlaufen werden.
WndProc
Das löst man mit
Delphi-Quellcode:
aus, richtig?
Perform(lwMessageID, 0, 0)
Hier weiß ich nicht weiter. |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Auch PostMessage sollte WndProc auslösen, wenn ich keinen Denkfehler mache. Innerhalb von WndProc kannst Du doch dann die übergebene Message prüfen und dementsprechend reagieren.
|
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Zitat:
Delphi-Quellcode:
eingefügt.
protected
procedure WndProc(Message: TMessage); override; Bei
Delphi-Quellcode:
meldet der Compiler den Fehler "Deklaration von 'WndProc' unterscheidet sich von vorheriger Deklaration."
override;
Deshalb habe ich das
Delphi-Quellcode:
gegen ein
override;
Delphi-Quellcode:
ausgetauscht.
overload;
Und die Methode definiert:
Delphi-Quellcode:
Soweit, so gut. Der Compiler meldet keinen Fehler.
procedure TMeineKlasse.WndProc(Message: TMessage);
begin if Message.msg = MessageID then begin // mach was ShowMessage('test'); end; end; Aber bei der Methodendefinition fehlen die "blauen" Punkte. Die Methode wird also nicht mitcompiliert. :( |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Wenn der Compiler meckert, tauscht man override einfach gegen overload? Eine sehr kreative Vorgehensweise. Wie wäre es denn mit
Delphi-Quellcode:
Nun könntest Du in der überladenen Methode einfach auf Deine Message prüfen und falls kein Treffer, inherited aufrufen, das sollte dann schon passen.
protected
procedure WndProc(var Message: TMessage); override; |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Zitat:
Ich habe jetzt noch folgendes Problem:
Delphi-Quellcode:
Ich kann die Property/Eigenschaft
[...schnipp...]
TMeineKlasse = class(TWinControl) procedure WMAdsDeviceNotification(var Message: TMessage); message WM_ADSDEVICENOTIFICATION; //feste Zuordnung von Methode zur Windows-Message private { Private-Deklarationen } FMessageID: LongWord; [...schnipp...] public { Public-Deklarationen } property MessageID: LongWord read FMessageID; [...schnipp...]
Delphi-Quellcode:
in der Prozedur
TMeineKlasse.MessageID
Delphi-Quellcode:
nicht verwenden.
Procedure NotificationCallback( pAddr:PAmsAddr;
pNotification:PAdsNotificationHeader; hUser:Longword ); stdcall; begin PostMessage(HWND(hUser), TMeineKlasse.MessageID , 0, 0); end; Der Compiler meldet den Fehler "Methodenbezeichner erwartet". Kennt er die zu dem Zeitpunkt noch nicht? |
AW: Wie kann ein Zeiger auf eine Funktion als Paramater übergeben werden?
Du brauchst eine Methode. Eine solche gehört immer zu einer Klasse.
Delphi-Quellcode:
procedure Wuppdi; //reguläre Prozedur
procedure TEineKlasse.Wuppdi; //Methode der Klasse TEineKlasse |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:02 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