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

在DLL中使用VCL的Event (regular procedure 的錯誤)

答題得分者是:timhuang
davidsun
初階會員


發表:57
回覆:71
積分:25
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-28 17:52:04 IP:61.66.xxx.xxx 未訂閱
各位好,    我做近在寫 DLL 中內涵 VCL 上發生一些問題,因此想請提出來大家賜教,我先列出我的程式碼:
 
unit MainUnt;    interface    uses CPort;    type
  TDataPackageEnevt = procedure(Sender: TObject; const Str: string) of object;    var
  COMPort: TCOMPort; {}
  DataPackage: TComDataPacket; {}
  DataPackageEnevt: TDataPackageEnevt;    function InitCOMPort: Boolean;
function OpenCOMPort: Boolean;
// 程序
procedure CloseCOMPort;
procedure DataPackagePacket(Sender: TObject; const Str: string); { DataPackage 收得 Stop char 字元觸發的事件 }    implementation    function InitCOMPort: Boolean;
// 建立 COM Port / TComDataPacket 物件
begin
  try
    COMPort := TCOMPort.Create(nil);
    DataPackage := TComDataPacket.Create(nil);
//    DataPackage.OnPacket := DataPackagePacket; {會出現 method pointer and regular procedure 的錯誤 }
    DataPackage.OnPacket := DataPackageEnevt;
    result := True;
  except
    result := False;
  end;
end;    function OpenCOMPort: Boolean;
// 開啟通訊
begin
  try
    COMPort.Open;
    result := True;
  except
    result := False;
  end;
end;    procedure CloseCOMPort;
// 關閉通訊
begin
  COMPort.Close;
  COMPort.Free;
end;    procedure DataPackagePacket(Sender: TObject; const Str: string);
// DataPackage 收得 Stop char 字元觸發的事件
begin
end;    end.    
感謝您耐心的看到這裡,在上面的 Source Code中,我宣告了一個 COMPort : TCOMPort; DataPackageEnevt: TDataPackageEnevt; 這是一個免費的 RS-232 元件以及資料觸發元件。 我在 Init 的程序中去 Create 他們。建立好之後,我要開始指定 Event,但是指定Event,實際上必須指定的處理Event的程序之位置,也就是指標。 所以如果我直接使用: DataPackage.OnPacket := DataPackagePacket; 這是會出現 {會出現 method pointer and regular procedure 的錯誤 } PS:DataPackagePacket是我宣告的一個程序: procedure DataPackagePacket(Sender: TObject; const Str: string); 所以我不能這樣用,我必須用 type TDataPackageEnevt = procedure(Sender: TObject; const Str: string) of object; 之後再使用 DataPackage.OnPacket := DataPackageEnevt; 如此才可以,但是:DataPackageEnevt只是一個指標,他也必須只到實際處理的程序位置是吧,所以我在用: DataPackageEnevt := DataPackagePacket; 可是這樣子也是不行的。一樣會有regular procedure 的錯誤,可否請各位賜教,我應該如何做呢? 謝謝您。
liorex
初階會員


發表:19
回覆:60
積分:32
註冊:2002-08-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-28 19:03:33 IP:61.222.xxx.xxx 未訂閱
我覺得你可以試試覆寫 TComDataPacket,加入一個新procedure就是你要的事件 然後在CREATE之後指定他 ex inherited Create(...); DataPackage.OnPacket := DataPackagePacket; ---------------------- 一切有為法 如夢幻泡影 如露亦如電 應做如是觀 ----------------------
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-28 21:15:45 IP:61.221.xxx.xxx 未訂閱
Hi, 建議你修改如下:    建立一個虛擬 class (其實用不到, 只是為了建立 procedure of object), 如此一來便可以指定給其他物件的 event 使用!!
type
  virtual_class = class
  public
    class procedure myprocedure(Sender: TObject; const Str: string);
  end;
//..
//
implement
//..
class procedure virtual_class.myprocedure(Sender: TObject;  const Str: string);
begin
  // something you want to do
end;
//..
function InitCOMPort: Boolean;
// 建立 COM Port / TComDataPacket 物件
begin
  try
    COMPort := TCOMPort.Create(nil);
    DataPackage := TComDataPacket.Create(nil);
//    DataPackage.OnPacket := DataPackagePacket; {會出現 method pointer and regular procedure 的錯誤 }
    DataPackage.OnPacket := DataPackageEnevt;
    DataPackage.OnPacket := virtual_class.myprocedure; //這樣就可以了..
    result := True;
  except
    result := False;
  end;
end;
davidsun
初階會員


發表:57
回覆:71
積分:25
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-29 09:43:58 IP:61.66.xxx.xxx 未訂閱
謝謝兩位網友的指點,我使用建立一個虛擬 class 的方式,解決了這個問題。 謝謝兩位。
系統時間:2024-05-17 7:25:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!