Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why I can access btn.Caption when btn is NIL?

Why this code does not crash? T is nil. How it is possible to access Caption if T is nil?

procedure Crash;                                                                          
VAR T: TButton;
begin
 T:= NIL;
 T.Caption:= ''; <---------- this works
end;
like image 345
Server Overflow Avatar asked Jul 03 '18 18:07

Server Overflow


1 Answers

The TButton control is a wrapper around the Win32 Button control. It uses the Windows messaging system to operate upon it. And the core method for doing so, TControl.Perform(), has a built in safeguard against sending messages if Self is 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 is a property whose setter uses the non-virtual TControl.GetText() and TControl.SetText() methods, which can be safely called upon nil objects, as their functionality rely on sending various messages (WM_GETTEXTLEN and WM_SETTEXT) to the control, and only involve local variables or passed parameters. So the actual object is not accessed when nil, thus no crash.

like image 52
Dalija Prasnikar Avatar answered Oct 16 '22 06:10

Dalija Prasnikar