如何定義這個Tobject物件? |
答題得分者是:change.jian
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
試試如下:
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 發送簡訊給我 |
多謝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 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
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 發送簡訊給我 |
|
h@visli
資深會員 發表:103 回覆:429 積分:431 註冊:2004-02-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |