Я использую C ++ Builder с приложением VCL Forms.Я пытаюсь закрыть форму VCL, которая установлена на TPageControl.Кнопка «Закрыть» находится на панели инструментов в главной форме программы.Мой подход состоит в том, чтобы сделать три шага ниже: я могу пройти весь этот код, но когда это сделано, ничего не происходит, форма не закрывается.Что я здесь не так делаю?
- При нажатии на закрепленную форму я сохраняю имя формы в глобальной переменной.
- При нажатии на кнопку CloseButton я использую Screen-> Forms [] для циклического обхода всех форм инайти правильную форму.Затем я вызываю событие form-> OnCloseQuery.
- В событии FormCloseQuery я вызываю событие FormClose.
.
void __fastcall TAboutForm::FormClick(TObject *Sender)
{
MainForm1->LastSelectedFormName = AboutForm->Name;
}
void __fastcall TMainForm1::CloseButtonClick(TObject *Sender)
{ //Identify The Form to Delete by Name
bool q=true;
UnicodeString FormName="";
int cnt = Screen->FormCount;
for(int i=0; i<cnt; i++ )
{
TForm* form = Screen->Forms[i];
FormName = form->Name;
if(CompareText(FormName, LastSelectedFormName)==0){
form->OnCloseQuery(form, q); //close this form
break;
}
}
}
void __fastcall TAboutForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
int Code = Application->MessageBox(L"Close Form", L"Close Form", MB_YESNO|MB_ICONINFORMATION);
if(Code ==IDYES){
TCloseAction Action = caFree;
FormClose(Sender, Action);
}
}
void __fastcall TAboutForm::FormClose(TObject *Sender, TCloseAction &Action)
{
Action = caFree;
}
Ниже приведена правка послечтение ответа от Spektre
Форма вызова-> OnClose (форма, MyAction);не будет вызывать событие FormCloseQuery.Я должен вызвать FormCloseQuery вручную.Единственный способ закрыть закрепленную форму - добавить, удалить Sender;в формуЗакрыть запрос.
Это не похоже на правильное решение.Я очень удивлен, что у Embarcadero нет рекомендуемого способа закрыть закрепленную форму.Это похоже на очень распространенное действие.Я читаю doc-wiki и не могу найти решение, чтобы закрыть закрепленную форму.
void __fastcall TMainForm1::CloseButtonClick(TObject *Sender)
{ //Identify The Form to Delete by Name
bool MyCanClose=true;
UnicodeString FormName="";
TCloseAction MyAction = caFree;
int cnt = Screen->FormCount;
for(int i=0; i<cnt; i++ )
{
TForm* form = Screen->Forms[i];
FormName = form->Name;
if(CompareText(FormName, LastSelectedFormName)==0){
// form->OnClose(form, MyAction);
form->OnCloseQuery(form, MyCanClose);
break;
}
}
}
void __fastcall TAboutForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
int Code = Application->MessageBox(L"Close Form", L"Close Form", MB_YESNO|MB_ICONINFORMATION);
if(Code ==IDYES){
delete Sender;
Sender = NULL;
}
}