У меня есть форма, которую я использую, чтобы показать некоторую информацию в течение нескольких секунд. Хорошо ли форма освободиться? Могу ли я запустить таймер в конструкторе, а затем вызвать self.free в событии таймера? Или это потенциально может привести к неприятностям?Delphi: Это нормально для формы, чтобы освободить его?
ответ
Кроме того, с формой вы можете назвать выпуск.
Он отправляет сообщение CM_RELEASE в форму. В качестве реакции он называет Free. Преимущество выпуска заключается в том, что для формы нет сообщений, которые могут привести к сбою.
У меня есть целый набор объектов, которые освобождают себя, и я провел различные тесты на них без каких-либо проблем/утечек. TForm может быть более сложным, но до тех пор, пока Self.Free() является последним сделанным вызовом, вы должны быть в безопасности.
(Для тех, кто задается вопросом, почему на земле у меня есть объект, который освобождает себя, я передаю им систему много, поэтому я реализовал собственную схему подсчета ссылок. Когда последняя ссылка освобождена, поэтому объект освобождается).
Но Self.Free будет почти * никогда * быть последним вызовом, созданным формой, потому что форма почти всегда работает кодом в ответ на какое-то действие пользователя. Вместо этого используйте Release. –
Почему бы просто не использовать интерфейсы для подсчета ссылок? –
Вы можете сделать форму, чтобы освободить себя, когда он закрывается пользователем или код:
procedure TForm27.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TForm27.FormCreate(Sender: TObject);
begin
Timer1.Enabled := True;
end;
procedure TForm27.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Close;
end;
Убедитесь, что вы поставляете владелец в конструкторе упаковывают в остановах приложений и форма не разрушается при время. Владелец освободит форму, прежде чем освободится.
Чем больше я думаю об этом, тем больше мне нравится идея TCloseAction. Может быть, я должен использовать это вместо выпуска ... – Vegar
, если только формы имели свойства DefaultCloseAction, поэтому pone мог автоматически освобождать их, не назначая обработчики событий. –
Это именно то, что делается с интерфейсами.
Да, но вы должны помнить, что TComponent от Delphi переопределяет подсчет ссылок интерфейса, что часто вызывает путаницу. –
Используя интерфейсы, форма будет освобождена, когда она выйдет из совок. Я не хочу этого. Я хочу, чтобы он жил так долго, как он хочет, без каких-либо ссылок на него, а затем освобождал его, когда он показывал его сам. – Vegar
Fabio: Я уверен, что вы могли бы переопределить это. Vegar: Интерфейсы подсчитываются по ссылке, а не по области управления. – Arafangion
+1, Это, ИМХО, единственный чистый способ сделать в этом случае – Fred
Я думаю, что поеду за этим, в сочетании с установкой владельца в качестве дополнительной страховки. – Vegar