Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Использование MDI.   Найти похожие ветки 

 
Andrew_Rosotv   (2004-05-02 15:30) [0]

Возникла задача тиражирования форм в runtime.
Насколько я понял, используя MDI эту задачу можно решить довольно просто.

Сейчас столкнулся с проблемой. Если у главной формы указано свойство FormStyle: fsMDIForm, то все работает (копии создаются в главной форме),
но если у другой формы (назовем ее NonMain) указать fsMDIForm (у главной поставить fsNormal) то при создании копии : TFormChild.Create(Application)
получаем исключение:
"Cannot create form. No MDI forms are currently active"

Причем перед этим на NonMain фокус ввода был установлен. Так же я проверял - событие onActivate происходит...

Собственно вопрос в следующем:
возможно ли при использовании MDI создание копий формы не в главной форме приложения (и если да, то в чем м.б. причина указанного выше исключения)?


 
Юрий Зотов ©   (2004-05-02 16:11) [1]

1. Никто не запрещает тиражировать формы и безо всяких MDI-Child. Делается это точно так же - вызываете конструктор класса, и все.

2. Причину исключения легко установить отладчиком. Укажите в опциях проекта Use debug dcu"s, сделайте build и пройдите по коду VCL отладчиком. Думаю, причина окажется в том, что где-то в коде VCL идет проверка
Application.MainForm.FormStyle = fsMDIForm
и если это не так, то возбуждается исключение.

3. Если уж очень надо использовать MDI, то создавайте MDI-форму первой, а форму с fsNormal - второй. Тогда все будет ОК.


 
Andrew_Rostov   (2004-05-02 16:39) [2]

Спасибо, еще почитал доки и выяснил, что основная форма приложения и только она должна быть fsMDIForm => действительно прийдется без MDI...


 
Юрий Зотов ©   (2004-05-02 17:13) [3]

> Andrew_Rostov   (02.05.04 16:39) [2]

Если нужно, то можно и с MDI (см. п.3). Никто не мешает создавать в MDI-проекте формы с fsNormal. Обычно это модальные диалоги, но совсем не обязательно.


 
Andrew_Rostov   (2004-05-02 18:01) [4]

Работает, от MDI я отказался. Правда теперь возникла пара вопросов:
1. Как обращаться к динамически созданным формам/их компонентам? Через MDI это осуществлялось посредством свойства MDIChildren[i], а элементами какого массива являются созданные не через MDI формы что-то не соображу...

2. Не возникает ли проблем с освобождением памяти (утечек тобишь) при
 - закрытии созданной формы
или
 - закрытии основной формы (ну и соответственно динамических).
В обработчик onClose "формы для клонирования" я прописал Action:= caFree;


 
Юрий Зотов ©   (2004-05-02 19:09) [5]

> Andrew_Rostov   (02.05.04 18:01) [4]

1. Есть общий список форм Screen.Forms. Специального списка для форм одного класса нет, но его легко сделать "ручками". Можно, например, использовать такую схему модуля клонируемых форм:

type
 TForm2 = class(TForm)
   ...
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormClose(Sender: TObject; Action: TCloseAction);
   ...
 end;

var
 // Переменная Form2: TForm2 не нужна и удалена.
 FormList: TList; // Вот это и есть список форм класса TForm2

implementation

{$R *.DFM}

procedure TForm2.FormCreate(Sender: TObject);
begin
 if FormList = nil then FormList := TList.Create;
 FormList.Add(Self)
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
 FormList.Remove(Self);
 if FormList.Count = 0 then FreeAndNil(FormList)
end;

procedure TForm2.FormClose(Sender: TObject; Action: TCloseAction);
begin
 Action := caFree
end;

Если предполагается многопоточное создание или удаление форм, то вместо TList нужно использовать TThreadList, но сама схема остается той же самой.

2. При Action=caFree проблем с памятью не возникнет. Любая закрытая форма самоуничтожится и сама удалит себя из списка.



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
4-1080353007
MPS
2004-03-27 05:03
2004.05.16
Принудительное закрытие контекстного меню


11-1068853804
Ciber SLasH
2003-11-15 02:50
2004.05.16
Как вывести GIF в PaintBox


14-1082681741
alexandri
2004-04-23 04:55
2004.05.16
Такие вот дела ....


14-1082951872
Dmitriy O.
2004-04-26 07:57
2004.05.16
Вчера я открыл дачный сезон ! Вскопал грядку !


1-1083316937
tlan
2004-04-30 13:22
2004.05.16
как работать с Zlib?