關於物件,指標的運用... |
缺席
|
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
Greeting ,
我在一的 Form 中有 5 個一樣的元件,例如是:TEdit 元件好了,在另一個單元中,我有一個陣列: EditList : array[0..4] of TEdit; OK,我現在使用
EditList[0] := Edit1;
EditList[1] := Edit2;
....等等....
此時,我要指定其 Event ,所以我使用:
EditList[0].OnChange = XXXXX ;
可是這樣會有錯誤,也就是說 當我要使用此元件的方法等...
會有錯誤,但是有些不會,可否請教各位,我這樣的作法是不是有不對的地方呢?
|
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
在主程式中, 我有 10 個 COM Port 及 DataPackage 元件,我是使用 CPort Lib。
在另外一格 Unit 中,我定義了:
unit _ResourceUnt; interface uses Classes, winreg, Registry, Windows, SysUtils, CPort, Forms, xStrings; type TModemInfo = class FModemCount: Integer; FModem: array[0..9] of TComPort; FDataPackage: array[0..9] of TComDataPacket; public function FindInstalledModem: Integer; procedure SetCOMPort(iPort: Integer; COMPortComp: TComPort; DataPackageComp: TComDataPacket); published property ModemCount: Integer read FModemCount; end; implementation { oModemInfo } function TModemInfo.FindInstalledModem: Integer; // 尋找已經安裝的數據機數量 var sClass, sModemClass: TStrings; i, j, Count: Integer; oReg, oModemReg: TWinRegistry; begin // 讀取系統數據機的資訊 oReg := TWinRegistry.CreateWithKey(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Class'); sClass := TStringList.Create; sModemClass := TStringList.Create; Count := 0; try oReg.ReadSections(sClass); for i := 0 to sClass.Count - 1 do begin if uppercase(oReg.ReadString(sClass.Strings[i], 'Class', '')) = 'MODEM' then begin oModemReg := TWinRegistry.CreateWithKey(HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Control\Class\' sClass.Strings[i]); oModemReg.ReadSections(sModemClass); for j := 0 to sModemClass.Count - 1 do begin inc(Count); end; oModemReg.Free; end; end; finally sClass.Free; sModemClass.Free; oReg.Free; end; FModemCount := Count; result := Count; end; procedure TModemInfo.SetCOMPort(iPort: Integer; COMPortComp: TComPort; DataPackageComp: TComDataPacket); begin FModem[iPort] := COMPortComp; FDataPackage[iPort] := DataPackageComp; FDataPackage[iPort].StopString := #13; end; { 之後我在主程式中的用法是: 先宣告:oModem: TModemInfo; 及 oModem := TModemInfo.Create; } procedure TMainFmt.FormShow(Sender: TObject); var i: Integer; C: TComponent; begin Application.ProcessMessages; WriteLog('開始初始化數據機', True); WriteLog(Format('找到 %s 台數據機', [IntToStr(oModem.FindInstalledModem)]), True); for i := 0 to oModem.ModemCount - 1 do begin oModem.SetCOMPort(i, TComPort(MainFmt.FindComponent('COMPort' IntToStr(i))), TComDataPacket(MainFmt.FindComponent('DataPackage' IntToStr(i)))); end;在其中的 SetCOMPort 方法,我將主程式中的 COMPort 及 DataPackage 傳給 oModem ,存入 FModem & FDataPackage 中, 以後 TModemInfo 物件只要對 FModem & FDataPackage 做動作, 就如同直接對主程式中的元件做動作一般,可是 FDataPackage[iPort].StopString := #13; 這行就會產生錯誤。 還請各位賜教,謝謝您。 |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
|
davidsun
初階會員 發表:57 回覆:71 積分:25 註冊:2002-04-14 發送簡訊給我 |
引言: procedure TMainFmt.FormShow(Sender: TObject); var i: Integer; C: TComponent; FModem:TComPort; FDataPackage:TComDataPacket; begin Application.ProcessMessages; WriteLog('開始初始化數據機', True); WriteLog(Format('找到 %s 台數據機', [IntToStr(oModem.FindInstalledModem)]), True); for i := 0 to oModem.ModemCount - 1 do begin FModem:= TComPort.Create; FDataPackage:= TComDataPacket.Create; oModem.SetCOMPort(i, FModem, FDataPackage); end; end; 發表人 - cmf 於 2003/01/27 14:31:11謝謝您的指教,我發現我程式中有一個錯誤,就是在 oModem.SetCOMPort(i, TComPort(MainFmt.FindComponent('COMPort' + IntToStr(i))), TComDataPacket(MainFmt.FindComponent('DataPackage' + IntToStr(i)))); 其中第二/三個 i必須改成 i+1 因為我的元件名稱是 XXX1 XXX2 .... etc ,而 0 是從 0 開始。 原本我想是不是我的 TModemInfo 中的 FModem[iPort] ,必須 先 Create. 但是我想想不不太對,如果 FModem 也 Create了,哪主程式也有 COMPort 元件,那不就是重複了嗎,如果我再將 FModem[iPort] 只到 MainFmt.COMPort 的位置,那就會有 Memory leak 問題, FModem[iPort] := MainFmt.COMPort FModem[iPort].assign(MainFmt.COMPort) 兩者是極大的不同,一種是將FModem[iPort]只到MainFmt.COMPort 另一種就是複製了。 只是用第一種也要小心,如果 MainFmt.COMPort.Free 了,那在對 FModem[iPort] 存取就會有錯誤。 也上為個人淺見,謝謝 cmf 網友的指教。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |