首页 > 解决方案 > 为什么当 btn 为 NIL 时我可以访问 btn.Caption?

问题描述

为什么这段代码不会崩溃?T是零。Caption如果T是,如何访问nil

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

标签: delphidelphi-xe7

解决方案


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,因此不会崩溃。


推荐阅读