如何从子窗体调用父窗体的方法(函数) 我在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++有点熟悉。你帮我解决这个问题。你能写下这个作为回答吗?