Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизДинамическое создание форм CreateForm Найти похожие ветки
← →
UserCP (2005-01-18 15:56) [0]Динамическое создание форм.
В программе накопилось много форм, около 65, поэтому загрузка и активность реакции приложения
ухудшилась, в связи с чем возникла необходимость динамически создавать и освобождать окна.
Используется такой инструмент:
------------------------------
IF NOT Assigned(Form2) THEN Application.CreateForm(TForm2, Form2);
Form2.Show;
------------------------------
В форме Form2 на событии OnClose используется директива Action := caFree, чтобы при закрытии
форма уничтожилась.
Вопрос состоит в том, что первый раз функция проверки создания формы IF NOT Assigned(Form2)
работает, но если форма была создана и уже освобождена, то повторное использование
функции Assigned(Form2) всегда уже возращает TRUE, что не дает достоверно выяснить
нужно ли еще раз использовать функцию CreateForm.
Как грамотно выйти из данной ситуации?
← →
Reindeer Moss Eater © (2005-01-18 16:04) [1]Странный чел.
Если ты безусловно убиваешь экземпляры при закрытии, то зачем проверять перед созданием?
А если все же хочется проверять, то после убийства формы делай Form2:=nil;
← →
Fay © (2005-01-18 16:14) [2]Избавься от глобальных переменных для форм
← →
HSolo © (2005-01-18 16:28) [3]Ищите форму в Screen.Forms; если ее там нет - создавайте
← →
Ega23 © (2005-01-18 16:46) [4]ShowModal делай. А потом Free и nil.
← →
Ega23 © (2005-01-18 16:46) [5]ShowModal делай. А потом Free и nil.
← →
Алхимик © (2005-01-18 16:54) [6]Я при примерно так делаю
with TfrmMyForm.Create(nil) do begin
try
if ShowModal = mrOk then ...
else ...
finally
Free;
end;
end;
← →
HSolo © (2005-01-18 17:07) [7]ShowModal - это хорошо, но порой жестоко :) по отношению к юзеру, если он, бедняга, хочет видет на экране 2 формы сразу и переключаться между ними.
← →
Ega23 © (2005-01-18 17:09) [8]хочет видет на экране 2 формы сразу и переключаться между ними.
TPageControl ?
← →
Алхимик © (2005-01-18 17:09) [9][6] - это только для диалогов
← →
}|{yk © (2005-01-18 17:12) [10]
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(ИмяКлассаФормы)
Единственное, что нужно регистрировать классы форм
← →
Zabludshiy (2005-01-18 17:22) [11]Я делал так:
Проверка есть ли форма с нужным именем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;
← →
Erik1 © (2005-01-18 17:39) [12]А собственно, зачем вобще чтото писать? Если мы по закрытию освобощдаем форму, то можно просто
with TForm2.Create(Application) do
Show;
А если так ненравится то писать FormManager можно и примитивный.
← →
UserCP (2005-01-19 03:06) [13]ОК, я нашел вышел из положения так:
в OnClose форме писал:
Action := caFree;
А чтобы потом нормально распознавала инструкция Assigned, то в событии форм OnDestroy указывал:
Form2 := nil;
И все ОК!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c