为什么这段代码不会崩溃?T
为零。如何才能访问Caption
if T
is nil
?
procedure Crash;
VAR T: TButton;
begin
T:= NIL;
T.Caption:= ''; <---------- this works
end;
The TButton
控件是 Win32 Button 控件的包装。它使用 Windows 消息系统对其进行操作。这样做的核心方法是TControl.Perform()
,有一个内置的保护措施,可以防止在以下情况下发送消息:Self
is 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
是一个属性,其 setter 使用非虚拟TControl.GetText()
and TControl.SetText()
方法,可以安全地调用nil
对象,因为它们的功能依赖于发送各种消息(WM_GETTEXTLEN
and WM_SETTEXT
) 到控件,并且只涉及局部变量或传递的参数。所以当nil
,因此不会发生崩溃。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)