Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

Form1.Destroy???   Найти похожие ветки 

 
glGLU   (2004-07-12 13:34) [0]

Подскажите как правильно выгрузить форму после ее использования?
Создаю я эту форму из другой форму так  Application.CreateForm(TForm1, Form1);
 Form1.ShowModal;

а как и где ее нужно удалить после использования???


 
Snip ©   (2004-07-12 13:39) [1]

if Form1.ModalResult=mrOk then
 //что тее надо делать
Form1.Free;


 
Тимохов ©   (2004-07-12 13:40) [2]

борлан рекоммендует
form1.release


 
Snip ©   (2004-07-12 13:41) [3]

пусть будет так


 
glGLU   (2004-07-12 13:49) [4]

Всем спасибо
с

Form1.Release;

все работает!!!!


 
Saint   (2004-07-12 13:53) [5]

Подробнее:
Создание формы с помощью
Application.CreateForm(TForm1, Form1);
нужно для ее последующего автоматического удаления самим объектом Application после завершения программы.
Если форма уничтожается сразу же после показа,
создавать ее можно
Form1:=TForm1.Create(nil);
// владельца можно не указазывать
Form1.ShowModal;
Form1.Destroy;

Владелец компонента - тот кто ответственнен за его удаление.
Если сам удаляеш - можно не указывать


 
Vitalik   (2004-07-12 14:17) [6]


> 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 вызывать?


 
Гаврила ©   (2004-07-12 14:24) [7]

>>Vitalik   (12.07.04 14:17) [6]

Метод Release не вызывает немедленного разрушения формы, он всего лишь ставит сообщение CM_RELEASE в очередь. Это сообщение будет обработано как только до него дойдет очередь, то есть когда приложение отработает текущий обработчик и начнет выбирать сообщения из очереди далее.
В случае прямого вызова Free разрушение происходит немедленно.
В ряде случаев прямой вызов Free является допустимым

Рекомендации Борланда в данном случае - вопрос скорее стиля, а не указание на возможные ошибки


 
Семен Сорокин ©   (2004-07-12 14:29) [8]


> 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;


какой код будет по Вашему безопасней?


 
Vitalik ©   (2004-07-12 14:30) [9]

Ну да. Тогда кончено второй. Потому что из метода класса уничтожать класс нельзя.


 
Vitalik ©   (2004-07-12 14:31) [10]

всмысле нельзя уничтожать экземпляр класса


 
Семен Сорокин ©   (2004-07-12 14:32) [11]


> Vitalik ©   (12.07.04 14:30) [9]
> Ну да. Тогда кончено второй. Потому что из метода класса
> уничтожать класс нельзя.

Почему Вы так в этом уверены, деструктор - это разве не метод класса?


 
Anatoly Podgoretsky ©   (2004-07-12 14:34) [12]

Семен Сорокин ©   (12.07.04 14:29) [8]
А зачем этот код рассматривать, сулчай конкретный - модальная форма. Возрат буудет только после обработки всех сообщений очереди. Но деже если это не так, то очередь будет уничтожена со всем ее содержимым.


 
Anatoly Podgoretsky ©   (2004-07-12 14:35) [13]

Release он для использования внутри формы, а это не тот случай.


 
Семен Сорокин ©   (2004-07-12 14:39) [14]

2Anatoly Podgoretsky
я не спорю что нужно всегда вызывать Release :))
[8] это ответ на [6]
я даже сам всегда Free вызываю для модальных форм, просто здесь описал ситуацию для чего может пригодиться Release.


 
Rem   (2004-07-12 14:47) [15]

OnClose:
 Action := caFree;


 
Тимохов ©   (2004-07-12 14:48) [16]

я, кстати, тоже забил на совет борланда - free вызываю для диалоговых форм.
недиалоговые мне и дестроить то никогда не приходилось :)))


 
Snip ©   (2004-07-12 14:56) [17]


> OnClose:
>  Action := caFree;

это я помню для MDI использовалось....


 
Anatoly Podgoretsky ©   (2004-07-12 15:05) [18]

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 15:07) [19]

ну это само сабой, я просто поправил
Rem   (12.07.04 14:47) [15]
что такое в данном случае не катит...


 
Rem   (2004-07-12 15:14) [20]

procedure TForm1.OnClose(Sender: TObject; var Action: TCloseAction);
begin
 // что тебе нужно делать
 // можно и закрытие формы запретить Action := caNone;
 Action := caFree;
end;

P.S. О чем это мы дискутируем?


 
VMcL ©   (2004-07-12 15:22) [21]

2 all

<offtopic>
- Вы за рыбой?
- Нет, я за рыбой.
- А я думал, что Вы за рыбой.
</offtopic>



Страницы: 1 вся ветка

Текущий архив: 2004.07.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
1-1089092804
Baloo
2004-07-06 09:46
2004.07.25
Копировать на расшаренный ресурс


14-1088753757
Alexei Sviridov
2004-07-02 11:35
2004.07.25
IB Server for RH Linux


3-1088487606
Ярослав
2004-06-29 09:40
2004.07.25
Массивы в IB


1-1089639089
Death_R
2004-07-12 17:31
2004.07.25
Запись масcива в TVarRec


4-1087154940
DjOne
2004-06-13 23:29
2004.07.25
Tabs