全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1674
推到 Plurk!
推到 Facebook!

如何定義這個Tobject物件?

答題得分者是:change.jian
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-27 15:15:38 IP:222.248.xxx.xxx 未訂閱
Socket服務端程式中定義了以下一個Record記錄:
type
  client_record=record
     CHandle: integer;          //客戶端套接字控制碼
     CSocket:TCustomWinSocket;    //客戶端套接字
     CName:string;                //客戶端電腦名稱
     CAddress:string;             //客戶端電腦IP位址
     CUsed: boolean;               //客戶端聯機標誌
  end;
用來代表一個連接到服務端的Socket客戶端,並存放這個客戶端相關的資訊。 我在介面上還用了一個TCheckListBox元件來顯示已經連接的眾客戶端,點擊CheckListBox中的項目後就顯示Client_Record中保存的詳細內容,但實際開發中發現在與上面的記錄類型關聯時比較麻煩。 於是我想到用CheckListBox1.Items.AddObject(Const S: String, AObject: TObject)方法來關聯一個Tobject物件, 用這個Tobject來代表客戶端,並保存相關資訊。 但問題就是不知如何來定義這個Tobject物件?
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-27 15:33:19 IP:61.218.xxx.xxx 未訂閱
ha h@visli:    
  TClientRecObj = class(Tobject)
  private
    FCUsed: boolean;
    FCHandle: Integer;
    FCAddress: string;
    FCName: string;
    FCSocket: TCustomWinSocket;
  public
    constructor Create;
    property CHandle:Integer read FCHandle write FCHandle;             //客戶端套接字控制碼
    property CSocket:TCustomWinSocket read FCSocket write FCSocket;    //客戶端套接字
    property CName:string read FCName write FCName;                    //客戶端電腦名稱
    property CAddress:string read FCAddress write FCAddress;           //客戶端電腦IP位址
    property CUsed:boolean read FCUsed write FCUsed;                   //客戶端聯機標誌
  end;    implementation    { TClientRecObj }    constructor TClientRecObj.Create;
begin
  FCSocket:=nil;
end;    ...    使用時,直接create即可
var
  aClient:TClientRecObj
begin
  aClient:=TClientRecObj.Create;
  ....
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-27 15:38:57 IP:202.39.xxx.xxx 未訂閱
試試如下:
type
  TClientRecord = class // 定義成 TObject 型態
     CHandle: integer;          //客戶端套接字控制碼
     CSocket: TCustomWinSocket;    //客戶端套接字
     CName: string;                //客戶端電腦名稱
     CAddress: string;             //客戶端電腦IP位址
     CUsed: boolean;               //客戶端聯機標誌
  end;    // 以下是加入 CheckListBox1 中
var
  cr: TClientRecord;
begin
  cr := TClientRecord.Create; // create 一個 TClirntRecord 類別的物件
  cr.CHandle := ..; // 設定其欄位值
  ...      CheckListBox1.Items.AddObject(cr.CName, cr) // 將 cr 這個 Object 加入 CheckListBox1 中
end;    // 以下是自 CheckListBox1 中取出
var
  cr: TClientRecord;
begin
  cr := TClientRecord(CheckListBox1.Items[0]); // 取得 CheckListBox1 中第 1 個 TClientRecord 這個物件
  ShowMessage(cr.CAddress);
end;
-- hagar.
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-27 16:52:39 IP:222.248.xxx.xxx 未訂閱
多謝change.jian與hagar兩位版主的幫忙,兩位的方法我都試過了,全部通過! 只是hagar的cr := TClientRecord(CheckListBox1.Items[0]);這句應該改為 cr := TClientRecord(CheckListBox1.Items. Objects [0]);    另外,還要請教一下物件釋放的問題(請參考下面的代碼): 當程式運行時,佔用記憶體為2636KB, 點擊Button1生成701個物件後,佔用記憶體為2736KB 當點擊Button2後,釋放了物件,顯示佔用記憶體2688KB。 雖然釋放後記憶體有下降,但還是比程式剛運行時佔用得多一些,請問這是為什麼,難道我沒有釋放完全?    
Type
  //為了簡便起見,物件定義得簡單一點
  TClientRecord = class // 定義成 TObject 型態
    CName: string; //客戶端電腦名稱
    CAddress: string; //客戶端電腦IP位址
    size: int64;
  end;
……
procedure TForm1. Button1Click(Sender: TObject);
var
  cr: TClientRecord;
  i: integer;
begin
  for i := 0 to 700 do
  begin
    cr := TClientRecord.Create;
    cr.CName := 'CName1';
    cr.CAddress := 'CAddress1';
    cr.size := 777434536546;
    CheckListBox1.Items.AddObject(cr.CName, cr);
  end;
  //請問, 這樣的迴圈創建是不是存在問題?因為一直是用cr這同一個變數在創建。
end;    procedure TForm1.CheckListBox1Click(Sender: TObject);
var
  cr: TClientRecord;
  rr: tobject;
begin
  cr := TClientRecord(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
  Edit1.Text := cr.CName   cr.CAddress;
end;    procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to CheckListbox1.Items.Count - 1 do
  begin
    //把CheckListBox1關聯的對象釋放掉
    CheckListBox1.Items.Objects[i].Free;
  end;
  CheckListBox1.Items.Clear;
end;
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-27 17:13:20 IP:61.218.xxx.xxx 未訂閱
我想應該是TCheckListBox.Items.clear沒有把記憶體清乾淨吧
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-27 17:36:46 IP:202.39.xxx.xxx 未訂閱
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to CheckListbox1.Items.Count - 1 do
  begin
    CheckListBox1.Items.Objects[i].Free;
    CheckListBox1.Items.Objects[i] := nil; // 加這一行試試
  end;
  CheckListBox1.Items.Clear;
end;
-- hagar.
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-27 21:55:11 IP:222.248.xxx.xxx 未訂閱
我測試了一下,創建的物件在釋放時已全部正常釋放了,多謝兩位! 只是記憶體佔用還是有點不明白,我反復點擊Button1與Button2(即創建—釋放,再創建再釋放),每次操作程式佔用記憶體都會有一點點上升,重複操作二十來次後,就不會再增長了,基本穩定下來。
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
h@visli
資深會員


發表:103
回覆:429
積分:431
註冊:2004-02-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-30 13:06:04 IP:222.248.xxx.xxx 未訂閱
答題得分就給change.jian吧,因為change.jian的得分遠沒hagar多哦,另外hagar多次解答了我的提問,多謝了!
------
------------------------
博采眾家之長,奉獻綿薄之力
------------------------
系統時間:2024-05-17 18:07:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!