[Lazarus] TControl.Click?

Mattias Gaertner nc-gaertnma at netcologne.de
Sat Oct 1 08:53:31 CEST 2011


On Sat, 01 Oct 2011 03:04:56 +0200
Hans-Peter Diettrich <DrDiettrich1 at aol.com> wrote:

> I don't understand the logic behind TControl.Click:
> 
> procedure TControl.Click;
> begin
>    //DebugLn(['TControl.Click ',DbgSName(Self)]);
>    if (not (csDesigning in ComponentState)) and (ActionLink <> nil) and
>       ((Action=nil) or (@FOnClick <> @Action.OnExecute) or 
> Assigned(FOnClick)) then
>      ActionLink.Execute(Self)
>    else
>    if Assigned(FOnClick) then
>      FOnClick(Self);
> end;
> 
> This IMO will invoke ActionLink.Execute if (a different) FOnClick is 
> assigned - so far okay. But FOnClick will *not* be invoked then (even if 
> different), and it will be invoked *always* in design state.
> 
> Is it really okay to invoke an user-supplied OnClick handler in design 
> state?

No.
User supplied OnClick handlers are fake methods and that's why
"Assigned" is used instead of "FOnClick<>nil". Thus user handlers are
*not* invoked.
Only real methods are invoked. That means custom component handlers are
invoked.


> What about something like this:
> 
>    if (csDesigning in ComponentState) then
>      exit; //nothing called in design state
>    if (ActionLink <> nil)
>      and ((Action=nil) or (@FOnClick <> @Action.OnExecute) then
>      ActionLink.Execute(Self); //only if different from FOnClick
>    if Assigned(FOnClick) then //eventually also: if not handled?
>      FOnClick(Self); //always if assigned
> end;
> 
> I also wonder what's the difference or relationship between Action and 
> ActionLink - can somebody explain? Does ActionLink (when assigned) take 
> precedence over Action?

See TControl.GetAction.
Then lol.

Mattias




More information about the Lazarus mailing list