Как закрыть закрепленную форму VCL в C ++ Builder - PullRequest
0 голосов
/ 02 января 2019

Я использую C ++ Builder с приложением VCL Forms.Я пытаюсь закрыть форму VCL, которая установлена ​​на TPageControl.Кнопка «Закрыть» находится на панели инструментов в главной форме программы.Мой подход состоит в том, чтобы сделать три шага ниже: я могу пройти весь этот код, но когда это сделано, ничего не происходит, форма не закрывается.Что я здесь не так делаю?

  1. При нажатии на закрепленную форму я сохраняю имя формы в глобальной переменной.
  2. При нажатии на кнопку CloseButton я использую Screen-> Forms [] для циклического обхода всех форм инайти правильную форму.Затем я вызываю событие form-> OnCloseQuery.
  3. В событии 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;
  }
}

1 Ответ

0 голосов
/ 02 января 2019

Вам нужно позвонить Form->Close() вместо Form->OnCloseQuerty(), но оставить код события как есть (как вы хотите, чтобы закрыть диалоговое окно подтверждения)

  1. Form->OnCloseQuerty()

    вызывается VCL Вы не должны вызывать его на себя !!!Он имеет другое значение: он не заставляет Form закрыться, но может отклонить событие Close, если для CanClose установлено значение false.

  2. Form->Close()

    Это заставляет Form закрыться.Но сначала VCL назовет Form->OnCloseQuerty() и в соответствии с его результатом либо игнорирует закрытие, либо продолжает его.

Есть и другие альтернативы, чтобы сделатьто, что ты хочешь.В случае, если вы просто хотите скрыть свою форму, вы также можете установить для ее свойства Visible значение false.А когда вы захотите использовать его снова, просто используйте Show() или даже ShowModal() или установите его Visible на True снова (это зависит от того, является ли ваше приложение MDI или нет).

Другой способ - динамически создавать и удалять форму, используя new,delete.Удаление формы заставляет Form закрываться независимо от результата Form->OnCloseQuery().

Иногда я комбинирую эти два метода ... И задаю Visible=false и CanClose=false в OnCloseQuery() идо уничтожения приложения delete все динамично Forms ...

...