Форум: "Основная";
Текущий архив: 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.04 c