Я сделал 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; }
}
Как это уже обсуждалось в комментариях, и благодаря помощи @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 лет), возможно, есть более идиоматичный способ написания этого.