AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eine Message senden

Offene Frage von "Koller"
Ein Thema von Koller · begonnen am 11. Jun 2006 · letzter Beitrag vom 13. Jun 2006
Antwort Antwort
Seite 1 von 2  1 2      
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#1

Eine Message senden

  Alt 11. Jun 2006, 20:20
Hallo!

Ich möchte innerhalb meines Programms eine Nachricht senden. Wenn diese empfangen wird, soll eine Procedure ausgeführt werden. Leider bin ich mithilfe der Suchfunktionen der DP und auch der EE nicht wesentlich weiter gekommen. Folgenden Codeschnipsel habe ich:
Delphi-Quellcode:
const
  WM_LOESCHMICH = WM_USER + 123; // die Message (immer als WM_USER + irgendeine Zahl deklarieren)

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure LoeschMich(var Msg: TMessage); message WM_LOESCHMICH; // der MessageHandler
  public
    { Public-Deklarationen }
  end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Handle, WM_LOESCHMICH, Integer(Sender), 0); // an Form senden (Handle), in WParam den Button stecken
end;

procedure TForm1.LoeschMich(var Msg: TMessage);
begin
  TObject(Msg.WParam).Free; // WParam nach TObject casten und freigeben
end;
Fragen: Ich möchte
Delphi-Quellcode:
const
  WM_LOESCHMICH = WM_USER + 123; // die Message (immer als WM_USER + irgendeine Zahl deklarieren)
innerhalb einer Klasse deklarieren. Wo muss dann hin? Und was hat WM_User zu bedeuten?
Genauso wenig verstehe ich folgende Zeile:
TObject(Msg.WParam).Free; // WParam nach TObject casten und freigeben Wer kann mir helfen?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Eine Message senden

  Alt 11. Jun 2006, 20:33
Hi.

Zu deiner ersten Frage: deine Konstante gehört dahin wo sie ist. Man deklariert keine Konstanten in einer Klasse.

Zu deiner zweiten Frage: Der Pointer auf den Button wurde in wParam als 32-bit Ganzzahl transportiert und muss wieder als TObject interpretiert werden, sonst kommst du nicht an seine Methodentabelle.

Grüße vom marabu
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#3

Re: Eine Message senden

  Alt 11. Jun 2006, 20:39
Und was hat das WM_User zu bedeuten?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Eine Message senden

  Alt 11. Jun 2006, 20:41
Alle message numbers unterhalb WM_USER sind bereits reserviert bzw. in Verwendung.

marabu
  Mit Zitat antworten Zitat
Koller

Registriert seit: 22. Mär 2005
59 Beiträge
 
#5

Re: Eine Message senden

  Alt 12. Jun 2006, 11:15
Zitat von marabu:
Alle message numbers unterhalb WM_USER sind bereits reserviert bzw. in Verwendung.

marabu
Was sind denn message numbers?
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#6

Re: Eine Message senden

  Alt 12. Jun 2006, 11:27
Zitat von Koller:
Was sind denn message numbers?
Alle Nachrichten (Messages) - z.B. Mausbewegung/Click, Neudarstellungen, Tastaturdruck, Windows Start/Ende, etc. - werden anhander einer Nummber (Message ID) identifiziert. Einige Tausend davon sind festen Ereignissen (System, Windows, User, etc.) zugeordnet. Die Nummern ab WM_USER stehen den Programmen zur freien Verfügung für eigene Messages.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#7

Re: Eine Message senden

  Alt 12. Jun 2006, 11:42
Hi!

Dürfte ich an dieser Stelle eine kleine Verständnisfrage einschieben?

Was passiert, wenn ich eine Message in meinem Programm als WM_USER+37 definiere und ein anderes Programm will auch ne Message mit WM_USER+37 haben? Werden dann beide "Events" ausgelöst?


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Eine Message senden

  Alt 12. Jun 2006, 11:50
Hi Frederic,

deine custom messages haben nur lokale Bedeutung. Willst du sie programmübergreifend verwenden, dann musst du dir eine message number von Windows zuteilen lassen. Siehe auch fensternachrichten unterscheidung

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#9

Re: Eine Message senden

  Alt 12. Jun 2006, 11:58
Hi!

ah, Perfekt! Danke!


Ciao Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#10

Re: Eine Message senden

  Alt 12. Jun 2006, 12:01
Zitat von marabu:
deine custom messages haben nur lokale Bedeutung. Willst du sie programmübergreifend verwenden, dann musst du dir eine message number von Windows zuteilen lassen.
Musst nicht, aber solltest. Die Nachricht sendet man normalerweise nur an das eigene Programm, aber eine der Schwächen der alten API ist es, dass man diese Messages auch an andere Anwendungen senden kann. Kennt man deren internen Nachrichtenaufbau, kann man somit auf "falsche" Botschaften senden.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  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 13:38 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