C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Работа с MDI
** 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

Вернуться в Вопросы программирования в C++Builder