Почему я могу получить доступ к btn.Caption, когда btn равен NIL? - PullRequest
0 голосов
/ 03 июля 2018

Почему этот код не падает? T - ноль. Как можно получить доступ к Caption, если T равно nil?

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

1 Ответ

0 голосов
/ 03 июля 2018

Элемент управления 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, таким образом, нет сбоя.

...