Vc ++,通过调用使用form2中form1的函数

时间:2013-08-11 06:21:08

标签: winforms c++-cli

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

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

我有一个Form1,在form1上我已经在Form1.h中包含了第二个表单文件:Form2.h 所以现在我已经创建了,当按钮处于预告状态时运行:

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

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

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

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

1 个答案:

答案 0 :(得分: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的成员是Form2^,请在Form1.h中转发声明Form2

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