Delphi 为什么btn为零时我可以访问btn.Caption?

Delphi 为什么btn为零时我可以访问btn.Caption?,delphi,delphi-xe7,Delphi,Delphi Xe7,为什么这个代码没有崩溃T为零。如果T为nil,如何访问Caption procedure Crash; VAR T: TButton; begin T:= NIL; T.Caption:= ''; <---------- this works end; 程序崩溃; 变量T:T按钮; 开始 T:=零; 标题:='' TButton控件是Wi

为什么这个代码没有崩溃<代码>T为零。如果
T
nil
,如何访问
Caption

procedure Crash;                                                                          
VAR T: TButton;
begin
 T:= NIL;
 T.Caption:= ''; <---------- this works
end;
程序崩溃;
变量T:T按钮;
开始
T:=零;

标题:=''
TButton
控件是Win32 Button控件的包装器。它使用Windows消息传递系统对其进行操作。这样做的核心方法是
TControl.Perform()
,它有一个内置的保护措施,防止在
Self
nil
时发送消息:

function TControl.Perform(Msg: Cardinal; WParam: WPARAM; LParam: LPARAM): LRESULT;
var
  Message: TMessage;
begin
  Message.Msg := Msg;
  Message.WParam := WParam;
  Message.LParam := LParam;
  Message.Result := 0;

  if Self <> nil then // <-- here
    WindowProc(Message); 

  Result := Message.Result;
end;
函数TControl.Perform(Msg:Cardinal;WParam:WParam;LParam:LParam):LRESULT;
变量
消息:TMessage;
开始
Message.Msg:=Msg;
Message.WParam:=WParam;
Message.LParam:=LParam;
消息。结果:=0;

如果Self-nil那么//@KenWhite我也这么想,但我只是测试了一下,不管我通过了什么值,它仍然不会崩溃。在内部,它成功地为
WM_SETTEXT
CM_TEXTCHANGED
发送Windows消息。因为它是Windows控件的包装器,使用消息设置实际值。它有安全防护装置,防止在nil控件上发送消息。当然,它也可以工作,因为属性setter不是虚拟的。@Ken将标题设置为空字符串肯定会起作用。