类中如何引用控件的事件

ztgbasil 2003-10-20 09:43:17
如:
type
TTest=class(TThread)
comm1:TMSComm;
procedure Comm1Comm(Sender:TObject); // ---@
private
{private declare}
public
{public declare}
end;

procedure TTest.Comm1Comm(Sender:TObject); //--@@@
begin
//执行一系列的操作
if mscomm1.CommEvent =2 then
begin
// ..............
end;
end;

注:MSCOMM是个控件,它有一个OnComm事件,一旦串口接收到数据,便会触发这个事件,所以在客户端就可以直接在这个事件中接收数据。(先不考虑,MSCOMM是否支持多线程问题,假定是支持多线程的)
现在我的要求是不用form(别用Form1.enabled:=false),需要在后台运行的。做一个DLL文件,利用接口调用线程,通过线程启动串口,并从串口接收数据。请问该如何实现这个事件????实际上问题要解决的是:如何让@ 与@@@关联起来?

如果将其放在窗体上,那么它的形态为:
------------------------------
type
TForm1 = class(TForm)
MSComm1: TMSComm;
procedure MSComm1Comm(Sender: TObject); //控件接收事件
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
-----------------------------
procedure TForm1.MSComm1Comm(Sender: TObject);
var
Receive_Temp:Variant;
Receive_Byte :Byte;
Temp:String;
begin
if mscomm1.CommEvent =2 then
begin
repeat
Receive_Temp:=mscomm1.Input ;
Receive_Byte:=Receive_Temp;
if Receive_Byte<16 then
Temp:='0' & Hex(Receive_Byte)
else
Temp:=Hex(Receive_Byte);
PortReceData:=PortReceData & Temp; //计数器会自动查询该变量
until mscomm1.InBufferCount >0;
end;
------------------------------
我看了一下dfm文件,其中有一段是定义Form1与OnComm的关联的:
object MSComm1: TMSComm
Left = 208
Top = 8
Width = 32
Height = 32
OnComm = MSComm1Comm //就是这里
ControlData = {
2143341208000000ED030000ED03000001568A64000006000000010000040000
00040000802500000000080000000000000000003F00000011000000}
end
end;
...全文
161 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ztgbasil 2003-10-20
  • 打赏
  • 举报
回复

谢谢楼上各位热心的兄弟,谢谢 zzh54zzh(我也要补钙!)
你们的解答让我茅塞顿开,深感功力太浅
再次谢谢各位
ztgbasil 2003-10-20
  • 打赏
  • 举报
回复
在上面的例子中:
procedure TForm1.MSComm1Comm(Sender: TObject);
已经是Mscomm的事件了,可以直接在里面处理了;
我需要的是:
procedure TTest.Comm1Comm(Sender:TObject);
begin
//处理接收数据
end;
这个过程,怎么样才能够与线程类中定义MSComm控件的OnComm事件连接在一起?
因为:MSCOMM中触发的OnComm()事件,他是控件自带的一个事件,我们在上面
写的是我们自己的一个过程。
IORILI 2003-10-20
  • 打赏
  • 举报
回复
楼上已经说得很明白了
zzh54zzh 2003-10-20
  • 打赏
  • 举报
回复
这是我在线程里调用控件的事件,你可以在你的类里调用控件的事件。
type
TDownLine = class(TThread)
private
{ Private declarations }
YNDel:Boolean;
YNInStringList:Boolean;
FNMFTP: TNMFTP;
protected
procedure MFTPPacketRecvd(Sender: TObject);
procedure MFTPConnect(Sender: TObject);
procedure MFTPDisconnect(Sender: TObject);
procedure FNMFTPError(Sender: TComponent; Errno: Word;
Errmsg: String);

procedure Execute; override;
destructor Destroy;override;
public
constructor Create;
end;
Var
DownThread:TDownLine;
YNDisConnect:Boolean;

implementation
uses
Main,DataM,UnitMusicNoSelect,UnitMusicLook,UnitVideoLook,ToolsUnit;

constructor TDownLine.Create;
begin
FNMFTP:=TNMFTP.Create(Application);
FNMFTP.OnPacketRecvd:=MFTPPacketRecvd;
FNMFTP.OnConnect:=MFTPConnect;
FNMFTP.OnDisconnect:=MFTPDisconnect;
FNMFTP.Onerror:=FNMFTPError;
Linux2001 2003-10-20
  • 打赏
  • 举报
回复
你直接在你的自定义过程中调用控件的事件不就OK了
procedure TForm1.MSComm1Comm(Sender: TObject);
begin
mscomm1.OnComm(参数我不知道,自己写);
end;
不过我写串口程序,一般不用MSComm控件,我用的是VCL库(第三方的)串口控件
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

5,943

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧