Delphi: является ли этот код правильной процедурой обнуления указателя в FormClose? - PullRequest
0 голосов
/ 02 июня 2018

IDE: Delphi XE6.

Моя основная форма создает другую форму, и эта форма создает экземпляр TFormZoom.Кажется, все работает безупречно.

Я просто хочу быть уверен, что моя процедура обнуления указателя в FormClose не искажает некоторые внутренние действия Delphi.

procedure TFormZoom.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;

  // if I did not set it to nil here, the next time I would create this form I would get
  // EAccessViolation, because my other code checks for this form <> nil ...

  FormZoom := nil;
end;

Теперь я думаюо том, хорош ли этот подход.Я не получаю ни компиляции, ни ошибок времени выполнения, этот вопрос - просто техническая.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Иногда событие OnClose может вообще не срабатывать.Поэтому, кроме установки Action := caFree;, я бы переместил другой код в события OnCloseQuery или OnDestroy.

FormZoom := nil;

должен быть в событии OnDestroy, по моему мнению, поскольку могут быть некоторые другие события, например, в элементах управления,который запускается при закрытии и вызывает нарушение прав доступа, если переменная формы уже равна nil.

0 голосов
/ 02 июня 2018

Если вы установите точку останова на end; из TFormZoom.FormClose и используете F8 для перехода к коду VCL, который вызывал ваш обработчик событий onclose, вы увидите, что он вызывался из TCustomForm.DoClose, который былранее звонили с TCustomForm.Close.В этот момент можно увидеть следующий код (в Delphi 10.2.3)

DoClose(CloseAction);
if CloseAction <> caNone then
if Application.MainForm = Self then Application.Terminate
else if CloseAction = caHide then Hide
else if CloseAction = caMinimize then WindowState := wsMinimized
else Release;

Поскольку вы устанавливаете переменную Action в caFree, это означает, что .Release формы будет вызыватьсякод VCL.Мой вывод таков: установка глобального var FormZoom на ноль, не вызовет никаких проблем.

...