如何从子窗体调用父窗体的方法(函数) 我在C++中编写了应用程序。这是一份有表格的申请表

如何从子窗体调用父窗体的方法(函数) 我在C++中编写了应用程序。这是一份有表格的申请表,c++,forms,clr,C++,Forms,Clr,我有两个表单:MainForm和ExtensionsForm主窗体在程序启动时显示。单击该按钮时,将创建扩展表单 我还有这些文件:MainForm.h,MainForm.cpp,ExtensionsForm.h,ExtensionsForm.cpp 为了创建表单ExtensionsForm,我将其添加到文件MainForm.h的开头: #pragma once #include "ExtensionsForm.h" // <-- added private: void buttonCon

我有两个表单:
MainForm
ExtensionsForm
<代码>主窗体在程序启动时显示。单击该按钮时,将创建扩展表单

我还有这些文件:
MainForm.h
MainForm.cpp
ExtensionsForm.h
ExtensionsForm.cpp

为了创建表单
ExtensionsForm
,我将其添加到文件
MainForm.h
的开头:

#pragma once
#include "ExtensionsForm.h" // <-- added
private: void buttonConfirmExtensions_Click(System::Object^  sender, System::EventArgs^  e) {
    MainForm^ mainForm = (MainForm^)this->Owner;
    mainForm->updateButtonExtensions(checkedExtensionsCount, extensionsCount);
    mainForm->updateTextBoxExtensions(textBoxExtensionsString);
    this->Close();
}
这段代码工作正常

但是我需要在单击
ExtensionsForm
中的按钮后对
main表单的外观进行一些更改。我如何才能正确地实现这一点

提前谢谢你

我的尝试

我已经在
MainForm
中创建了方法(函数),并尝试在
ExtensionsForm
中调用此方法。我可以使用构造函数传递引用,但无论如何我有一个错误:

如何解决这个问题

我的解决方案

我已经在
Main.cpp
文件中包含了所有
*.h
文件。在
Main.cpp
中,我有:

#include "MainForm.h"
#include "ExtensionsForm.h"
之后,如果我想在另一个表单上进行更改(例如,我可以按下
扩展表单上的按钮,并且更改必须出现在
主表单上),我可以这样做:

  • 我可以在
    MainForm.h
    中创建
    public
    方法,对该表单进行一些更改。我的例子是:

    public: void updateButton(int amount, int maxAmount) {
        button->Text = amount + " / " + maxAmount;
    }
    public: void updateTextBox(String^ text) {
        textBox->Text = text;
    }
    
    #include "MainForm.h"
    #include "ExtensionsForm.h"
    
    namespace FileFinder {
    
        [STAThreadAttribute]
        int main(array<System::String ^> ^args)
        {
            Application::EnableVisualStyles();
            Application::SetCompatibleTextRenderingDefault(false);
            FileFinder::MainForm mainForm;
            Application::Run(%mainForm);
            return 0;
        }
        void MainForm::buttonExtensions_Click(System::Object^  sender, System::EventArgs^  e) {
            ExtensionsForm^ extensionsForm = gcnew ExtensionsForm();
            extensionsForm->Owner = this;
            extensionsForm->ShowDialog();
        }
    }
    
  • 要显示新表单,我可以使用
    MainForm.cpp
    中的方法。我的例子是:

    public: void updateButton(int amount, int maxAmount) {
        button->Text = amount + " / " + maxAmount;
    }
    public: void updateTextBox(String^ text) {
        textBox->Text = text;
    }
    
    #include "MainForm.h"
    #include "ExtensionsForm.h"
    
    namespace FileFinder {
    
        [STAThreadAttribute]
        int main(array<System::String ^> ^args)
        {
            Application::EnableVisualStyles();
            Application::SetCompatibleTextRenderingDefault(false);
            FileFinder::MainForm mainForm;
            Application::Run(%mainForm);
            return 0;
        }
        void MainForm::buttonExtensions_Click(System::Object^  sender, System::EventArgs^  e) {
            ExtensionsForm^ extensionsForm = gcnew ExtensionsForm();
            extensionsForm->Owner = this;
            extensionsForm->ShowDialog();
        }
    }
    
    您可以通过
    Owner
    获取您的
    main表单
    ,并使用此表单中定义的
    public
    方法。就这些


  • 通过将一些代码重新定位到
    .cpp
    文件,解决了这个问题


    Hans Passant,谢谢你的建议。

    这是C++中非常传统的挂起,你在两个.h文件之间有循环依赖关系。修复这一点需要用向前声明和从.h文件移动到.cpp文件的C++舞蹈。但正确的方法是注意ShowDialog()的返回值。如果是DialogResult::Ok,则从DialogForm类更新需要更新的内容。或者换句话说,MainForm需要自我更新。使用您在ExtensionForm类上公开的属性。@谢谢您!我对C++有点熟悉。你帮我解决这个问题。你能写下这个作为回答吗?