为什么当btn为NIL时我可以访问btn.Caption?

时间:2018-07-03 18:50:21

标签: delphi delphi-xe7

为什么此代码不会崩溃? T为零。如果CaptionT,如何访问nil

procedure Crash;                                                                          
VAR T: TButton;
begin
 T:= NIL;
 T.Caption:= ''; <---------- this works
end;

1 个答案:

答案 0 :(得分:20)

TButton控件是Win32 Button控件的包装。它使用Windows消息传递系统对其进行操作。这样做的核心方法TControl.Perform()具有内置的保护措施,以防Selfnil时发送消息:

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;

Caption是一个属性,其设置方法使用非虚拟的TControl.GetText()TControl.SetText()方法,可以安全地调用nil对象,因为它们的功能依赖于发送向控件发送的各种消息(WM_GETTEXTLENWM_SETTEXT),仅涉及局部变量或传递的参数。因此,nil时不会访问实际对象,因此不会崩溃。