線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1885
推到 Plurk!
推到 Facebook!

自製vcl,如何做到自動觸發event

尚未結案
yoyo12345
一般會員


發表:33
回覆:77
積分:22
註冊:2003-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-30 14:55:55 IP:61.220.xxx.xxx 未訂閱
請教一下 我目前在寫一個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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-30 17:35:42 IP:203.66.xxx.xxx 未訂閱
yoyo12345 您好: 不知道我沒有會錯意,請試看看 Dispatch 送出 message ,需告 procedure message 保留字,便可處理此 message 發生的接續動作
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-30 17:47:39 IP:61.155.xxx.xxx 未訂閱
通过消息的发送来控制元件的动作 发送方式: 1、手动触发控件 2、利用程式的消息 接受方式: 自己的vcl控件中,用 protected { Protected declarations } procedure WndProc(var Msg:TMessage); 来获取所有消息,并分类判断就可以了
yoyo12345
一般會員


發表:33
回覆:77
積分:22
註冊:2003-03-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-31 08:59:04 IP:61.220.xxx.xxx 未訂閱
請問讀出Dispatch為一些數字,代表什麼意義呢?
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-31 10:49:13 IP:203.66.xxx.xxx 未訂閱
引言: 通过消息的发送来控制元件的动作 发送方式: 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-31 11:42:40 IP:203.66.xxx.xxx 未訂閱
引言:
引言: 通过消息的发送来控制元件的动作 发送方式: 1、手动触发控件 2、利用程式的消息 接受方式: 自己的vcl控件中,用 protected { Protected declarations } procedure WndProc(var Msg:TMessage); 来获取所有消息,并分类判断就可以了
請問 sos_admin 版主 : 1. 是否只要在 VCL 元件內定義 WndProc,便會自動攔截所有的 Windows Message?? 2. 一定要宣告成 protected 嗎??
自問自答,若有錯誤請指正 .. 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 版主,又上了一課 ..
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-31 12:12:42 IP:203.66.xxx.xxx 未訂閱
引言: 請問讀出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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-01-05 16:11:01 IP:203.69.xxx.xxx 未訂閱
謝謝二位的回覆,不過...仍是有點問題.. 底下有篇文章,給大家參考
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-01-06 10:17:55 IP:203.66.xxx.xxx 未訂閱
引言: 謝謝二位的回覆,不過...仍是有點問題.. 底下有篇文章,給大家參考 >< face="Verdana, Arial, Helvetica"> 看了 MSMQ 文件,又增長見聞了,感恩 ... 我並不很了解實際上運作 > ---- 我只會兩件事,這也不會,那也不會
yoyo12345
一般會員


發表:33
回覆:77
積分:22
註冊:2003-03-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-01-06 14:11:02 IP:203.69.xxx.xxx 未訂閱
謝謝您的回覆..... 按它的說明,應該是不用再做其他的處理 「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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-01-06 14:17:33 IP:61.220.xxx.xxx 未訂閱
PS.我也不太確定是否就是版本的問題...目前我先從這方面著手..
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-01-06 14:30:44 IP:203.66.xxx.xxx 未訂閱
引言: PS.我也不太確定是否就是版本的問題...目前我先從這方面著手..
結論: 不要用最新的 OS ... > 很高興我寫的您有看懂,我也認為 > ---- 我只會兩件事,這也不會,那也不會
系統時間:2024-07-09 4:55:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!