zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    python的xpinyin模块:汉字转拼音
    中文报错SyntaxError: Non-UTF-8 code starting with 'xe6' in file
    "底层逻辑”是什么意思?
    【Golang】关于Go中logrus的用法
    【Golang】 关于Go语言中的锁
    【Golang】Go 通过结构(struct) 实现接口(interface)
    【Golang】Go语言之log的使用
    【Golang】Go中时间(time)的用法以及gorm处理时间戳
    【Golang】Go中三个点(...)用法
    一文彻底掌握Apache Hudi异步Clustering部署
  • 原文地址:https://www.cnblogs.com/shangdawei/p/3051802.html
Copyright © 2011-2022 走看看