![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание форм [D5, WinXP]
j_onion © (2002-06-14 10:19:00)Я создаю форму вызовом Application.createform, а освобождаю ее form.release. Может кто-нибудь сказать, корроктна такая последовательность, или нет. Смутные сомнения терзают меня
kull (2002-06-14 12:52:00) [1]
> Почитай в хэлпе про Release, или попробуй захлопнуть форму
> из обработчика её события.
TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
замечательно работает. :)
Игорь Шевченко (2002-06-14 11:52:00) [2]Romkin © (14.06.02 11:36)
Я использовал QuickReport.PreviewModal, и от этого сообщения избавился. Правда, дургие проблемы появились. QuiсkReport плохо написан, IMHO.
Я пробовал на разных процессорах :-)
Для release, IMHO, определено свое место - в обработчиках событий от компонент формы и собственно формы. В случае внешнего освобождения, особенно после ShowModal, все сообщения успевают обрабатываться и я не вижу ситуации, когда после вызова Free может прийти сообщение окну формы.
С уважением,
Romkin (2002-06-14 11:36:00) [3]А вот с Free надо поосторожнее.. У QReport есть довольно неприятная ошибка (может, в 3.5 исправили, не проверял): при preview при использовании стандартной формы после закрытия некоторых сложных отчетов возникала AV, и после другие preview выдавали "Form QRPreview already exists". Вызвано, ИМХО, это тем, что вызывается QRPreview.Free, а не release. Приходилось делать Application.processmessages, чтобы очередь сообщений выбиралась перед уничтожением (или свое preview, висящее постоянно).
2Игорь Шевченко: я много раз напарывался на AV именно из-за TForm.Free, насчет того, что проблем нет - по-видимому, используются быстрые станции, и очередь сообщений успевает обработаться. Попробуй P166 :-))
Вообще-то я не вижу причины, почему надо писать именно Free, с тем же успехом можно везде писать Release, что я и делаю. Возможно, сейчас это уже не актуально, но я считаю, что лишняя защищенность кода не повредит...
Игорь Шевченко (2002-06-14 11:02:00) [4]Romkin © (14.06.02 10:55)
У меня очень много кода вида
procedure TfMain.ShowModalForm(FormClass: TFormClass);
begin
with FormClass.Create(Self) do
try
ShowModal();
finally
Free();
end;
end;
И соответственно,
ShowModalForm(TForm1);
ShowModalForm(TForm2);
ShowModalForm(TForm3);
В разных местах программы.
Ни я, ни наши заказчики ни разу не сталкивались с проблемами в этой части.
Более того, пример из Demos Borland"a
procedure TMainForm.About1Click(Sender: TObject);
begin
AboutBox := TAboutBox.Create(Self);
try
AboutBox.ShowModal;
finally
AboutBox.Free;
end;
end;
IMHO, это Пачеко с Тейксейрой воду мутят :-)))
Виктор Щербаков (2002-06-14 10:55:00) [5]
> Ну что вас всех тянет на этот Release?
Почитай в хэлпе про Release, или попробуй захлопнуть форму из обработчика её события.
Romkin (2002-06-14 10:55:00) [6]У меня очень много кода вида
Application.CreateForm(TfrmDummy, frmDummy);
try
frmDummy.ShowModal;
finally
frmDummy.release;
end;
Что здесь некорректного? Я уверен, что данный отрывок будет работать на всех платформах win32 без сюрпризов (и работает :-)))
2kull: а что вас всех тянет на TForm.Free?
2Song: нафиг ждать, пока приложение закроется? Ресурсы не резиновые...
Song (2002-06-14 10:49:00) [7]Некорректна. Система сама осовоюождает автоматически созданные формы.
kull (2002-06-14 10:45:00) [8]Ну что вас всех тянет на этот Release?
Ни в одном примере нет такого способа закрытия формы...
Игорь Шевченко (2002-06-14 10:41:00) [9]Вопрос сам по себе некорректный. Без кода.
А освобождать можно хоть release, хоть free - в зависимости от того, в каком месте освобождение происходит