怎样将自定义的事件用消息发送?(200)

  • 主题发起人 主题发起人 Dv
  • 开始时间 开始时间
D

Dv

Unregistered / Unconfirmed
GUEST, unregistred user!
定义示意:type TMyItemObject = class(TComponent) TMyNotifyEvent = procedure(Sender: TObject; ItemObject: TMyItemObject) of object; TMyObject = class(TComponent) published property MyNotifyEvent: TMyNotifyEvent end;问题描述:设计采用MDI,每个TMyObject实例有多个不同功能的窗体,允许同时打开全部窗体,每个窗体响应不同的事件集合,其中有些事件的处理方法不一样.现在的方案是,给窗体增加事件方法,然后统一在TMyObject的事件中调用各个窗体的事件方法.考虑到以后会增加更多的窗体,希望改成用广播消息的方式触发事件.但是不知道如何把自定义事件的参数发送出去.不知道我有没有描述清楚?还请各位高手指教.谢谢!
 
多个变量可以合并到一个变量中,如下:procedure TForm1.Button1Click(Sender: TObject);Var V1,V2:Variant; I,L,H:Integer;begin //将多个数据合并到一个变量中 V1:=VarArrayOf([1,2,3]); V2:=VarArrayCreate([1,3],varVariant); V2[1]:=1; V2[2]:=2; V2[3]:=3; // L:=VarArrayLowBound(V2,1); H:=VarArrayHighBound(V2,1); for I:=L to H do Caption:=Caption+ VarToStr(V2);end;
 
用指针应该可以TMyNotifyEvent = procedure(Sender: TObject; ItemObject: TMyItemObject; PEvent: Pointer) of object;传递事件指针结构的公共信息结构PEventInfo = ^TEventInfo;TEventInfo = record EventType: Word; // 第一个参数, 据此值来决定 PEvent 应转成相应结构 // 其它公共信息end;如: 当 EventType = 1; 时对应 PEventType1PEventType1 = ^TEventType1;TEventType1 = record EventInfo: TEventInfo; // 公共结构 放在最前面 // EventType1 的信息end;当 EventType = 2; 时对应 PEventType2PEventType2 = ^TEventType1;TEventType2 = record EventInfo: TEventInfo; // 公共结构 放在最前面 // EventType2 的信息end;// 当你的通知到达一个窗体(假设为: TMyFormx 类型的)时, 假如我们这个窗体只接收 TEventType2 结构信息, 那么如下取值procedure TMyFormx.MyNotifyEvent(Sender: TObject; ItemObject: TMyItemObject; PEvent: Pointer);begin // 只要 PEvent 不为 nil, 则 PEvent 转为公共结构指针(PEventType(PEvent) )一定是安全的. if (PEvent = nil) or (PEventType(PEvent)^.EventType <> 2) then begin // 不属于自己要接收的类型, 退出! Exit end else begin // 这样就可以保证安全转换为我们要结构指针(此时为 PEventType2)了 with PEventType2(PEvent)^ do begin // 这样就可以取得你自己的结构信息了``` end; end;end;
 
liuls:有些明白,正在理解.znxia:不明白你是什么意思.
 
liuls:按照你的思路,我在广播时,要分配一个指针变量.我怎样来保证这个变量被正确的销毁呢?
 
每天要顶帖,我顶我存在
 
消息发送我知道有两种:一种是有消息队列的(就象 Windows 消息一样), 另一种是没消息队列的(即立刻就执行的);但是两种都有一步相同的是: 先要取得消息, 然后 循环执行MyNotifyEvent(), 在循环执行完之后就可以销毁了.
 
liuls:嗯,是的.消息一直再循环,所以不必立即销毁.还有,我觉得你的定义:PEventInfo = ^TEventInfo;TEventInfo = record EventType: Word; // 第一个参数, 据此值来决定 PEvent 应转成相应结构//^^^^^^^^^这里如果独立出来,是否更合理? // 其它公共信息end;
 
每个TMyObject实例有多个不同功能的窗体,想必你可以在TMyObject自由访问隶属于该对象的各个窗体,是吧。那你就可以让这些窗体直接从某个基类窗体中继承,在基类窗体中定义一个过程,该函数的功能由子类进行扩展就可以了啊。如果想通过消息,以前遇到一个案例,拷贝给你.进程之间发送字符串 procedure PostStrToOther(H: HWND; OtherStr: string); //发送消息 var DS: TCopyDataStruct; begin ShowMessage('发送:' + OtherStr); Ds.cbData := Length(OtherStr) + 1; GetMem(Ds.lpData, Ds.cbData); StrCopy(ds.lpData, PChar(OtherStr)); SendMessage(H, WM_COPYDATA, Application.Handle, Cardinal(@ds)); FreeMem(Ds.lpData); end; procedure TFrmXZN.MyMessage(var t: TWMCopyData); //Message WM_COPYDATA; var tmpStr:String; begin //接受消息并显示。 tmpStr:=StrPas(t.CopyDataStruct^.lpData); Memo1.Lines.Add(tmpStr); end;
 
帮顶,接分
 
PEventInfo = ^TEventInfo;TEventInfo = record EventType: Word; // 第一个参数, 据此值来决定 PEvent 应转成相应结构//^^^^^^^^^这里如果独立出来,是否更合理? // 其它公共信息end;----------------------------------------------------------------------->TEventInfo 这个结构已经是属于公共结构信息了,PEventInfo = ^TEventInfo;TEventInfo = record EventType: Word; // 第一个参数, 据此值来决定 PEvent 应转成相应结构 // 其它公共信息 --- 这里可有可无了, 根据你实际情况了!end;
 
呃......看楼上们写的......头晕我只看楼主的要求,有几个疑问,你的TMyObject里有许多不同功能的窗体这些窗体是类的固定属性对象(如Myobject.Form1,Myobject.Form2 这样的),还是不确定数量和类型的扩展对象(Myobject.forms[x]这样的)?如果是第1种,你只需要每个窗体设置固定的响应代码并封装成公开函数就可以了,根据TMyObject不同的状态和需求,执行不同窗体的函数如果是第2种,你也可以先为forms里的对象设置一个基类(就像TString那样的)设置一些虚函数,或者设置一个自定义消息MMO_NOTIFY,循环向forms里的对象发送消息然后在基类里相应这个消息并执行一个自定义事件或者直接在每个form对象里截获这个消息病相应相关代码不知道是不是我理解错了....楼主先说“每个TMyObject实例有多个不同功能的窗体”那么这些窗体应该是属于TMyObject的内部对象而事件是类把消息或状态传递给外部对象用的......不知道为什么又会和那些窗体产生关系....?
 
znxia,hs-kill:我目前正在使用窗体函数的方式.我的理解,此种方式符合OOP,但是对于此项目,无法做到物理上的分割.对于将来不可预见的定制要求,维护工作是个巨大的挑战.liuls:谢谢你的思路.lcmlhs:感谢参与.衷心感谢大家的帮助,希望以后还能向你们请教.留个邮箱:deendom@126.com
 
有几天DFW上不了,结贴迟了,还请你们谅解.
 
后退
顶部