Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / fpc-pascal / 2011-04

Message methods

4 messages · 4 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Unknown author

ZeelandNet Webmail Hi,

I'm trying to understand how message
methods work in FPC. For this I created a simple app that shows a message. I also created a second (identical form) and I expected that all message methods related to MY_MESSAGE would be executed when I pressed either one or the other button. This did not happen however even when dispatching through the Application object. Can someone explain me please?

Regards, Darius

 TForm1 = class(TForm)
 Button1: TButton;
Button2: TButton;
 procedure Button1Click(Sender: TObject);
 procedure
Button2Click(Sender: TObject);
 procedure MessageReceiver(var msg:
TMsg); message MY_MESSAGE;
 private
 { private declarations }
 public
 {
public declarations }
 end;
var
 Form1: TForm1;
implementation
{$R
*.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender:
TObject);
begin
 msg.MSGID := MY_MESSAGE;
 msg.Data := 'Hello World!';
Dispatch(msg);
end;
procedure TForm1.Button2Click(Sender:
TObject);
begin
 Form2.Show;
end;
procedure TForm1.MessageReceiver(var
msg: TMsg);
begin
 ShowMessage(msg.Data);
end;
Mattias Gaertner
to Unknown author

 
 

hat am 19. April 2011 um 17:48 geschrieben:

Show quoted text 10 lines
Hi, I'm trying to understand how message methods work in FPC. For this I created a simple app that shows a message. I also created a second (identical form) and I expected that all message methods related to MY_MESSAGE would be executed when I pressed either one or the other button. This did not happen however even when dispatching through the Application object. Can someone explain me please? Regards, Darius

 
Make sure TMsg starts with
 
TMsg = record
  MsgID: DWord;
  ...
 
 
 

Show quoted text 33 lines
  TForm1 = class(TForm)     Button1: TButton;     Button2: TButton;     procedure Button1Click(Sender: TObject);     procedure Button2Click(Sender: TObject);     procedure MessageReceiver(var msg: TMsg); message MY_MESSAGE;   private     { private declarations }   public     { public declarations }   end; var    Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); begin   msg.MSGID := MY_MESSAGE;   msg.Data := 'Hello World!';   Dispatch(msg); end; procedure TForm1.Button2Click(Sender: TObject); begin   Form2.Show; end; procedure TForm1.MessageReceiver(var msg: TMsg); begin   ShowMessage(msg.Data); end;   

 
Mattias
 

Darius Blaszyk
to Mattias Gaertner
Mattias Gaertner wrote 17 lines
hat am 19. April 2011 um 17:48 geschrieben: > Hi, > > I'm trying to understand how message methods work in FPC. For this I created a simple app that shows a message. I also created a second (identical form) and I expected that all message methods related to MY_MESSAGE would be executed when I pressed either one or the other button. This did not happen however even when dispatching through the Application object. Can someone explain me please? > > Regards, Darius Make sure TMsg starts with TMsg = record MsgID: DWord; ...

I used a cardinal instead, so no issues there, although I expected to get two messages as I have two forms open (code for both identical to the code shown below). Instead when I dispatch the message only the class which dispatches the message receives it. The other class never does. So how is the message handler traversing the classes within the process? I must be missing something obvious.

Darius

Show quoted text 46 lines
> > > TForm1 = class(TForm) > Button1: TButton; > Button2: TButton; > procedure Button1Click(Sender: TObject); > procedure Button2Click(Sender: TObject); > procedure MessageReceiver(var msg: TMsg); message MY_MESSAGE; > private > { private declarations } > public > { public declarations } > end; > > var Form1: TForm1; > > implementation > > {$R *.lfm} > > { TForm1 } > > procedure TForm1.Button1Click(Sender: TObject); > begin > msg.MSGID := MY_MESSAGE; > msg.Data := 'Hello World!'; > Dispatch(msg); > end; > > procedure TForm1.Button2Click(Sender: TObject); > begin > Form2.Show; > end; > > procedure TForm1.MessageReceiver(var msg: TMsg); > begin > ShowMessage(msg.Data); > end; > Mattias _______________________________________________ fpc-pascal maillist - http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Jorge Aldo G. de F. Junior
to Darius Blaszyk

will it really traverse the classes ?

from what i understood about the manual (and i heavily use that mechanism) it will only trigger the class where you dispatch to, so, self.dispatch(msg) only works for the TForm.

if you need more than that you will need to traverse the component tree yourself. but this is not trully hard to do with tcomponents.

but i may be wrong...

2011/4/19 Darius Blaszyk :

Show quoted text 90 lines
On Apr 19, 2011, at 6:04 PM, Mattias Gaertner wrote: hat am 19. April 2011 um 17:48 geschrieben: Hi, I'm trying to understand how message methods work in FPC. For this I created a simple app that shows a message. I also created a second (identical form) and I expected that all message methods related to MY_MESSAGE would be executed when I pressed either one or the other button. This did not happen however even when dispatching through the Application object. Can someone explain me please? Regards, Darius Make sure TMsg starts with TMsg = record   MsgID: DWord;   ... I used a cardinal instead, so no issues there, although I expected to get two messages as I have two forms open (code for both identical to the code shown below). Instead when I dispatch the message only the class which dispatches the message receives it. The other class never does. So how is the message handler traversing the classes within the process? I must be missing something obvious. Darius   TForm1 = class(TForm)     Button1: TButton;     Button2: TButton;     procedure Button1Click(Sender: TObject);     procedure Button2Click(Sender: TObject);     procedure MessageReceiver(var msg: TMsg); message MY_MESSAGE;   private     { private declarations }   public     { public declarations }   end; var    Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); begin   msg.MSGID := MY_MESSAGE;   msg.Data := 'Hello World!';   Dispatch(msg); end; procedure TForm1.Button2Click(Sender: TObject); begin   Form2.Show; end; procedure TForm1.MessageReceiver(var msg: TMsg); begin   ShowMessage(msg.Data); end; Mattias _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal _______________________________________________ fpc-pascal maillist  -   http://lists.freepascal.org/mailman/listinfo/fpc-pascal