我目前正在用C ++ / CLI编写程序。我有一个Windows窗体作为用户界面。现在我要做的是声明一个单独的c ++类,并让它访问表单上的文本框。
表单在MyForm.h文件中声明 该类由头文件和cpp文件定义,让我们调用它们myClass.cpp和myClass.h
程序的功能应该如下:程序应该通过当前可用的所有串行端口,然后尝试打开它们并轮询它们以获取数据。如果串口有一个很好的答案,那么它应该结束搜索并保持连接到这个端口。所以在这种情况下,myClass应该检查串口并返回所需端口的名称。我还希望能够在Windows窗体的文本框中跟踪端口搜索线程的进度。我可能只是将端口搜索包含在表单的初始化代码中,但这将非常混乱并且会在单个头文件中导致大量代码。这看起来并不合理。
我知道我无法直接访问Windows窗体文本框并且必须使用Invoke方法,这当前不是问题。问题是我真的不知道如何让两个类相互通信。我已经尝试声明一个指向MyForm对象的指针,但这似乎不起作用。我似乎无法获得头和cpp文件连接。
如果这听起来令人困惑,我很抱歉,我会尝试通过示例和代码进行解释。
仅仅为了概念测试,我制作了一个非常简单的程序,它由一个Windows窗体和一个名为simpleAdder的类组成。
//simpleAdder.h
#pragma once
#include "MyForm.h"
using namespace System;
using namespace simpleClassTest;
public ref class simpleAdder
{
private:
Int16 a;
Int16 b;
MyForm^ m_form;
public:
simpleAdder(Int16 x,Int16 y, MyForm^ form);
Int16 add (void);
};
这是simpleAdder的cpp文件:
//simpleAdder.cpp
#include "MyForm.h"
#include "simpleAdder.h"
using namespace System;
using namespace simpleClassTest;
simpleAdder::simpleAdder(Int16 x,Int16 y, MyForm^ form){
a = x;
b = y;
m_form = form;
}
Int16 simpleAdder::add (void){
return a+b;
//Try to invoke the textbox method. This is not implemented yet.
}
所以我的想法是,我会有一个指向现有表单的托管指针,通过这个,我可以访问表单本身。加法器类基本上应该尝试将x + y的结果写入表单文本框。
以下是MyForm.h文件中的一些代码
#pragma once
#include "simpleAdder.h"
namespace simpleClassTest {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
//ref class simpleAdder;
/// <summary>
/// Summary for MyForm
/// </summary>
public ref class MyForm : public System::Windows::Forms::Form
{
public:
MyForm(void)
{
InitializeComponent();
this->m_add = (gcnew simpleAdder (16,10));
//
//TODO: Add the constructor code here
//
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~MyForm()
{
if (components)
{
delete components;
}
}
private:
/// <summary>
/// Required designer variable.
/// </summary>
simpleAdder^ m_add;
private: System::Windows::Forms::Button^ button1;
private: System::Windows::Forms::TextBox^ textBox1;
System::ComponentModel::Container ^components;
//Here follows the automatically generated code.
问题在于,无论我做什么,我都无法编译。编译器无法识别MyForm类型变量。还有两个包含彼此的标题似乎不对,但我真的不知道还能做什么。我尝试在同一名称空间中声明这两个类,但这也没有帮助。然后我尝试在MyForm头文件中声明simpleAdder类,但这不起作用。
我显然没有c ++ / cli经验,而且我似乎在做一些根本错误的事情。我认为必须有更好的方法来实现这样的事情。我的意思是最后我必须在Windows窗体中添加其他类来显示信息等。必须有一种简单的方法来做到这一点。任何有关这方面的帮助将非常感激。
答案 0 :(得分:0)
让我们看看包含的顺序:
simpleAdder.cpp包含MyForm.h
MyForm.h包含simpleAdder.h
在easyAdder.h中包含到MyFrom.h被跳过,因为#pragma一次
然后是代码:
public ref class simpleAdder
{
private:
Int16 a;
Int16 b;
MyForm^ m_form;
public:
simpleAdder(Int16 x,Int16 y, MyForm^ form);
Int16 add (void);
};
但是在任何地方都没有宣布MyForm。
阅读前瞻性声明。您可以在simpleAdder:
之前声明MyFormpublic ref class simpleAdder; // or without public