为什么此代码不会崩溃? T
为零。如果Caption
是T
,如何访问nil
?
procedure Crash;
VAR T: TButton;
begin
T:= NIL;
T.Caption:= ''; <---------- this works
end;
答案 0 :(得分:20)
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;
Caption
是一个属性,其设置方法使用非虚拟的TControl.GetText()
和TControl.SetText()
方法,可以安全地调用nil
对象,因为它们的功能依赖于发送向控件发送的各种消息(WM_GETTEXTLEN
和WM_SETTEXT
),仅涉及局部变量或传递的参数。因此,nil
时不会访问实际对象,因此不会崩溃。