怎么动态生成MSComm控件
展开全部
如何动态生成MSComm控件
新建一个工程,添加一个Unit2.代码如下:
Unit2.cpp
//---------------------------------------
#pragma hdrstop
#include "Unit2.h"
#include <vcl.h>
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
//---------------------------------------
Test test1;
//---------------------------------------
Test::Test()
{
CoInitialize(NULL);
MSComm1 = new TMSComm((void*)(0));
MSComm1->CommPort=1;
MSComm1->RThreshold=1;
MSComm1->Settings="9600,e,8,1";
MSComm1->InputMode=0;
}
Unit2.h
//---------------------------------------
#ifndef Unit2H
#define Unit2H
#include "MSCommLib_OCX.h"
#include <OleCtrls.hpp>
//---------------------------------------
class Test
{
public:
Test();
private:
TMSComm *MSComm1;
};
//---------------------------------------
extern PACKAGE Test test1;
//---------------------------------------
#endif
可以通过Build,但一运行就报错。如果去掉.h文件中的extern PACKAGE Test test1;
和.cpp文件中的Test test1;则可以运行
请各位帮忙分析解决
------解决方案--------------------
#define RS232Count 21
TChannel * Channels[RS232Count];
void TForm1::InitModule() // 初始化
{
INIloaded=false;
CurDir=ExtractFilePath(Application->ExeName);
IniFile=ChangeFileExt(Application->ExeName,".INI");
ExeName=ChangeFileExt(ExtractFileName(Application->ExeName),"");
InRun=false;
TimerEnabled=false;
for (int i=0;i<RS232Count;i++)
Channels[i]=NULL;
}
bool TestRS232(int i) // 测试且打开某端口
{
bool stat=false;
TChannel *c=Channels[i];
if (c!=NULL)
{
TMSComm *p=c->mscomm;
if (!p->PortOpen) // 为假打开
try
{
p->PortOpen=true;
}
catch(...)
{
}
stat=p->PortOpen;
}
return(stat);
}
void TForm1::SetRS232(TMSComm *p,int port) // 仅设参数
{
p->InputMode=1; // 发送格式 0:文本 1:二进
p->RThreshold=1; // 让COM1产生接收事件
p->InputLen=0; // 每次接收的字符数
p->CommPort=port;
p->Settings=RS232->Text.Trim();
p->OnComm=MSComm1->OnComm;
}
void TForm1::NewRS232(int port) // 新建TMSComm
{
static bool first=true;
TChannel *c=new TChannel;
Channels[port]=c;
TMSComm *p;
if (first)
p=MSComm1;
else
p=new TMSComm(this);
p->Parent=this;
c->mscomm=p;
c->isIdle=true;
SetRS232(p,port);
bool yn=TestRS232(port);
if (first)
{
first=false;
RS232Stat->Caption=yn?"正常":"异常";
}
}
bool OpenRS232(int port) // 打开或创建端口,
{
bool stat=false;
if (port>=0 && port<RS232Count)
{
TChannel *c=Channels[port];
if (c==NULL)
{
Form1->NewRS232(port); // New时打开口一次
c=Channels[port];
}
stat=c->mscomm->PortOpen; // 非NEW保持不变
新建一个工程,添加一个Unit2.代码如下:
Unit2.cpp
//---------------------------------------
#pragma hdrstop
#include "Unit2.h"
#include <vcl.h>
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
//---------------------------------------
Test test1;
//---------------------------------------
Test::Test()
{
CoInitialize(NULL);
MSComm1 = new TMSComm((void*)(0));
MSComm1->CommPort=1;
MSComm1->RThreshold=1;
MSComm1->Settings="9600,e,8,1";
MSComm1->InputMode=0;
}
Unit2.h
//---------------------------------------
#ifndef Unit2H
#define Unit2H
#include "MSCommLib_OCX.h"
#include <OleCtrls.hpp>
//---------------------------------------
class Test
{
public:
Test();
private:
TMSComm *MSComm1;
};
//---------------------------------------
extern PACKAGE Test test1;
//---------------------------------------
#endif
可以通过Build,但一运行就报错。如果去掉.h文件中的extern PACKAGE Test test1;
和.cpp文件中的Test test1;则可以运行
请各位帮忙分析解决
------解决方案--------------------
#define RS232Count 21
TChannel * Channels[RS232Count];
void TForm1::InitModule() // 初始化
{
INIloaded=false;
CurDir=ExtractFilePath(Application->ExeName);
IniFile=ChangeFileExt(Application->ExeName,".INI");
ExeName=ChangeFileExt(ExtractFileName(Application->ExeName),"");
InRun=false;
TimerEnabled=false;
for (int i=0;i<RS232Count;i++)
Channels[i]=NULL;
}
bool TestRS232(int i) // 测试且打开某端口
{
bool stat=false;
TChannel *c=Channels[i];
if (c!=NULL)
{
TMSComm *p=c->mscomm;
if (!p->PortOpen) // 为假打开
try
{
p->PortOpen=true;
}
catch(...)
{
}
stat=p->PortOpen;
}
return(stat);
}
void TForm1::SetRS232(TMSComm *p,int port) // 仅设参数
{
p->InputMode=1; // 发送格式 0:文本 1:二进
p->RThreshold=1; // 让COM1产生接收事件
p->InputLen=0; // 每次接收的字符数
p->CommPort=port;
p->Settings=RS232->Text.Trim();
p->OnComm=MSComm1->OnComm;
}
void TForm1::NewRS232(int port) // 新建TMSComm
{
static bool first=true;
TChannel *c=new TChannel;
Channels[port]=c;
TMSComm *p;
if (first)
p=MSComm1;
else
p=new TMSComm(this);
p->Parent=this;
c->mscomm=p;
c->isIdle=true;
SetRS232(p,port);
bool yn=TestRS232(port);
if (first)
{
first=false;
RS232Stat->Caption=yn?"正常":"异常";
}
}
bool OpenRS232(int port) // 打开或创建端口,
{
bool stat=false;
if (port>=0 && port<RS232Count)
{
TChannel *c=Channels[port];
if (c==NULL)
{
Form1->NewRS232(port); // New时打开口一次
c=Channels[port];
}
stat=c->mscomm->PortOpen; // 非NEW保持不变
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询