** kea |
Отправлено: 24.12.2005, 17:21 |
|
Не зарегистрирован
|
Здравствуйте! Я закрываю MDI-форму, поместив, в обработчик onClose оператор Action = caFree; У Архангельского написано, что дочернее окно нельзя закрыть из главного. Правильно ли я делаю? Окно закрывается, память из под него удаляется? |
|
Gal |
Отправлено: 27.12.2005, 15:49 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 124
|
Если это вопрос, то в принципе все правильно! |
|
** kea |
Отправлено: 27.12.2005, 20:17 |
|
Не зарегистрирован
|
QUOTE (Gal @ 27/12/2005, 15:49) | Если это вопрос, то в принципе все правильно! |
Здравствуйте! Да, это вопрос был.
У Архангельского написано что так нельзя делать.
Сложно отслеживать состояние указтеля на эту форму. NULL ему где лучше присваивать, чтобы в главной форме знать, что это окно уже не существует? |
|
AVC |
Отправлено: 28.12.2005, 09:26 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
NULL ему где лучше присваивать, чтобы в главной форме знать, что это окно уже не существует?
|
А почему бы не свериться со списком окон. Указателей-то может быть много и где угодно.
|
|
Admin |
Отправлено: 28.12.2005, 17:21 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE (** kea @ 24/12/2005, 17:21) | Здравствуйте! Я закрываю MDI-форму, поместив, в обработчик onClose оператор Action = caFree; У Архангельского написано, что дочернее окно нельзя закрыть из главного. Правильно ли я делаю? Окно закрывается, память из под него удаляется? |
Что-то я не понял, почему нельзя ???
В Child окно действительно помещаете Action = caFree;
CODE |
void __fastcall TMDIChild::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
|
насчет всего остального ...
CODE |
// в Main.h
#include "Child.h"
private: // User declarations
TMDIChild *Child; // указатель на child-форму
|
Когда нужно — создаете child-форму в Main.cpp
CODE |
//--- create a new MDI child window ----
static int i = 0;
Child = new TMDIChild(Application);
ActiveMDIChild->Tag = i++;
|
Также и закрытие child-формы из главной формы.
В главной форме некая кнопка — "Закрыть" и обработчик нажатия,
типа
CODE |
void __fastcall TMain::Button1Click(TObject *Sender)
{
Child = (TMDIChild*)ActiveMDIChild;
Child->Close();
}
|
|
|
Admin |
Отправлено: 28.12.2005, 17:40 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Насчет отслеживания состояния дочерних окон из главного,
то удобно создать в главной форме список дочерних окон
и помещать их туда по мере создания и удалять их оттуда по мере
закрытия дочерних окон.
В главной форме в .h
CODE |
private: // User declarations
TList* ChildList;
|
В главной форме в .cpp
CODE |
__fastcall TFMain::TFMain(TComponent* Owner)
: TForm(Owner)
{
ChildList = new TList;
}
.....
// при создании новой сhild-формы — заносим ее в этот список
static int i=0;
//--- create a new MDI child window ----
Child = new TMDIChild(Application);
ActiveMDIChild->Tag = i++;
ChildList->Add(Child);
// а когда нужно — получаем доступ к любой child-форме,
// например через уникальный Tag каждой child-формы
for(int j=0; j<ChildList->Count; j++){
Child = (TMDIChild*)ChildList->Items[j];
if(Child->Tag == Num) ...
.....
}
|
соответственно при закрытии формы отслеживаем
это событие и удаляем указатель на нее из ChildList.
...
Или можем получать доступ через MDIChildren[] и MDIChildCount
как в Help-e
CODE |
The following code closes all the MDI children of Form1.
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i = MDIChildCount-1; I >= 0; i--)
MDIChildren[i]->Close();
}
|
Отредактировано Admin — 28/12/2005, 17:44
|
|