![]() |
Delphi-Version: 5
Individuelle, eigene Messages erzeugen und abarbeiten
Hallo Wissende,
ich bin am verzweifeln. Kann mal jemand kurz und knapp erläutern, wie man eigene, individuelle Windows-Messages erzeugt und abarbeitet. Herausgefunden habe ich bis jetzt folgendes: Windows-Messages erzeugt man u. a. durch
Delphi-Quellcode:
Soweit ich weiter verstanden habe, wird dadurch automatisch
BOOL PostMessage(
HWND hWnd, // handle of destination window UINT Msg, // message to post WPARAM wParam, // first message parameter LPARAM lParam // second message parameter );
Delphi-Quellcode:
aufgerufen und man kann innerhalb der Prozedur darauf reagieren.
.WndProc(var Message: TMessage)
Was mache falsch, wenn a)
Delphi-Quellcode:
nicht aufgerufen wird oder wenn b)
.WndProc
Delphi-Quellcode:
nicht gleich
var Message
Delphi-Quellcode:
von
Msg
Delphi-Quellcode:
ist?
PostMessage
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Kannst du dein Problem bitte noch mal genauer erläutern?
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Delphi-Quellcode:
eine Windows-Message.
PostMessage(HWND(hUser), hUser, 0, 0);
In meiner Klasse habe ich eine eigene
Delphi-Quellcode:
-Methode implementiert:
.WndProc
Delphi-Quellcode:
Soweit ich das verstanden habe müßte diese nach dem Senden aufgerufen werden.
procedure TMeineKlasse.WndProc(var Message: TMessage);
begin begin // mach was end; inherited; end; Aber das passiert nicht. Was mache ich falsch? |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Hast du auch eine Nachrichtenschleife, die die Nachrichten aus der Nachrichtenschlange abholt und die WndProc weitergibt?
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Ich handhabe das immer so:
-- EDIT: Funktionierender Code ![]() Hat bisher immer geklappt. |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Wie muss ich das denn machen? |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Aber: Ich möchte die Verbindung zwischen der aufrufenden Windows-Message und der durch diese aufgerufenen Prozedur nicht fest in der Klasse implementieren. Die Message-ID soll dem Objekt beim Create mit übergeben werden können. Daher kann ich nicht mit einer Konstanten arbeiten. |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Ich muss auch noch schnell zurück rudern! Das Problem an meinem Code ist, dass das (Window-)Handle fehlt, an welches die Nachricht geschickt werden kann. Denn nur dann wird die
Delphi-Quellcode:
angesprungen.
WndProc()
Hier die funktionierende Version.
Delphi-Quellcode:
-- EDIT: Dann bau halt eine passende if-Abfrage in die WndProc-Methode ein.
const
WM_MY_MESSAGE = WM_USER + 100; type TTest = class(TObject) private FHandle : HWND; procedure WndProc(var Msg: TMessage); procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE; public constructor Create(); reintroduce; destructor Destroy(); override; end; procedure TTest.WndProc(var Msg: TMessage); begin Dispatch(Msg); end; procedure TTest.OnStartupMessage(var Msg: TMessage); begin if (Msg.Msg = WM_MY_MESSAGE) then begin end; end; constructor TTest.Create(); begin inherited Create(); FHandle := Classes.AllocateHWnd(Self.WndProc); end; destructor TTest.Destroy(); begin DeallocateHWnd(FHandle); inherited Destroy(); end; |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Delphi-Quellcode:
verzichten?
procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE;
Verwende Delphi 5.
Delphi-Quellcode:
kennt der Compiler nicht... :(
AllocateHWnd
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Wie kann ich denn den Lösungsansatz von s.h.a.r.k ohne
Delphi-Quellcode:
unter Delphi 5 realisieren?
AllocateHWnd
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Wer suchet, der findet:
![]() |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Ich habe sogar beide Units mit eingebunden; Unit Forms und Unit Classes. Der Compiler meldet trotzdem den Fehler "Undefinierter Bezeichner: 'AllocateHWnd'". |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Und die Delphi-Hilfe findet auch nichts? Da müsste die Unit nämlich drinstehen.
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Hi,
Hast du das Classes. vor AllocateHWnd entfernt oder durch Forms. ersetzt? Sonst sucht der Compiler nämlich weiterhin in der Unit Classes |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Stimmt, das hatte ich gar nicht gesehen. Dann wird Forms also wohl doch richtig sein.
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Damit meldet der Compiler den Fehler "Undefinierter Bezeichner: 'AllocateHWnd'". Nach Deinem Tipp habe ich die Unit "Classes" ausdokumentiert und die Unit "Forms" belassen. Damit meldet der Compiler den Fehler "Undefinierter Bezeichner: 'Classes'". Beides in der Zeile
Delphi-Quellcode:
FHandle := Classes.AllocateHWnd(Self.WndProc);
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Genau aus der Zeile sollst Du das "Classes." rausnehmen.
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Funktioniert; der Compiler meldet keine Fehler mehr. :) Wie funktioniert denn das jetzt; wie kann ich das Ganze jetzt zum Leben erwecken? Muss ich zur Laufzeit mit
Delphi-Quellcode:
eine eigene Message mit den entsprechenden Parametern erzeugen, die dann dafür sorgt das die zugeordnete Prozedur (hier: OnStartupMessage(...)) aufgerufen wird und in dieser dann die übergebene ID abfragen? :?:
PostMessage(...)
|
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Und nun nochmal zu den Grundlagen, was individuelle/eigene Messages angeht...
Hier erstmal die wichtigesten Bereiche: ![]() ![]() $C000 bis $FFFF mit ![]() der Rest, also alles unter WM_USER und über $FFFF ist Windows vorbehalten. Für den kleinen Anwendungsprogrammierer interessiert hier vorallem WM_USER+x und RegisterWindowMessage. Bei WM_USER und WM_APP müssen die Programmierer aufpassen, daß sie möglichst keine Werte doppelt belegen (zumindestens nicht innerhalb von Klassen/Windows, welche diese Messages empfangen könnten. Bei RegisterWindowMessage muß man nur aufpassen, daß der Name möglichst eindeutig ist und somit keine doppelten Message-IDs auftreten können. RegisterWindowMessage ist eigentlich vorwiegend für Nachrichten von Anwendung zu einer anderen Anwendung vorgesehn, aber man kann sie auch innerhalb einer Anwendung nutzen. |
AW: Individuelle, eigene Messages erzeugen und abarbeiten
Zitat:
Aber wie verwende ich denn die eigenen Messages? Wenn ich die Vorgehensweise wie oben im Link in der MSDN beschrieben, in Delphi übertrage, meldet das Programm beim ausführen in der Zeile
Delphi-Quellcode:
eine Zugriffsverletzung.
uFindReplaceMsg := RegisterWindowMessage(PChar(WM_MY_MESSAGE));
Kannst Du bitte ein Stück Beispielcode posten? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 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