Вниз
Скачать: CL | DM;

Динамическое создание форм 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.043 c
1-1105985241
BAYES
2005-01-17 21:07
2005.01.30
Кусок текста из Word


1-1106125969
Ega23
2005-01-19 12:12
2005.01.30
Выполнится ли Beep ?


3-1104177126
NEEDHELP
2004-12-27 22:52
2005.01.30
Oshibka pri vvode dati =(


3-1103808932
jenbond
2004-12-23 16:35
2005.01.30
решение проблемы с gds32.dll


3-1104134283
Руслана
2004-12-27 10:58
2005.01.30
Подскажите как сделать




   Наверх