AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Individuelle, eigene Messages erzeugen und abarbeiten
Thema durchsuchen
Ansicht
Themen-Optionen

Individuelle, eigene Messages erzeugen und abarbeiten

Ein Thema von FriendOfDelphi · begonnen am 8. Dez 2010 · letzter Beitrag vom 9. Mär 2011
Antwort Antwort
Seite 1 von 2  1 2      
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#1

Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 16:26
Delphi-Version: 5
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 .WndProc(var Message: TMessage) aufgerufen und man kann innerhalb der Prozedur darauf reagieren.
Was mache falsch, wenn a) .WndProc nicht aufgerufen wird oder wenn b) var Message nicht gleich Msg von PostMessage ist?
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 20:58
Kannst du dein Problem bitte noch mal genauer erläutern?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#3

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 21:32
Kannst du dein Problem bitte noch mal genauer erläutern?
Ich erzeuge mit PostMessage(HWND(hUser), hUser, 0, 0); eine Windows-Message.

In meiner Klasse habe ich eine eigene .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?
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 21:45
Hast du auch eine Nachrichtenschleife, die die Nachrichten aus der Nachrichtenschlange abholt und die WndProc weitergibt?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 22:02
Ich handhabe das immer so:

-- EDIT: Funktionierender Code drei Posts weiter unten.

Hat bisher immer geklappt.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k ( 8. Dez 2010 um 22:40 Uhr)
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#6

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 22:21
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?
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#7

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 22:26
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.
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 22:39
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 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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k ( 8. Dez 2010 um 22:44 Uhr)
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#9

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Dez 2010, 22:56
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 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 procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE; verzichten?

Verwende Delphi 5.
AllocateHWnd kennt der Compiler nicht...
Herzlichen Gruß
FriendOfDelphi

Geändert von FriendOfDelphi ( 8. Dez 2010 um 22:59 Uhr)
  Mit Zitat antworten Zitat
FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#10

AW: Individuelle, eigene Messages erzeugen und abarbeiten

  Alt 8. Mär 2011, 14:20
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 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 procedure OnMyMessage(var Msg: TMessage); message WM_MY_MESSAGE; verzichten?

Verwende Delphi 5.
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 AllocateHWnd unter Delphi 5 realisieren?
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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