Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Использование 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.035 c
1-1083437406
G-ray
2004-05-01 22:50
2004.05.16
Подсветка синтаксиса


6-1079982504
3APA3A
2004-03-22 22:08
2004.05.16
Несколько подключений к одному IP:Port...


3-1082530746
Russko
2004-04-21 10:59
2004.05.16
Query - имя активированной БД


14-1082638587
Бегун
2004-04-22 16:56
2004.05.16
База решений.


9-1073250311
DrOne
2004-01-05 00:05
2004.05.16
Дайте ссылок по QuadTree





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