Действительно ли безопасно использовать Свободный вместо Выпуска для модальных форм в Delphi?

Для WampServer 2.2 с Apache 2.4.2 я получил:

Options Indexes FollowSymLinks MultiViews
AllowOverride all
Require local
13
задан Vadim Kotov 17 August 2017 в 16:01
поделиться

3 ответа

Да, использовать безопасно Бесплатно после вызова ShowModal .

Случаи, когда вам нужно использовать Release , - это случаи, когда вы находитесь в середине обработчика события (например, OnClick ), когда дальнейшая обработка после события будет иметь для доступа к форме. В этом случае вызов Release вместо этого отправляет сообщение CM_RELEASE , которое не освобождает событие до тех пор, пока обработчик события не будет завершен и управление не будет возвращено насосу сообщений ( ProcessMessages ] / Application.Run ). ShowModal не возвращается до тех пор, пока обработчик событий не завершит работу и управление не заставит его выполнить резервное копирование стека,

17
ответ дан 1 December 2019 в 21:12
поделиться

Это зависит. Free Форма не вызывает обработчики событий, которые выполняет Release , и любые сообщения, которые могли быть отправлены в форму и помещены в очередь, не будут обработаны. Таким образом, хотя во многих, а возможно, и в большинстве случаев вызов Free (или FreeAndNil ) будет работать нормально, это может привести к весьма странному поведению по, казалось бы, случайным причинам.

Альтернатива, которая заключается в том, что Я бы посоветовал в событии OnClose установить для Action значение caFree, например:

procedure FormClose(Sender : TObject; Action : TCloseAction)
begin
  Action := caFree;
end;

Затем вы можете написать такой код:

TMyForm.Create(nil).ShowModal;

И вам не нужно специально освобождать форму, так как она '

6
ответ дан 1 December 2019 в 21:12
поделиться

Безусловно, и вы также можете использовать процедуру FreeAndNil. Подпрограмма FreeAndNil освободит объект только в том случае, если он еще не равен nil, а также установит для него значение nil после освобождения. Если вы позвоните бесплатно прямо на объект, который уже был освобожден, вы получите сообщение о нарушении прав доступа.

MyForm := TMyForm.Create(nil); 
try 
  MyForm.ShowModal; 
finally 
  FreeAndNil(MyForm); 
end;
4
ответ дан 1 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: