• delphi的procedure of object


    delphi的procedure of object(一个特殊的指针类型)
        理论:     //适用于实现不是某一特定过程或函数
              type 
                   TNotifyEvent = procedure(Sender: TObject) of object; 
          首先:procedure 也是类型,可以理解为过程类型,定义过程的参数结构,而具体的实现可以动态赋值 
     onclick那样例子: 
         声明:  onclick= procedure(Sender: TObject,a :integer) of object;以后你就可以把TNotifyEvent作为过程用了,而不用考虑它实现什么功能,你想onclik  里用户写了什么,都是一样的 
            if assign(onclick) then 
              onclick; 
         这样只要TNotifyEvent可以执行,程序就去执行它,控件就是这样实现事件的 
         procedure 指针占4个字节,保存在过程的地址. procedure of object占8个字节,保存过程的地址和类的地址 
         procedure of object 是类过程(类函数),用法如下: 
             1、与普通函数相同点:可以像一般的函数和过程一样在类的实例里作为对象方法调用; 
             2、与普通函数不同点:可以不通过对象,而是通过类来直接调用。 
        也就是说,一般函数和过程必须通过类的实例(对象)来调用,而类过程(类函数)则可以不必通过该类的实例来调用。通过类来调用函数或者过程,可以定义和实现一些不能或者不适合作为某一特定对象行为的方法。 
      应用:
         delphi中经常见到以下两种定义 
         Type 
             TMouseProc = procedure (X,Y:integer);  //一种普通的过程
             TMouseEvent = procedure (X,Y:integer) of Object;//一种对象方法的类型
    
          两者样子差不多但实际意义却不一样,两者的区别就在于TMouseEvent类型的方法必须在一个对象里。类方法存在一个隐藏参数self,也就是说两者形参不一样,所以不能相互转换 .
       TMouseProc只是单一的函数指针类型; 
       TMouseEvent是对象的函数指针,也就是对象/类的函数/方法
    
     procedure   TForm1.BBB(I:   Integer); 
    begin 
        showmessage( 'BBB: '   +   IntToStr(I)); 
    end;
    
    procedure   TForm1.CCC(I:   Integer); 
    begin 
        showmessage( 'CCC: '   +   IntToStr(I)); 
    end;
    
    procedure   TForm1.Button1Click(Sender:   TObject); 
        type 
            Taaa   =   procedure   (i:integer)   of   object   ; 
    var 
        ap:   Taaa; 
    begin 
        ap   :=   BBB; //这里有一个隐含Self,完整格式: self.BBB;这里把BBB这个方法赋给ap这个变量,注意BBB与ap的声明原型要一样,不然会有错
        ap(1); 
        ap   :=   CCC; 
        ap(2); 
    end;
    
    
    
    
    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, AdvEdit;
    
    type
      TForm1 = class(TForm)
        edt1: TAdvEdit;
        edt2: TAdvEdit;
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }
      public
         procedure myonExit(sender:tobject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    procedure TForm1.myonExit(sender: tobject);
    begin
      if tadvedit(sender).Text='a' then
      begin
        ShowMessage('a');
      end
      else
      if tadvedit(sender).Text='b' then
      begin
        ShowMessage('b');
      end;
    end;
    
    procedure myonExit2(sender:tobject)  ;
     begin
       if tadvedit(sender).Text='c' then
        begin
          ShowMessage('c');
        end
        else
        if tadvedit(sender).Text='d' then
        begin
          ShowMessage('d');
        end;
     end;
    
    procedure TForm1.btn1Click(Sender: TObject);
    type
      x1=procedure(sender:tobject)of object;
      x2=procedure(sender:tobject);
    var
      y1:x1;
      y2:x2;
    begin
      y1:= myonExit; //带隐藏的self
      y2:= myonExit2;//不带隐藏的self
    
      y1(edt1); //edt框是a或b 时弹出 a或b消息框
      y2(edt1); //edt框是c或d 时弹出 c或d消息框
    
      //edt1.OnExit:= myonExit; //not can use myonExit2
    end;
    
    
    
    end.
    书搞进脑袋 创新 创造; 积极
  • 相关阅读:
    Luogu P3919【模板】可持久化数组(可持久化线段树/平衡树)
    线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G
    线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
    CF 610E. Alphabet Permutations
    BZOJ 1227: [SDOI2009]虔诚的墓主人
    BZOJ1009: [HNOI2008]GT考试
    BZOJ3674: 可持久化并查集加强版
    BZOJ3261: 最大异或和
    BZOJ2741: 【FOTILE模拟赛】L
    BZOJ3166: [Heoi2013]Alo
  • 原文地址:https://www.cnblogs.com/tobetterlife/p/12176941.html
Copyright © 2020-2023  润新知