[fpc-pascal]About "callbacks method" of a class

Mattias Gaertner nc-gaertnma at netcologne.de
Wed Nov 13 16:43:04 CET 2002


On Wed, 13 Nov 2002 22:37:55 +0800
mili <milimeter at 163.com> wrote:

> Hello, everybody
> 
>   I am using gtk2forpascal. I want to program as follows:
> >>>>>
> TButton = class(Tobject)
>   private
>     FButton:PGtkWidget;
>   public
>     constructor Create;
>     destructor  Destroy;
>     procedure   Callback_OnClick(widget:PGtkWidget; data:Object); cdecl;
> end;//TButton
> 
> constructor TButton.Create;
> begin
>   inherited Create;
>   FButton:=gtk_button_new_with_label('Click Me!');
>   gtk_widget_show(FButton);
>   g_signal_connect(G_OBJECT(FButton),'clicked',
>     TGCALLBACK(@Callback_OnClick),self);
>   ...
> end;//TButton.Create
> 
> procedure TButton.Callback_OnClick(widget:PGtkWidget; data:Object); cdecl;
> begin
>   ......
> end;//TButton.Callback_OnClick
> <<<<<
> 
> But I can't comiler this program. When I connect the signal with a
> subroutine which is not a method, the compilation works. Can anybody
> confirm me that: In class definition, We can't use "@MethodName" and in
> one method there's no way to directly connect a signal with another method
> in the same class? In short, is there "callbacks method"?

Right, procedures and methods (= procedures of object) are not compatible.
You have to write your own mapper. For example:

type
  TButton = class
    procedure OnClickCallback(Widget: PGtkWidget);
  end;

procedure TButton.OnClickCallback(Widget: PGtkWidget);
begin

end;

procedure Callback_TButton_OnClick(widget:PGtkWidget; data:Object); cdecl;
begin
  TButton(Data).OnClickCallback(Widget);
end;

begin
  g_signal_connect(G_OBJECT(FButton),'clicked',
    TGCALLBACK(@Callback_TButton_OnClick),FButton);
end.


> And another problem, I found the following code style in Lazarus project 
> sources:
> >>>>>
> procedure TSomeClass.FuncName(...);
>   procedure FuncNameEmbeded(...);
>   begin
>     .....
>   end;//FuncNameEmbeded
> begin
> end;//TSomeClass.FuncName
> <<<<<
> 
> I know it's "nested procedure". But the information from fpc
> documentations is too little. can you tell me more about it? Why the
> following code can compile but will run with "Access violation"?
> >>>>>
> procedure TSomeClass.FuncName(...);
>   procedure FuncNameEmbeded(...);
>   begin
>     .....
>     writeln(FValue);//Here FValue is a member (Integer) of TSomecalss
>     .....
>   end;//FuncNameEmbeded
> begin
> end;//TSomeClass.FuncName
> <<<<<

Looks like good code.
Can you send more (class definition and code, that calls FuncName)?


Mattias Gaertner




More information about the fpc-pascal mailing list