Felipe Monteiro de Carvalho schrieb:
On Wed, Oct 19, 2011 at 1:56 PM, Hans-Peter Diettrich
<drdiettri...@aol.com> wrote:
Can somebody explain the purpose of e.g. WindowProc, WndProc and
MainWndProc, in the LCL?

Delphi compatibility. AFAIK WndProc works for messages >= WM_USER

WndProc can preprocess *any* kind of messages, which must be handled in a non-standard way in a specific control, e.g. the TripleClick messages. WndProc finally calls Dispatch, to invoke the implemented message handler of the control, or DefaultHandler for all messages without assigned handlers.

In Delphi MainWndProc calls the handler assigned to WindowProc, enclosed in
try-finally and try-except blocks. WindowProc typically is initialized with
WndProc. Why is this implemented differently in the LCL, and how?

I remember that some people did not like how this worked in Delphi so
it didn't work like that, then we had a define to pass messages >=
WM_USER to WndProc. I think the define later got changed into always
active. I don't remember anyone asking for messages < WM_USER, so
probably till now they are not passed to WndProc. I'm just typing from
memory, so I could be wrong in parts of this.

I fear that Delphi compatibility is broken, when MainWndProc does nothing. When it is not removed, it should do what Delphi does, so that it can be used in code ported from Delphi. Otherwise it should be removed, together with WindowProc, so that every attempt to use it will result in compiler errors.


I also don't understand the parallel or different WM..., LM..., CM... and CN... message IDs. Is that separation related to messages handled (or not handled) by widgets or by the LCL? Or have the LM... message IDs been added only to prevent cyclic unit references?

DoDi


--
_______________________________________________
Lazarus mailing list
Lazarus@lists.lazarus.freepascal.org
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to