![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Form1.Destroy??? [WinXP]
glGLU © (2004-07-12 13:34:00)Подскажите как правильно выгрузить форму после ее использования?
Создаю я эту форму из другой форму такApplication.CreateForm(TForm1, Form1);
Form1.ShowModal;
а как и где ее нужно удалить после использования???
VMcL (2004-07-12 15:22:00) [1]2 all
<offtopic>
- Вы за рыбой?
- Нет, я за рыбой.
- А я думал, что Вы за рыбой.
</offtopic>
Rem (2004-07-12 15:14:00) [2]procedure TForm1.OnClose(Sender: TObject; var Action: TCloseAction);
begin
// что тебе нужно делать
// можно и закрытие формы запретить Action := caNone;
Action := caFree;
end;
P.S. О чем это мы дискутируем?
Snip (2004-07-12 15:07:00) [3]ну это само сабой, я просто поправил
Rem (12.07.04 14:47) [15]
что такое в данном случае не катит...
Anatoly Podgoretsky (2004-07-12 15:05:00) [4]Snip © (12.07.04 14:56) [17]
Это может использоваться где угодно, но тогда невозможно
Snip © (12.07.04 13:39) [1]
if Form1.ModalResult=mrOk then
//что тее надо делать
Form1.Free;
Snip (2004-07-12 14:56:00) [5]
> OnClose:
> Action := caFree;
это я помню для MDI использовалось....
Тимохов (2004-07-12 14:48:00) [6]я, кстати, тоже забил на совет борланда - free вызываю для диалоговых форм.
недиалоговые мне и дестроить то никогда не приходилось :)))
Rem (2004-07-12 14:47:00) [7]OnClose:
Action := caFree;
Семен Сорокин (2004-07-12 14:39:00) [8]2Anatoly Podgoretsky
я не спорю что нужно всегда вызывать Release :))
[8] это ответ на [6]
я даже сам всегда Free вызываю для модальных форм, просто здесь описал ситуацию для чего может пригодиться Release.
Anatoly Podgoretsky (2004-07-12 14:35:00) [9]Release он для использования внутри формы, а это не тот случай.
Anatoly Podgoretsky (2004-07-12 14:34:00) [10]Семен Сорокин © (12.07.04 14:29) [8]
А зачем этот код рассматривать, сулчай конкретный - модальная форма. Возрат буудет только после обработки всех сообщений очереди. Но деже если это не так, то очередь будет уничтожена со всем ее содержимым.
Семен Сорокин (2004-07-12 14:32:00) [11]
> Vitalik © (12.07.04 14:30) [9]
> Ну да. Тогда кончено второй. Потому что из метода класса
> уничтожать класс нельзя.
Почему Вы так в этом уверены, деструктор - это разве не метод класса?
Vitalik (2004-07-12 14:31:00) [12]всмысле нельзя уничтожать экземпляр класса
Vitalik (2004-07-12 14:30:00) [13]Ну да. Тогда кончено второй. Потому что из метода класса уничтожать класс нельзя.
Семен Сорокин (2004-07-12 14:29:00) [14]
> Vitalik (12.07.04 14:17) [6]
> И мне не понятно, почему лучше вызывать Release? Если тут
> написано (я во всяком случае именно так перевожу), что метод
> release вызывает метод Free, который в свою очередь вызывает
> Destroy!!!
> Так не лучше ли просто Free вызывать?
В том-то и дело, что Release работает через очередь сообщений. Представим что в программе есть следующий код:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
Self.Free
end;
или такой код:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
Self.Release
end;
какой код будет по Вашему безопасней?
Гаврила (2004-07-12 14:24:00) [15]>>Vitalik (12.07.04 14:17) [6]
Метод Release не вызывает немедленного разрушения формы, он всего лишь ставит сообщение CM_RELEASE в очередь. Это сообщение будет обработано как только до него дойдет очередь, то есть когда приложение отработает текущий обработчик и начнет выбирать сообщения из очереди далее.
В случае прямого вызова Free разрушение происходит немедленно.
В ряде случаев прямой вызов Free является допустимым
Рекомендации Борланда в данном случае - вопрос скорее стиля, а не указание на возможные ошибки
Vitalik (2004-07-12 14:17:00) [16]
> Saint (12.07.04 13:53) [5]
Всё же, почему Destroy???
Это F1:
Removes the form from memory.
destructor Destroy; override;
Description
Do not call Destroy. Instead, call Release, which posts a CM_RELEASE message to the form. The handler for CM_RELEASE calls the Free method, which in turn calls Destroy.
И мне не понятно, почему лучше вызывать Release? Если тут написано (я во всяком случае именно так перевожу), что метод release вызывает метод Free, который в свою очередь вызывает Destroy!!!
Так не лучше ли просто Free вызывать?
Saint (2004-07-12 13:53:00) [17]Подробнее:
Создание формы с помощью
Application.CreateForm(TForm1, Form1);
нужно для ее последующего автоматического удаления самим объектом Application после завершения программы.
Если форма уничтожается сразу же после показа,
создавать ее можно
Form1:=TForm1.Create(nil);
// владельца можно не указазывать
Form1.ShowModal;
Form1.Destroy;
Владелец компонента - тот кто ответственнен за его удаление.
Если сам удаляеш - можно не указывать
glGLU (2004-07-12 13:49:00) [18]Всем спасибо
с
Form1.Release;
все работает!!!!
Snip (2004-07-12 13:41:00) [19]пусть будет так
Тимохов (2004-07-12 13:40:00) [20]борлан рекоммендует
form1.release