Главная страница
    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.46 MB
Время: 0.036 c
7-1080727290
-+= Evgeney =+-
2004-03-31 14:01
2004.05.16
Извращения с сотовым телефоном


1-1083078589
Алексей Петухов
2004-04-27 19:09
2004.05.16
К теме о Динамических массивах


3-1081928170
Patrick
2004-04-14 11:36
2004.05.16
Свойство IDENTITY


3-1081818147
Sirgfine
2004-04-13 05:02
2004.05.16
Сортировка в TTable


7-1081068563
_dEMOn
2004-04-04 12:49
2004.05.16
LPT Порт





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский