在DLL中使用VCL的Event (regular procedure 的錯誤) |
答題得分者是:timhuang
|
davidsun
初階會員 ![]() ![]() 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
各位好,
我做近在寫 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 發送簡訊給我 |
|
timhuang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
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); |
davidsun
初階會員 ![]() ![]() 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |