0

我一直在到处寻求帮助。到目前为止还没有找到我需要的帮助。

我希望你们能指导或帮助我=)

我有一个 Form1,在 form1 上,我在 Form1.h 中包含了第二个表单文件:Form2.h 所以现在我已经创建了,它在按下按钮时运行:

| Form1.h | Form2^ frmProSog = gcnew Form2(); frmProSog->ShowDialog();

现在 Form2 已打开,我用它在数据网格中搜索字符串。当我选择了结果后,我将单击 Form2 中的一个按钮,我想在 Form1 中调用一个函数,该函数会将数据添加到 Form1 中的另一个数据网格中。

我试图在 Form2 中包含 Form1.h,但出现错误:无法使用给定的参数列表参数类型调用:(System::Object ^)

我希望有人能帮助我。在 stackoverflow 上尝试了以下许多建议,这些建议提醒了这个问题,但没有运气。

4

1 回答 1

0

(David Yaw 的评论是正确的,我在 OP 可能需要更明确的说明的基础上写了以下内容。这个答案只是指出了常用的 C++ 技术,而不是 CLI/C++ 或 WinForms 特有的东西。)

根据您的描述,在我看来,您的按钮按下事件函数的主体必须位于相应的头文件中。此外,这#include "Form1.h"是在 Form2.h 中,反之亦然:这会导致循环依赖和相关的痛苦。

简单的解决方法是在 Form1.cpp 和 Form2.cpp 源文件中实现事件处理方法。一旦表单设计器创建了空方法......

public ref class Form 1 : System::Windows::Forms::Form
{

     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
     {

     }
}

...然后从标题中删除实现。

public ref class Form 1 : System::Windows::Forms::Form
{

     private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) ;
}

复制/粘贴到 cpp 文件中,并添加处理程序主体

System::Void Form1::button1_Click(System::Object^  sender, System::EventArgs^  e) {
    Form2^ frmProSog = gcnew Form2(); 
    frmProSog->ShowDialog();
}

从 .h中删除相应#include的并放入 .cpp 中。

(如果有一个成员Form1是 a ,则在 Form1.hForm2^中前向声明)Form2

以上将起作用,因为根据您的问题,Form2 中的 Form1 或 Form1 中的 Form2 没有视觉表示(即在表单设计器中)。在这种情况下,只要您在 *.h 中转发声明,并且只在源文件中“使用”(访问成员等)循环依赖类,您就可以在表单/控件之间拥有尽可能多的循环依赖。您可以通过前向声明(包括Form2^作为成员函数和方法签名)愉快地在 Form1.h 中为 Form2 处理句柄 (^)。

于 2013-08-20T11:19:55.003 回答