Главная страница
    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-1082730271
CTAC
2004-04-23 18:24
2004.05.16
Не могу поменять charset в TRadiobutton :(


11-1069495122
DDA
2003-11-22 12:58
2004.05.16
FileSetDate для Папок


3-1082549938
Sectey
2004-04-21 16:18
2004.05.16
Почему простое закрытие Access таблиц выдает ошибку.


4-1080639585
Kalmykov Sergei
2004-03-30 13:39
2004.05.16
Переобразование переменной.


1-1083651731
$tranger
2004-05-04 10:22
2004.05.16
Запуск с параметрами





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