zoukankan      html  css  js  c++  java
  • Delphi中Self问题和方法赋值问题

    开发环境Delphi7

    self报错问题

     1 unit Unit1;
     2 
     3 interface
     4 
     5 uses
     6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     7   Dialogs, StdCtrls,SysClass_u, ExtCtrls;
     8 
     9 type
    10  
    11   
    12   TForm1 = class(TForm)
    13     Button1: TButton;
    14     Button2: TButton;
    15     Panel1: TPanel;
    16     Button4: TButton;
    17     procedure Button1Click(Sender: TObject);
    18     procedure Button2Click(Sender: TObject);
    19     procedure Button4Click(Sender: TObject);
    20 
    21   private
    22     { Private declarations }
    23   public
    24     { Public declarations }
    25   end;
    26 
    27 var
    28   Form1: TForm1;
    29 
    30 procedure sssss(aObj,Sender: Tobject);
    31 
    32 implementation
    33 
    34 uses
    35   Unit3;
    36 
    37 {$R *.dfm}
    38 procedure sssss(aObj,Sender: Tobject);
    39 begin
    40   ShowMessage(TForm(aObj).name); //如果Button4点击过 ,再点击Button2,这句也会报错  //和Button1Click中注释的那句一样
    41   ShowMessage(TForm(Sender).name);
    42   ShowMessage('000');
    43 end;
    44 procedure TForm1.Button1Click(Sender: TObject);
    45 var
    46   s:Integer;
    47 begin
    48   //为了证明Self赋值问题,self其实是一个隐形参数
    49   //ShowMessage(self.name);会报错
    50   ShowMessage(IntToStr(Integer(@self))); //这个比下面的这个Integer(@Sender)大四个字节
    51   ShowMessage(IntToStr(Integer(@Sender)));//这个比下面的这个Integer(@s)大四个字节
    52   ShowMessage(IntToStr(Integer(@s)));
    53   //由这几个地址充分证明了self是一个隐形参数
    54   //学过汇编应该清楚栈相关的问题,栈的内存大小是定死的,是由程序编译时就定义好了,集成开发环境都有对栈的大小进行设置;
    55   //栈是由高地址向低地址延伸的,比如当前栈顶地址为200208,压一个32位的Integer进去后,当前栈顶为200204
    56   //不做过多解释
    57   //仅做个笔记
    58 
    59   ShowMessage((Sender as TComponent ).name);
    60 end;
    61 
    62 procedure TForm1.Button2Click(Sender: TObject);
    63 var
    64   s:TNotifyEvent;
    65 begin
    66   s:=Button1.onClick;
    67   sss(@s);
    68 end;
    69 
    70 procedure TForm1.Button4Click(Sender: TObject);
    71 var
    72   s:TNotifyEvent;
    73 begin
    74   @Button1.onClick:=@sssss;//把sssss赋值给Button1.onClick
    75 end;
    76 
    77 end.
     1 unit Unit3;
     2 
     3 interface
     4 
     5 uses
     6   Classes,Forms;
     7   procedure sss(pp:Pointer);
     8 
     9 implementation
    10 
    11 uses
    12   Unit2;
    13 
    14 procedure sss(pp:Pointer);
    15 begin
    16   Form2:=TForm2.Create(Application);
    17   @Form2.OnMyProc:=pp;
    18   Form2.Show;
    19 end;
    20 end.
     1 unit Unit2;
     2 
     3 interface
     4 
     5 uses
     6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     7   Dialogs, StdCtrls,SysClass_u;
     8 
     9 type
    10   TForm2 = class(TForm)
    11     Button1: TButton;
    12     procedure FormDestroy(Sender: TObject);
    13     procedure Button1Click(Sender: TObject);
    14   private
    15     FOnMyProc:TNotifyEvent;
    16     { Private declarations }
    17   public
    18     property OnMyProc :TNotifyEvent read FOnMyProc write FOnMyProc;
    19     { Public declarations }
    20   end;
    21 
    22 var
    23   Form2: TForm2;
    24 implementation
    25 
    26 {$R *.dfm}
    27 
    28 procedure TForm2.FormDestroy(Sender: TObject);
    29 begin
    30   OnMyProc:=nil;
    31 end;
    32 
    33 procedure TForm2.Button1Click(Sender: TObject);
    34 begin
    35   OnMyProc(Sender );
    36 end;
    37 
    38 end.
  • 相关阅读:
    Objective-C Memory Management Being Exceptional 异常处理与内存
    Objective-C Memory Management 内存管理 2
    c语言全局变量与局部变量(当变量重名时)的使用情况
    c语言指针字符串与字符数组字符串的区别
    c语言数组不同初始化方式的结果
    补码的用途
    struts2框架加载配置文件的顺序
    CSS盒子模型
    基于注解整合struts2与spring的时候如果不引入struts2-spring-plugin包自动装配无效
    @Resource注解省略name属性后的行为
  • 原文地址:https://www.cnblogs.com/dmqhjp/p/15688939.html
Copyright © 2011-2022 走看看