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

關於物件,指標的運用...

缺席
davidsun
初階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-01-24 17:04:51 IP:61.222.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-01-27 14:04:22 IP:61.222.xxx.xxx 未訂閱
在主程式中, 我有 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-01-27 15:08:48 IP:210.58.xxx.xxx 未訂閱
插個花: 冒昧問一下, 請問錯誤訊息是什麼? 我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
davidsun
初階會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-01-27 15:10:40 IP:61.222.xxx.xxx 未訂閱
引言: 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 網友的指教。
系統時間:2024-03-29 20:09:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!