Method pointer and regular procedure

it2022-05-14  54

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;

 

转载于:https://www.cnblogs.com/shangdawei/archive/2013/04/30/3051802.html

相关资源:数据结构—成绩单生成器

最新回复(0)