none
C++/CLI:窗体间数据通信(窗体间互操作)问题? RRS feed

  • 问题

  • 背景介绍:使用 C++/CLI  新建两个窗体 Form1(默认创建)和 Form2。在 Form1 中新建一个 RichTextBox ,在 Form2 中创建一系列的单选多选按钮等。

                    要求:操作Form2中的控件能在Form1的 RichTextbox 中打印出相应的内容。

                    (其实问题说穿了就是希望在一个窗体中操作另一个窗体的控件)。

    我的做法:参考文章:http://www.cnblogs.com/crhacker/archive/2005/04/10/134933.html。其中的两种做法都试过.

    错误内容:两种做法都报告相似的编译错误,大致内容如下:

                   1、C2039:Form1 不是XXX成员;

                   2、C2143:语法错误,缺少“;”,在“^”前面;

                   3、C4430:缺少类型说明符-假定为Int。注意C++ 不支持默认Int。

     错误详述:在Form1中可以 【#include “Form2.h”】,这样可以顺利创建窗体并且操作Form2,但是不能在Form2 中引入 Form1 窗体,否则报告很多类似             以上的错误,就算在Form2.h 开头处使用了# pragma once 也不行,不引入Form1 引入其所在命名空间也不行。

                    针对文章中的两种方法都报告类似的错误。

    开发工具:VS2010简体中文版

    编程语言:C++/CLI

    .net版本:.net4.0

    求解:以上问题的解决办法。

    • 已移动 ThankfulHeart 2012年6月10日 7:20 VC++问题,更好得到回答 (发件人:.NET Framework 一般性问题讨论区)
    2012年6月10日 6:41

答案

全部回复

  • 您好:)

    1)首先您的问题是属于C++的,我给移动到了VC++论坛方便您得到更多的帮助。

    2)其次,我建议您可以先列出代码,尤其检查是private还是public等私有、共有问题等……,方便粗体标识出哪些代码有问题。

    3)请参考我的一篇C#回答:http://social.msdn.microsoft.com/Forums/zh-CN/vbasiczhchs/thread/8bdf964c-6de0-42c4-aab9-335bc31cec2d(主要使用委托+事件,不知道C++是否有类似的机制,我不是非常精通C++开发,貌似VC++.net有委托和事件;纯VC++有函数指针可以实现类似功能?)

    谢谢!


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已编辑 ThankfulHeart 2012年6月10日 7:20 增加参考回答
    • 已标记为答案 qingfy2007 2012年6月11日 7:51
    2012年6月10日 7:18
  • 我查看了你的文章,我对System::reflation 不熟悉,呵呵。

    当然,VC++.net 中当然有委托和事件,只是我一般不优先定义委托和事件。

    现在的问题很简单:

    我创建两个窗体 Form1 和 Form2. 在Form2 中添加一个按钮 btn1(功能是单击之后可以隐藏Form1);

    在 Form1 .h 中有如下代码:

    #pragma once

    #include "Form2.h"    //  引入Form2窗体

    ……(这里是一大堆自动生成代码)

    Form2^ f2;

    在 Form1 的 Load事件 中添加以下代码:

    f2 = gcnew Form(this);

    在Form2.h 中使用如下代码:

    #pragma once

    #include "Form1.h"             // 引入Form1窗体;

    ……(自动生成代码,将btn 的访问权限设定为Pulibc

    Form1^ f1;

    Public:Form2(Form1^ f)          //  重写构造函数;

    {

           this->f1 = f1;

    }

    在 btn 的单击事件中给出如下代码:

    if( true == f1->visible)

    {

        f1->visible = false;

    }

    报告以上编译错误(即一楼的错误).

    注释掉 btn 中的代码和 Form1^ f1,即也就是说在Form2 中包含进 Form1 也报告以上错误。

    如果我希望通过这种方法,即在Form2 中创建窗体的方法来解决这个窗体间的通信问题,是否可行,如果可以的话,我应该怎么做呢!

    我写这个例子只是想把问题简单化,避免一些其他的问题干扰到这个。

    ^ _ ^

    2012年6月10日 9:57
  • 循环引用的话,把代码放到cpp里面去。不过建议用委托和事件来避免循环引用。


    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP

    • 已标记为答案 qingfy2007 2012年6月11日 7:51
    2012年6月10日 15:04
    版主
  • 刚刚看到你的回复 ,我去试试看看!

    2012年6月11日 7:10
  • 感谢回复,你帮我搞定了这个问题!

    ^ _ ^

    2012年6月11日 7:51
  • 感谢回复,你帮我搞定了这个问题!

    ^ _ ^

    不用谢!感谢Jiang Chen吧!

    欢迎再来!互帮互助!


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月11日 7:54
  • 我按照你的方法(循环引用)搞定了这个问题,但是又有一个新的问题出现了。就是:

    我在退出VS2010再打开程序的时候,发现Form1 的设计界面是Form2 的,Form2的设计界面是Form1的。

    程序能正确运行和生成.exe 文件,生成的.exe 文件都运行正确,显示也OK。

    在Form1(此时显示的是Form2的界面)设计界面上右键查看代码,显示的是Form1的设计代码。

    在Form2(此时显示的是Form1的界面)设计界面上右键查看代码,显示的是Form2的设计代码。

    在Form1(此时显示的是Form2的界面)设计界面上添加一个按钮btn,之后双击(这样会自动产生 btn 的单击事件),自动转跳到Form1.h 的头文件中,其内查看不到 btn 的添加代码,但是打开 Form2.h ,发现btn 的添加代码在其中,为 btn 的单击事件添加代码也能顺利执行。

    总的说来问题就是:

    Form1的设计界面显示了Form2 的内容,Form2的设计界面显示了Form1 的内容,显示混乱,其他完全OK,包括生成.exe程序和运行。

    我的问题是不是有点多!

    求解,TKS!

    2012年6月11日 10:17
  • ^ _ ^

    2012年6月11日 10:17