WeG*_*ars 11 delphi delphi-xe7
为什么这段代码不会崩溃?T没有.它是如何可以访问Caption是否T是nil?
procedure Crash;
VAR T: TButton;
begin
T:= NIL;
T.Caption:= ''; <---------- this works
end;
Run Code Online (Sandbox Code Playgroud)
Dal*_*kar 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;
Run Code Online (Sandbox Code Playgroud)
Caption是一个属性,其setter使用非虚拟TControl.GetText()和TControl.SetText()方法,可以安全地调用nil对象,因为它们的功能依赖于向控件发送各种消息(WM_GETTEXTLEN和WM_SETTEXT),并且只涉及局部变量或传递的参数.所以当实际对象不被访问时nil,因此没有崩溃.
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |