Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Form1.Destroy??? [WinXP]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо