Delphi 为什么btn为零时我可以访问btn.Caption?
为什么这个代码没有崩溃<代码>T为零。如果Delphi 为什么btn为零时我可以访问btn.Caption?,delphi,delphi-xe7,Delphi,Delphi Xe7,为什么这个代码没有崩溃T为零。如果T为nil,如何访问Caption procedure Crash; VAR T: TButton; begin T:= NIL; T.Caption:= ''; <---------- this works end; 程序崩溃; 变量T:T按钮; 开始 T:=零; 标题:='' TButton控件是Wi
T
为nil
,如何访问Caption
procedure Crash;
VAR T: TButton;
begin
T:= NIL;
T.Caption:= ''; <---------- this works
end;
程序崩溃;
变量T:T按钮;
开始
T:=零;
标题:='' 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;
函数TControl.Perform(Msg:Cardinal;WParam:WParam;LParam:LParam):LRESULT;
变量
消息:TMessage;
开始
Message.Msg:=Msg;
Message.WParam:=WParam;
Message.LParam:=LParam;
消息。结果:=0;
如果Self-nil那么//@KenWhite我也这么想,但我只是测试了一下,不管我通过了什么值,它仍然不会崩溃。在内部,它成功地为WM_SETTEXT
和CM_TEXTCHANGED
发送Windows消息。因为它是Windows控件的包装器,使用消息设置实际值。它有安全防护装置,防止在nil控件上发送消息。当然,它也可以工作,因为属性setter不是虚拟的。@Ken将标题设置为空字符串肯定会起作用。