为什么我在ActiveXform中使用cport的comport控件会无法触发OnRxChar事件?(50分)

  • 主题发起人 主题发起人 jp2002
  • 开始时间 开始时间
J

jp2002

Unregistered / Unconfirmed
GUEST, unregistred user!
如果用在普通form上两样的代码是能触发onRxChar事件,但一用在activeXform中就没反应了。
这怎么办?
有没有变通的办法?
 
那是ActiveXForm中处理消息的方式改变了,可能没有直接的方法可以实现。

可能性1:动态生成一个不可见Form,控件放在上面,数据接收部分放在上面。
可能性2:修改cport的源程序,动态生成一个Form来实现。
可能性3:该ActiveXForm载入时生成一个进程外Automation Object来负责读取COM接口数据,
然后通过COM回调调用ActiveXForm,通知ActiveXForm数据到达。
 
unit ActiveFormImpl2;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ActiveX, AxCtrls, ActiveFormProj2_TLB, StdVcl, StdCtrls, CPort;

type
TActiveFormX = class(TActiveForm, IActiveFormX)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
......
procedure MyRxChar(Sender: TObject
Count: Integer);
protected
{ Protected declarations }
......
......
public
{ Public declarations }
procedure Initialize
override;
end;

implementation

uses ComObj, ComServ;

{$R *.DFM}

{ TActiveFormX }

procedure TActiveFormX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage);
begin
{ Define property pages here. Property pages are defined by calling
DefinePropertyPage with the class id of the page. For example,
DefinePropertyPage(Class_ActiveFormXPage)
}
end;

procedure TActiveFormX.MyRxChar(Sender: TObject
Count: Integer);
var s,str:string;
comport:Tcomport;
begin
label1.Caption:='ok';

comport := Sender as TComPort;
ComPort.ReadStr(str, Count);

...... //数据处理
end;

procedure TActiveFormX.Button1Click(Sender: TObject);
var str:string;
myform:TForm;
comport:Tcomport;
begin
//动态生成form和comport
myform:=Tform.Create(nil);
comport:=Tcomport.Create(myform);
comport.OnRxChar:=MyRxChar;

ComPort.Open;

str := ......
comport.write(str[1],length(str));

......
......
end;

initialization
TActiveFormFactory.Create(
ComServer,
TActiveFormControl,
TActiveFormX,
Class_ActiveFormX,
1,
'',
OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
tmApartment);
end.

几个问题:
1、以上代码编译成功,但仍然无法接收到OnRxChar事件(即label1.caption:='ok'一句不响应)
2、不知道我动态生成form和comport的代码写的对不对
3、生成Automation Object读取COM接口、回调ActiveXForm能否举个例子?
 
你首先要在ActiveFormProj2_TLB.pas文件中然后按F12可以看到一个界面,
你可以看到一个编缉界面,你可以看到一个IActiveFormXEvents 项目,你可以增加你的事件,
然后按刷新按钮进行刷新,然后到ActiveFormPorj2.pas进行编缉函数,将你定义得事件名称与你写得函数事件对应起来即可
 
可是我要定义的不是ActiveXForm的事件,而是ComPort的事件啊
在IActiveFormXEvents里定义应该是ActiveXForm的事件
还有,OnRxChar是封装在ComPort里的事件,这还需要再定义吗?

能具体举个例子吗?
 
需要再定义,你自定义你自己得事件,将这个事件指到ComPort.OnRxChar这样在调用时你可以在你定义得事件中写需要在OnRxChar中的功能实现代码,我可以发一个例子给你看看
 
好的,请发到 jp2002x@21cn.com
 
你的例子已收到,不过好像你例子中自定义的事件无效?
我的问题我已经通过变通的办法解决了(不通过事件),但我仍想知道如何将自定义的事件
与控件的事件关联起来
 
我得例子是通过测试得,我自己在VB中调用它得
 
To jp2002:
你动态指定控件事件的方式已经是正确的,只是ActiveXForm的消息机制导致事件不可用。

To 风雪一飘遥:
不知道你的例子的情况,不过jp2002定义的不是ActiveXForm的事件,
你的做法好像有点古怪,是否我想错了?
 
这个问题我本想给分了,但还想听听两位的辩论:),故暂时不结束问题,过两天吧。
我的疑问是原来activeXform不支持的事件如何通过自定义事件的办法使其能用起来?
这好像也是kyq的疑问吧
To:风雪一飘遥
你的那个例子中你自定义的事件真的好像是无效的,至少我没试出来。
 
给你一个调用例子
 
To:风雪一飘遥,你的例子怎么用?exe文件执行报错,源文件打开也报错,TActiveFormX
找不到,我在uses里加上activeX就不报这个错了,但还报其它的错
“Field Form1.ActiveFormX1 does not have a corresponding component”
我已把你上次的例子和这次的例子放在同一目录下了。
 
先注册我给你发得那个ACTIVE生成的ActiveFormProj1.ocx文件
打开Delphi
菜单:Component-->Import ActiveX Control...
选择,ActiveForm1 Libary(Version 1.0)
点击install即可进行安装,然后你会发现在Active控件栏内多了一个图标即是ActiveFormX
然后打开编译我给你的调用例子
 
谢谢大家的热心帮助,尤其是风雪一飘遥,我最近没时间试你发给我的例子了,
过几天我抽时间试一下,从你的说明来看,应该能试成功
先给分吧:)
 
后退
顶部