Method pointer and regular procedure

This is the difference between a "procedure" and a "procedure of object"

The OnClick is defined as a TNotifyEvent:

type TNotifyEvent = procedure(Sender: TObject) of object;

You cannot assign a procedure to the OnClick as it is the wrong type. It needs to be a procedure of object.

You can wrap your procedures into a class. This class might look like this in a separate unit:

 

unit CommonUnit;

interface

uses
  Dialogs;

type
  TMenuActions = class // dummy class to hold event handlers
  public
    class procedure BrowseCategoriesClick(Sender: TObject);
  end;

implementation

{ TMenuActions }

class procedure TMenuActions.BrowseCategoriesClick(Sender: TObject);
begin
  ShowMessage('BrowseCategoriesClick');
end;

end

 

And to assign the action to a menu item in a different unit is enough to use this:

 

uses
  CommonUnit;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PopupMenuItem1.OnClick := TMenuActions.BrowseCategoriesClick;
end;

 

 

Update:

Updated to use class procedures (instead of object methods) by David's suggestion.
For those who want to use the object methods with the need of object instance, follow this version of the post.

 

unit CommonUnit;

interface

uses
  Dialogs;

type
  TMenuActions = class
  public
    procedure BrowseCategoriesClick(Sender: TObject);
  end;

var
  MenuActions: TMenuActions;

implementation

{ TMenuActions }

procedure TMenuActions.BrowseCategoriesClick(Sender: TObject);
begin
  ShowMessage('BrowseCategoriesClick');
end;

initialization
  MenuActions := TMenuActions.Create;
finalization
  MenuActions.Free;

end.

 

Use a procedure as a fake method

 

procedure MyClick(Self, Sender: TObject);
begin
  //...
end;

var
  M: TMethod;
begin
  M.Data := nil;
  M.Code := @MyClick;
  MyMenuItem.OnClick := TNotifyEvent(M);
end;

 

use record methods ( global variable )

 

type
  TMyEventHandler = record
    procedure OnConnectionError(Sender: TObject; E: EDAError; var Fail: Boolean);
    procedure OnConnectionLost(Sender: TObject; Component: TComponent; ConnLostCause: TConnLostCause; var RetryMode: TRetryMode);
  end;

procedure TMyEventHandler.OnConnectionError(Sender: TObject; E: EDAError; var Fail: Boolean);
begin
  ....
end;

procedure TMyEventHandler.OnConnectionLost(Sender: TObject; Component: TComponent; ConnLostCause: TConnLostCause; var RetryMode: TRetryMode);
begin
  ....
end;

var
  EventHandler: TEventHandler;

......

mydb.OnError := EventHandler.OnConnectionError;
mydb.OnConnectionLost := EventHandler.OnConnectionLost;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值