delphi - 为什么当 btn 为 NIL 时我可以访问 btn.Caption?
问题描述
为什么这段代码不会崩溃?T
是零。Caption
如果T
是,如何访问nil
?
procedure Crash;
VAR T: TButton;
begin
T:= NIL;
T.Caption:= ''; <---------- this works
end;
解决方案
该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
,因此不会崩溃。
推荐阅读
- ios - Show Local push notification unless user taps on it
- reporting-services - PowerBI Server - View reports in mobile format
- android - 为什么我的图像视图会在具有不同横向布局文件的方向更改时消失?
- reactjs - React HighChart 示例
- c# - 在 C# WPF 中将某些文本复制到剪贴板时出错
- php - 如何在不呈现 httpException 页面的情况下使用 symfony 捕获异常
- python - 在 Geopandas 中进行交叉时出现 TopologyException 问题?
- delphi - 将带有证书处理的 2007 C++Builder SOAP 代码移至 Delphi2018-Indy10
- php - 带有 PayPal REST API 的信用卡
- sas - Proc Report - 两个表的行