2009-04-02 2 views
12

У меня есть форма, которую я использую, чтобы показать некоторую информацию в течение нескольких секунд. Хорошо ли форма освободиться? Могу ли я запустить таймер в конструкторе, а затем вызвать self.free в событии таймера? Или это потенциально может привести к неприятностям?Delphi: Это нормально для формы, чтобы освободить его?

ответ

29

Кроме того, с формой вы можете назвать выпуск.

Он отправляет сообщение CM_RELEASE в форму. В качестве реакции он называет Free. Преимущество выпуска заключается в том, что для формы нет сообщений, которые могут привести к сбою.

+0

+1, Это, ИМХО, единственный чистый способ сделать в этом случае – Fred

+0

Я думаю, что поеду за этим, в сочетании с установкой владельца в качестве дополнительной страховки. – Vegar

1

У меня есть целый набор объектов, которые освобождают себя, и я провел различные тесты на них без каких-либо проблем/утечек. TForm может быть более сложным, но до тех пор, пока Self.Free() является последним сделанным вызовом, вы должны быть в безопасности.

(Для тех, кто задается вопросом, почему на земле у меня есть объект, который освобождает себя, я передаю им систему много, поэтому я реализовал собственную схему подсчета ссылок. Когда последняя ссылка освобождена, поэтому объект освобождается).

+0

Но Self.Free будет почти * никогда * быть последним вызовом, созданным формой, потому что форма почти всегда работает кодом в ответ на какое-то действие пользователя. Вместо этого используйте Release. –

+0

Почему бы просто не использовать интерфейсы для подсчета ссылок? –

16

Вы можете сделать форму, чтобы освободить себя, когда он закрывается пользователем или код:

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; 

Убедитесь, что вы поставляете владелец в конструкторе упаковывают в остановах приложений и форма не разрушается при время. Владелец освободит форму, прежде чем освободится.

+0

Чем больше я думаю об этом, тем больше мне нравится идея TCloseAction. Может быть, я должен использовать это вместо выпуска ... – Vegar

+1

, если только формы имели свойства DefaultCloseAction, поэтому pone мог автоматически освобождать их, не назначая обработчики событий. –

0

Это именно то, что делается с интерфейсами.

+1

Да, но вы должны помнить, что TComponent от Delphi переопределяет подсчет ссылок интерфейса, что часто вызывает путаницу. –

+0

Используя интерфейсы, форма будет освобождена, когда она выйдет из совок. Я не хочу этого. Я хочу, чтобы он жил так долго, как он хочет, без каких-либо ссылок на него, а затем освобождал его, когда он показывал его сам. – Vegar

+0

Fabio: Я уверен, что вы могли бы переопределить это. Vegar: Интерфейсы подсчитываются по ссылке, а не по области управления. – Arafangion

 Смежные вопросы

  • Нет связанных вопросов^_^