On Sat, 01 Oct 2011 15:43:34 +0200 Hans-Peter Diettrich <[email protected]> wrote:
> Mattias Gaertner schrieb: > > On Sat, 01 Oct 2011 08:39:42 +0100 > > Martin <[email protected]> wrote: > > > >> On 01/10/2011 07:53, Mattias Gaertner wrote: > >>> On Sat, 01 Oct 2011 03:04:56 +0200 > >>> Hans-Peter Diettrich<[email protected]> 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; > >>>> > >>>> > >> Maybe I overlook something, but > >> @FOnClick is the address of the variable holding the method reference > >> (or nil) > >> so is @Action.OnExecute > >> > >> So when can they ever be equal? > > > > You are right. > > Really? > > AFAIK method pointers are handled differently in Delphi and FPC, No. You could say: Method pointers are handled differently in mode Delphi and mode ObjFPC. And since the LCL uses mode objfpc the @event is unambiguous and therefore wrong as Martin wrote. >[...] > >> Should that maybe compare FOnClick <> Action.OnExecute ? > > > > That would miss difference in Data. > > I added a CompareMem. > > IMO the comparison worked as-is, as found in several places in the LCL. > > What about: > > function TControlActionLink.IsOnExecuteLinked: Boolean; > begin > Result := inherited IsOnExecuteLinked > and (FClient.OnClick = Action.OnExecute); Thanks for pointing out. Fixed by using CompareMethods. > end; > > > >> Also is that supposed to be a shortcut, saving the call, or is that > >> indeed supposed to modify behaviour? > > > > Good question. > > I guess it would be enough to check (not (csDesigning in > > ComponentState)) and (ActionLink <> nil). > > > > Maybe the Delphi docs have an answer. > > No :-( It seems Delphi calls OnClick when it is set and differs from the Action. I did that. > >> Even if the 2 callbacks are pointing to the same method, calling > >> Action.OnExecute, will call the callback with Sender=TheAction, while > >> FOnClick gets the current object. > > Looks as if Execute should be overridden in TControlActionLink! Why? How? Mattias -- _______________________________________________ Lazarus mailing list [email protected] http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
