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

  • A+

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; 


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.


:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: