![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамическое создание форм CreateForm [D5, WinXP]
UserCP © (2005-01-18 15:56:00)Динамическое создание форм.
В программе накопилось много форм, около 65, поэтому загрузка и активность реакции приложения
ухудшилась, в связи с чем возникла необходимость динамически создавать и освобождать окна.
Используется такой инструмент:
------------------------------
IF NOT Assigned(Form2) THEN Application.CreateForm(TForm2, Form2);
Form2.Show;
------------------------------
В форме Form2 на событии OnClose используется директива Action := caFree, чтобы при закрытии
форма уничтожилась.
Вопрос состоит в том, что первый раз функция проверки создания формы IF NOT Assigned(Form2)
работает, но если форма была создана и уже освобождена, то повторное использование
функции Assigned(Form2) всегда уже возращает TRUE, что не дает достоверно выяснить
нужно ли еще раз использовать функцию CreateForm.
Как грамотно выйти из данной ситуации?
UserCP (2005-01-19 03:06:00) [1]ОК, я нашел вышел из положения так:
в OnClose форме писал:
Action := caFree;
А чтобы потом нормально распознавала инструкция Assigned, то в событии форм OnDestroy указывал:
Form2 := nil;
И все ОК!
Erik1 (2005-01-18 17:39:00) [2]А собственно, зачем вобще чтото писать? Если мы по закрытию освобощдаем форму, то можно просто
with TForm2.Create(Application) do
Show;
А если так ненравится то писать FormManager можно и примитивный.
Zabludshiy (2005-01-18 17:22:00) [3]Я делал так:
Проверка есть ли форма с нужным именем
function formexist(namef:string):boolean ;
var
i : word;
begin
result:=false;
for i:=0 to Screen.FormCount - 1 do
if screen.forms[i].name=namef then result:=true;
end;
при создании формы
if not formexist('F_Name') then
Application.CreateForm(TF_Name, F_Name);
F_Name.Show;
}|{yk (2005-01-18 17:12:00) [4]
type TFormClass = class of TForm;
function ShowForm(FormClassName: AnsiString): TFunctionResult;
var
FormClass: TClass;
begin
Result.Successful := False;
Result.MessageOnError := 'Unknown error';
FormClass := GetClass(FormClassName);
if FormClass = nil then
begin
Result.MessageOnError := Format('Class %s not registered', [FormClassName]);
Exit;
end;
with TFormClass(FormClass).Create(nil) do
try
ShowModal;
finally
Free;
end;
Result.Successful := true;
end;
и вызывай ShowForm(ИмяКлассаФормы)
Единственное, что нужно регистрировать классы форм
Ega23 (2005-01-18 17:09:00) [5]хочет видет на экране 2 формы сразу и переключаться между ними.
TPageControl ?
Алхимик (2005-01-18 17:09:00) [6][6] - это только для диалогов
HSolo (2005-01-18 17:07:00) [7]ShowModal - это хорошо, но порой жестоко :) по отношению к юзеру, если он, бедняга, хочет видет на экране 2 формы сразу и переключаться между ними.
Алхимик (2005-01-18 16:54:00) [8]Я при примерно так делаю
with TfrmMyForm.Create(nil) do begin
try
if ShowModal = mrOk then ...
else ...
finally
Free;
end;
end;
Ega23 (2005-01-18 16:46:00) [9]ShowModal делай. А потом Free и nil.
Ega23 (2005-01-18 16:46:00) [10]ShowModal делай. А потом Free и nil.
HSolo (2005-01-18 16:28:00) [11]Ищите форму в Screen.Forms; если ее там нет - создавайте
Fay (2005-01-18 16:14:00) [12]Избавься от глобальных переменных для форм
Reindeer Moss Eater (2005-01-18 16:04:00) [13]Странный чел.
Если ты безусловно убиваешь экземпляры при закрытии, то зачем проверять перед созданием?
А если все же хочется проверять, то после убийства формы делай Form2:=nil;