如何从子窗体调用父窗体的方法(函数)

How to make a method (function) call of parent form from a child form

我用 C++ (CLR) 编写应用程序。这是一个带有表格的应用程序。

我有 2 种形式:MainFormExtensionsFormMainForm 程序启动时显示。当您单击该按钮时,将创建 ExtensionsForm

我还有这些文件:MainForm.hMainForm.cppExtensionsForm.hExtensionsForm.cpp

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

#pragma once
#include "ExtensionsForm.h" // <-- added

MainForm 按钮的 onClick 事件处理程序中打开 ExtensionsForm 我添加了这个:

ExtensionsForm^ extensionsForm = gcnew ExtensionsForm();
extensionsForm->ShowDialog();

并且这段代码工作正常。

但我需要在单击 ExtensionsForm 中的按钮后对 MainForm 的外观进行一些更改。我该如何正确实施?

提前致谢!

我的尝试

我在 MainForm 中创建了方法(函数),并尝试在 ExtensionsForm 中调用此方法。我可以使用构造函数来传递引用,但无论如何我都会出错:

如何解决?

我的解决方案

我已将所有 *.h 文件包含在 Main.cpp 文件中。在 Main.cpp 我有这个:

#include "MainForm.h"
#include "ExtensionsForm.h"

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

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

    public: void updateButton(int amount, int maxAmount) {
        button->Text = amount + " / " + maxAmount;
    }
    public: void updateTextBox(String^ text) {
        textBox->Text = text;
    }
    
  2. 要显示一个新的表格,我可以使用MainForm.cpp里面的方法。我的例子:

    #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();
        }
    }
    

    方法 buttonExtensions_Click 在此处实现(定义)。它在 MainForm.h:

    中也有定义

    private: void buttonExtensions_Click(System::Object^ sender, System::EventArgs^ e);

    这非常有效,但您必须在 *.cpp 文件中实现(定义)您的方法,该文件包括您的 *.h 文件或在此 *.h 文件中(定义必须存在) .你也可以在这个方法中看到 extensionsForm->Owner = this; 。这是下一步所必需的。

  3. 这个东西之后,你可以在里面用这样的东西ExtensionsForm.h:

    private: void buttonConfirmExtensions_Click(System::Object^  sender, System::EventArgs^  e) {
        MainForm^ mainForm = (MainForm^)this->Owner;
        mainForm->updateButtonExtensions(checkedExtensionsCount, extensionsCount);
        mainForm->updateTextBoxExtensions(textBoxExtensionsString);
        this->Close();
    }
    

    您可以通过 Owner 获取您的 MainForm 并使用此表单定义的 public 方法。就这些了。

这已通过将一些代码重新定位到 .cpp 文件来解决。

Hans Passant,感谢您的建议。