在 DLL 中使用 VCL 元件指定 Event 的問題 |
答題得分者是:dllee
|
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
大家好,
在下再撰寫 RS-232程式時,是使用 TMS 的 Async32 元件,但是最近我想將這些包入到 DLL 中。在 DLL 中,我會定義很多 Function / Procedure 來控制這個元件,當然,第一步驟就是要建立元件。
unit MainUnt; interface uses vaComm, vaSystem, xUtils, _xComm; function CreateCOMPort(PortNumber: Integer): Boolean; export; stdcall; // 建立通訊埠 function SetComm(br: TBaudRate; db: TDataBits = DB_8; sb: TStopBits = sbOneStopBit; // 設定通訊埠參數 py: TParityBits = prNone): Boolean; export; stdcall; procedure SetMonitorEvents(evEvent: TComEvents); // 設定要偵測的事件 // function OpenPort: Boolean; export; stdcall; // Events procedure COMPortOpen(Sender: TObject); var COMPort: TvaCOMM; OpenPortSuccess: Boolean = False; implementation function CreateCOMPort(PortNumber: Integer): Boolean; // 建立通訊埠 begin COMPort := TvaComm.Create(nil); try COMPort.PortNum := PortNumber; except result := False; COMPort.Free; end; end;所以想要使用在 DLL 中的這個元件,我就必須先呼叫 CreateCOMPort 來建立此元件,OK , 在元件中當然會有很多 Event,一般我們在普通的 AP 中,都是直接在 Object Inspector 中的 Events 雙擊兩下來編輯事件發生的程式碼。 但是在 DLL 中,我們要該事件發生的時候自己做一些處理。所以我在元件建立的時候: // Events procedure COMPortOpen(Sender: TObject); var COMPort: TvaCOMM; OpenPortSuccess: Boolean = False; implementation function CreateCOMPort(PortNumber: Integer): Boolean; // 建立通訊埠 begin COMPort := TvaComm.Create(nil); try COMPort.PortNum := PortNumber; COMPort.OnOpen := COMPortOpen; except result := False; COMPort.Free; end; end;我加上了 COMPort.OnOpen := COMPortOpen; 希望 OnOpen 事件發生時,處理我寫好的程序:COMPortOpen 但是這樣是不行的。編譯時會發生 Incompatible types: 'method pointer and regular procedure' 我知道 COMPort.OnOpen 應該是一個指標,知道一個程序的位置, 這訊息的意義我解讀是 : 一個方法的指標不能指定一個常規程序... 這樣的寫法在一般的 AP ,甚至我在 Thread 都沒有問題,但是在 DLL 則有問題。請問各位我是不是什麼定方沒有作對呢? 謝謝您的指教 |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
在 VCL 元件的事件 OnXXX
必需使用 VCL 元件的 Method 來指定,
您可以建一個空的表單,此表單內有
procedure COMPortOpen(Sender: TObject);
如此,COMPortOpen 就可以是任一元件的 OnXXX http://www.ViewMove.com 視動自動化科技股份有限公司 ViewMove Technologies, Inc.
------
http://www.ViewMove.com |
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
引言: 在 VCL 元件的事件 OnXXX 必需使用 VCL 元件的 Method 來指定, 您可以建一個空的表單,此表單內有 procedure COMPortOpen(Sender: TObject); 如此,COMPortOpen 就可以是任一元件的 OnXXX http://www.ViewMove.com 視動自動化科技股份有限公司 ViewMove Technologies, Inc.感謝您的指教,這個問題原來我在以前有問過,也有解決過,但是時間一久就忘記了。還是很謝謝您。 版主對不起,重複發問了。Sorry 我以前問的連結: |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
|
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 至於哪一個好用嘛..... 我覺得 TMS 的滿不錯的, 有 XModem , YModem , TTY, ANSI , Modem 等元件...,如果有經費的考量,那 CPort 很不錯但是上述的東西要自己繼承 COMPort 元件去加強... --------------------------------------------- 此外,因為我的電腦會用 Multi-IO RS-232 Card 連接超過 10 台數據機,所以我也必須用 Thread 的方式來控制 RS-232 不過呢!!以上兩個我現在都不算用了,準備用 CreateFile , GetCommState, SetCommState WaitCommEvent 等...Win API 自己寫.... 雖然剛開始的功能不會有這些商業元件強大,但是初期只要完成符合我的需求就好,功能可以隨者需求慢慢加強。做重要的是:可以百分之百掌握在我的手上.....哈哈,原來到最後都還是用自己寫的比較好 我們公司也是用自己寫的,原本也想用現成的,但發現有些不能傳/收 > < href="http://www.ViewMove.com">http://www.ViewMove.com 視動自動化科技股份有限公司 ViewMove Technologies, Inc.
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |