Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.043 c
1-1089286563
Ivolg
2004-07-08 15:36
2004.07.25
Размер


1-1089685804
Глеб
2004-07-13 06:30
2004.07.25
Работа с выделенным текстом в MS Word


1-1089695944
bobj
2004-07-13 09:19
2004.07.25
Обработка TreeView


1-1089610018
ancara
2004-07-12 09:26
2004.07.25
Аналог CopyMemory в CLX


14-1089230273
KilkennyCat
2004-07-07 23:57
2004.07.25
А комментарии в "Фотоприколах" кто-нить модерирует?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский