Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.033 c
1-1106199128
rosl
2005-01-20 08:32
2005.01.30
заполнение нолями


9-1098607787
rydmi
2004-10-24 12:49
2005.01.30
Collusion.


4-1102694755
sashas
2004-12-10 19:05
2005.01.30
Как изменить стиль окна


1-1106041780
COOLer
2005-01-18 12:49
2005.01.30
Помогите перевести кусок кода С++ на делфи


1-1106181479
Алексей
2005-01-20 03:37
2005.01.30
Как удалять объекты, связаные с TTreeNode.Data





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский