Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Individuelle, eigene Messages erzeugen und abarbeiten (https://www.delphipraxis.net/156604-individuelle-eigene-messages-erzeugen-und-abarbeiten.html)

FriendOfDelphi 8. Dez 2010 15:26

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:
BOOL PostMessage(
    HWND hWnd,   // handle of destination window
    UINT Msg,   // message to post
    WPARAM wParam,   // first message parameter
    LPARAM lParam    // second message parameter
   );
Soweit ich weiter verstanden habe, wird dadurch automatisch
Delphi-Quellcode:
.WndProc(var Message: TMessage)
aufgerufen und man kann innerhalb der Prozedur darauf reagieren.
Was mache falsch, wenn a)
Delphi-Quellcode:
.WndProc
nicht aufgerufen wird oder wenn b)
Delphi-Quellcode:
var Message
nicht gleich
Delphi-Quellcode:
Msg
von
Delphi-Quellcode:
PostMessage
ist?

Luckie 8. Dez 2010 19:58

AW: Individuelle, eigene Messages erzeugen und abarbeiten
 
Kannst du dein Problem bitte noch mal genauer erläutern?

FriendOfDelphi 8. Dez 2010 20:32

AW: Individuelle, eigene Messages erzeugen und abarbeiten
 
Zitat:

Zitat von Luckie (Beitrag 1067200)
Kannst du dein Problem bitte noch mal genauer erläutern?

Ich erzeuge mit
Delphi-Quellcode:
PostMessage(HWND(hUser), hUser, 0, 0);
eine Windows-Message.

In meiner Klasse habe ich eine eigene
Delphi-Quellcode:
.WndProc
-Methode implementiert:
Delphi-Quellcode:
procedure TMeineKlasse.WndProc(var Message: TMessage);
begin
  begin
    // mach was
  end;
  inherited;
end;
Soweit ich das verstanden habe müßte diese nach dem Senden aufgerufen werden.
Aber das passiert nicht.
Was mache ich falsch?

Luckie 8. Dez 2010 20:45

AW: Individuelle, eigene Messages erzeugen und abarbeiten
 
Hast du auch eine Nachrichtenschleife, die die Nachrichten aus der Nachrichtenschlange abholt und die WndProc weitergibt?

s.h.a.r.k 8. Dez 2010 21:02

AW: Individuelle, eigene Messages erzeugen und abarbeiten
 
Ich handhabe das immer so:

-- EDIT: Funktionierender Code drei Posts weiter unten.

Hat bisher immer geklappt.

FriendOfDelphi 8. Dez 2010 21:21

AW: Individuelle, eigene Messages erzeugen und abarbeiten
 
Zitat:

Zitat von Luckie (Beitrag 1067215)
Hast du auch eine Nachrichtenschleife, die die Nachrichten aus der Nachrichtenschlange abholt und die WndProc weitergibt?

Nein. Ich wußte nicht, dass man eine solche braucht.
Wie muss ich das denn machen?

FriendOfDelphi 8. Dez 2010 21:26

AW: Individuelle, eigene Messages erzeugen und abarbeiten
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1067220)
Ich handhabe das immer so:
Delphi-Quellcode:
const
  WM_MY_MESSAGE = WM_USER + 100;

type
TTest = class(TObject)
private
  procedure WndProc(var Msg: TMessage);
  procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE;
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;
Hat bisher immer geklappt.

Das habe ich auch schon so hinbekommen.
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.

s.h.a.r.k 8. Dez 2010 21:39

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:
WndProc()
angesprungen.

Hier die funktionierende Version.
Delphi-Quellcode:
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;
-- EDIT: Dann bau halt eine passende if-Abfrage in die WndProc-Methode ein.

FriendOfDelphi 8. Dez 2010 21:56

AW: Individuelle, eigene Messages erzeugen und abarbeiten
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1067244)
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:
WndProc()
angesprungen.

Hier die funktionierende Version.
Delphi-Quellcode:
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;
-- EDIT: Dann bau halt eine passende if-Abfrage in die WndProc-Methode ein.

Kann ich dann ganz auf
Delphi-Quellcode:
procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE;
verzichten?

Verwende Delphi 5.
Delphi-Quellcode:
AllocateHWnd
kennt der Compiler nicht... :(

FriendOfDelphi 8. Mär 2011 13:20

AW: Individuelle, eigene Messages erzeugen und abarbeiten
 
Zitat:

Zitat von FriendOfDelphi (Beitrag 1067249)
Zitat:

Zitat von s.h.a.r.k (Beitrag 1067244)
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:
WndProc()
angesprungen.

Hier die funktionierende Version.
Delphi-Quellcode:
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;
-- EDIT: Dann bau halt eine passende if-Abfrage in die WndProc-Methode ein.

Kann ich dann ganz auf
Delphi-Quellcode:
procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE;
verzichten?

Verwende Delphi 5.
Delphi-Quellcode:
AllocateHWnd
kennt der Compiler nicht... :(

Da das Thema immer noch aktuell ist, möchte ich diesen Post noch einmal aufleben lassen.
Wie kann ich denn den Lösungsansatz von s.h.a.r.k ohne
Delphi-Quellcode:
AllocateHWnd
unter Delphi 5 realisieren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Seite 1 von 2  1 2      

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