Приложение MDI — Не удается открыть дочернюю форму

Я сделал 2 формы. MainForm и ChildForm (я устанавливаю доступные формы)

дизайн >> http://i.imgur.com/UkV7lZh.png

когда я хочу позвонить в ChildForm, используйте этот код

  void __fastcall TMainForm::ChildForm1Click(TObject *Sender)
{
if(!ChildForm)
{ ChildForm =  new TChildForm(this); }
else
{ ChildForm->WindowState=wsNormal; }
}

и закрыть

void __fastcall TChildForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
Action=caFree;
}

почему, когда я открываю ChildForm, тогда я закрываюсь. и когда снова открыть. ChildForm Не могу открыть ??

#

Основная форма

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"#include "Unit2.h" //ChildForm
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"TMainForm *MainForm;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ChildForm1Click(TObject *Sender)
{
if(!ChildForm)
{ ChildForm =  new TChildForm(this); }
else
{ ChildForm->WindowState=wsNormal; }
}

0

Решение

Как это уже обсуждалось в комментариях, и благодаря помощи @Remy Lebeau, в TMainForm класс, вам нужно установить ChildFrom указатель на NULL после уничтожения формы он указывает на. Это может быть достигнуто в деструкторе TChildForm класс, используя указатель его владельца, который был передан ему во время создания.

Проблема в основном в этом фрагменте кода:

  if(!ChildForm)
{ ChildForm =  new TChildForm(this); }
else
{ ChildForm->WindowState=wsNormal; }

В первый раз все работает как запланировано. когда ChildForm уничтожен, однако, указатель не сбрасывается, и в следующий раз ChildForm Запрошено создание, первый тест не пройден, и, конечно, форма не создана.

Так:

  • сделать TChildForm класс хранит копию указателя своего владельца (вам, вероятно, потребуется изменить прототип конструктора следующим образом:

    __fastcall TChildForm::TChildForm(TMainForm *owner)
    

    Для того чтобы TChildForm знать полный тип его владельца (IDE должен #include TMainForm заголовок для вас, или попросить разрешения на это).

  • Создать метод в TMainForm обрабатывать TChildForm сбросить указатель и дать ему правильный уровень доступа для TChildForm чтобы вызвать это.

  • добавить вызов к этому методу (т.е. owner->onChildFormTermination() или что-то подобное) в ~TChildForm сообщить своему владельцу.

Обратите внимание, что мой VCL-fu немного ржавый (я не программировал на C ++ Builder более 10 лет), возможно, есть более идиоматичный способ написания этого.

0

Другие решения