自製vcl,如何做到自動觸發event |
尚未結案
|
yoyo12345
一般會員 ![]() ![]() 發表:33 回覆:77 積分:22 註冊:2003-03-19 發送簡訊給我 |
請教一下
我目前在寫一個MSMQ的元件
如何做到訊息佇列有資料,就自動觸發event
我的做法如下,不過只能在手動按button時觸發event...
謝謝!!
========================
type
TMyMSMQEvent = procedure(Msg: String) of object; TMSMQ = class(TComponent)
private
MSMQQueueInfo1:TMSMQQueueInfo;
MSMQQueue1:TMSMQQueue;
MSMQMessage1:TMSMQMessage;
MSMQEvent1:TMSMQEvent;
IMSMQQ:IMSMQQueue2;
IMSMQMsg:IMSMQMessage2;
FOnReadPath:string;
FOnReadArrived:TMyMSMQEvent;
procedure SetReadPath(Apath:String);
protected
procedure MSMQEvent1Arrived(ASender: TObject;
const Queue: IDispatch; Cursor: Integer); public
constructor create(Aowner:TComponent);override;
destructor Destroy;override;
property PathName:string read FOnReadPath write SetReadPath;
property OnRead:TMyMSMQEvent read FOnReadArrived write FOnReadArrived;
published
end; procedure Register; implementation procedure TMSMQ.SetReadPath(Apath:String);
begin
MSMQQueueInfo1.PathName:=Apath;
try
IMSMQQ:=MSMQQueueInfo1.Open(MQ_RECEIVE_ACCESS ,MQ_DENY_NONE);
except
MSMQQueueInfo1.Create1;
IMSMQQ:=MSMQQueueInfo1.Open(MQ_RECEIVE_ACCESS ,MQ_DENY_NONE);
end;
MSMQQueue1.ConnectTo(IMSMQQ);
MSMQQueue1.EnableNotification(MSMQEvent1.DefaultInterface);
MSMQEvent1.OnArrived:=MSMQEvent1Arrived;
end; procedure TMSMQ.MSMQEvent1Arrived(ASender: TObject;
const Queue: IDispatch; Cursor: Integer);
var
Msg:string;
begin
Msg :=MSMQQueue1.Receive.Body ;
if Assigned(FOnReadArrived) then FOnReadArrived(Msg);
MSMQQueue1.EnableNotification(MSMQEvent1.DefaultInterface);
end;
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
|
sos_admin
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
yoyo12345
一般會員 ![]() ![]() 發表:33 回覆:77 積分:22 註冊:2003-03-19 發送簡訊給我 |
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 通过消息的发送来控制元件的动作 发送方式: 1、手动触发控件 2、利用程式的消息 接受方式: 自己的vcl控件中,用 protected { Protected declarations } procedure WndProc(var Msg:TMessage); 来获取所有消息,并分类判断就可以了請問 sos_admin 版主 : 1. 是否只要在 VCL 元件內定義 WndProc,便會自動攔截所有的 Windows Message?? 2. 一定要宣告成 protected 嗎?? |
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言:自問自答,若有錯誤請指正 .. 1. 必須繼承 TControl 元件後, override WndProc 方法,會自動攔截所有的 Message ,不過要作用在原件的 "作用範圍" 內 2. 可以宣告成 private 不過會有警告 (可以執行): [Hint] Unit1.pas(12): Overriding virtual method 'TTest.WndProc' has lower visibility (private) than base class 'TControl' (protected) 宣告成 protected 比較恰當 .. 感謝 sos_admin 版主,又上了一課 ..引言: 通过消息的发送来控制元件的动作 发送方式: 1、手动触发控件 2、利用程式的消息 接受方式: 自己的vcl控件中,用 protected { Protected declarations } procedure WndProc(var Msg:TMessage); 来获取所有消息,并分类判断就可以了請問 sos_admin 版主 : 1. 是否只要在 VCL 元件內定義 WndProc,便會自動攔截所有的 Windows Message?? 2. 一定要宣告成 protected 嗎?? |
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 請問讀出Dispatch為一些數字,代表什麼意義呢?方法一 : 利用 WndProc 範例如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TTest = class(TControl) private procedure WndProc(var Msg:TMessage);override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } t1 :TTest; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TTest.WndProc(var Msg:TMessage); begin if Msg.Msg = WM_RBUTTONDBLCLK then ShowMessage('·Æ¹«¥kÁä³Q«ö¤U!!'); inherited WndProc(Msg); end; procedure TForm1.FormCreate(Sender: TObject); begin t1 := TTest.Create(self); t1.Top := Top; t1.Left := Left; t1.Width := Width; t1.Height := Height; t1.Parent := self; end; end.方法二 : 利用 Dispatch 範例如下: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=42969 希望對您有所幫助.. |
yoyo12345
一般會員 ![]() ![]() 發表:33 回覆:77 積分:22 註冊:2003-03-19 發送簡訊給我 |
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
|
yoyo12345
一般會員 ![]() ![]() 發表:33 回覆:77 積分:22 註冊:2003-03-19 發送簡訊給我 |
謝謝您的回覆.....
按它的說明,應該是不用再做其他的處理
「Call MSMQQueue.EnableNotification to restart notification...」
我的問題 目前應是卡在版本上
我的系統是xp Professional,之前裝的是MSMQ2.0
不過依以下說明,我應該裝MSMQ3.0
「Microsoft Message Queue 3.0 Object Library: Provided by Windows XP Professional and the Windows Server 2003 family.」
但 問題有點頭痛..3.0裝不上去,仍找不到解決方法
http://groups.google.com/groups?dq=&hl=zh-TW&lr=&ie=UTF-8&inlang=zh-TW&selm=#yCMYnjxDHA.2520@TK2MSFTNGP10.phx.gbl
|
yoyo12345
一般會員 ![]() ![]() 發表:33 回覆:77 積分:22 註冊:2003-03-19 發送簡訊給我 |
|
seaturn99
版主 ![]() ![]() ![]() ![]() 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |