如何从子窗体调用父窗体的方法(函数)
How to make a method (function) call of parent form from a child form
我用 C++ (CLR) 编写应用程序。这是一个带有表格的应用程序。
我有 2 种形式:MainForm
和 ExtensionsForm
。 MainForm
程序启动时显示。当您单击该按钮时,将创建 ExtensionsForm
。
我还有这些文件:MainForm.h
、MainForm.cpp
、ExtensionsForm.h
、ExtensionsForm.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
上),我可以这样做这个:
我可以在 MainForm.h
中创建 public
方法,这会对此表单进行一些更改。我的例子:
public: void updateButton(int amount, int maxAmount) {
button->Text = amount + " / " + maxAmount;
}
public: void updateTextBox(String^ text) {
textBox->Text = text;
}
要显示一个新的表格,我可以使用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;
。这是下一步所必需的。
这个东西之后,你可以在里面用这样的东西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,感谢您的建议。
我用 C++ (CLR) 编写应用程序。这是一个带有表格的应用程序。
我有 2 种形式:MainForm
和 ExtensionsForm
。 MainForm
程序启动时显示。当您单击该按钮时,将创建 ExtensionsForm
。
我还有这些文件:MainForm.h
、MainForm.cpp
、ExtensionsForm.h
、ExtensionsForm.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
上),我可以这样做这个:
我可以在
MainForm.h
中创建public
方法,这会对此表单进行一些更改。我的例子:public: void updateButton(int amount, int maxAmount) { button->Text = amount + " / " + maxAmount; } public: void updateTextBox(String^ text) { textBox->Text = text; }
要显示一个新的表格,我可以使用
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;
。这是下一步所必需的。这个东西之后,你可以在里面用这样的东西
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,感谢您的建议。