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

标签 delphi delphi-xe7

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

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

最佳答案

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

关于delphi - 为什么当 btn 为 NIL 时我可以访问 btn.Caption?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51161223/

相关文章:

delphi - 根据拖动区域动态调整控件大小

德尔福火猴网格: Invisible Columns When Navigating

delphi - Delphi 中对象的 RTTI

android - 如何将我的应用程序保留在前台?

delphi - 德尔福的 C 联盟

delphi - 如何将结构内的 C 联合转换为 Delphi

Delphi 声明项目中的单元 (DPR) 整个解决方案可见

delphi - 在 Delphi XE7 中使用 NetEncoding 对字符串进行 Base64 解码?

我的 Delphi XE7 应用程序的 Android 屏幕截图

delphi - 为什么 Delphi zlib 和 zip 库在 64 位下如此慢?