TStringList 訪問物件的特點

2021-04-26 12:05:13 字數 4439 閱讀 9872

分析 tstringlist 訪問物件的特點

在 delphi 中儲存系列物件, 大家常用 tlist 類; 有了 tobjectlist(在 contnrs 單元)以後, 儲存物件就有了更好的選擇, 因為從 tobjectlist 列表中移除的物件同時會得到釋放.

很少有人使用 tstringlist 儲存物件, 殊不知用 tstringlist 儲存物件也有 tlist 和 tobjectlist 所不及的優勢.

我想在繼續**前先重複乙個概念: 物件的 "指標" 和 "首位址":

我們通過物件的指標可以找到物件, 也就是說指標是指向了物件; 物件也不過是一系列資料, "指標" 一般是指向這組資料的 "首位址".

下面**可以獲取 button1 物件的 "指標" 和 "首位址":

procedure tform1.button1click(sender: tobject);

begin

showmessagefmt('指標: %d', [integer(@button1)]);

end;

我們再看下 tlist、tobjectlist 和 tstringlist 新增物件的方法宣告:

tlist       : function add(item: pointer): integer;

tobjectlist : function add(aobject: tobject): integer;

tstringlist : function addobject(const s: string; aobject: tobject): integer;

可以看出, tlist 新增的只是指標; tobjectlist 和 tstringlist 新增的型別是物件.

新增物件時, 是把整個物件的資料都新增進去嗎? 當然不是, 只要記住物件的首位址就可以了(應該也是用類似指標的辦法, 我沒仔細研究), 測試**:

procedure tform1.button1click(sender: tobject);

varlist: tstringlist;

begin

showmessagefmt('指標: %d', [integer(@button1)]);

list := tstringlist.create;

list.addobject('btn', button1);

showmessagefmt('取出: %d', [integer(list.objects[0])]);

list.free;

end;

通過 tstringlist 的 addobject 和 insertobject 方法可以新增物件;

用 objects 屬性取出物件; 用 list 取出字串. 示例:

procedure tform1.button1click(sender: tobject);

varlist: tstringlist;

obj: tobject;

str: string;

begin

list := tstringlist.create;

list.addobject('btn', button1);

obj := list.objects[0];

str := list[0];

showmessage(tbutton(obj).caption);

showmessage(str);

list.free;

end;

新增物件的指標可以嗎? 可以, 但需要轉換成無型別指標, 例:

procedure tform1.button1click(sender: tobject);

varlist: tstringlist;

obj: tobject;

begin

list := tstringlist.create;

list.addobject('btn', pointer(@button1));

list.addobject('btn', pointer(button1));

obj := list.objects[0];

showmessage(tbutton(obj).caption);

list.free;

end;

既然也可以新增指標, 那我們也可以新增不屬於 tobject 的結構等其他指標;

假如不能新增指標, 也將無法新增結構, 因為結構不屬於 tobject. 舉例:

type

pmyrec = ^tmyrec;

tmyrec = record

s: string;

i: integer;

end;

procedure tform1.button1click(sender: tobject);

varlist: tstringlist;

r1,r2: tmyrec;

begin

list := tstringlist.create;

r1.s := 'abc';

r1.i := 123;

list.addobject('rec', pointer(@r1));

//list.addobject('rec', @r1);

r2 := pmyrec(list.objects[0])^;

showmessagefmt('%s,%d', [r2.s, r2.i]);

list.free;

end;

前面說到 tstringlist 還會有點優勢; 首先得承認它的劣勢, 因為它是兩組資料構成的列表, 在資料量特別大的時候效率上會有劣勢; 現在說說它的優勢:

從 tlist 和 tobjectlist 取出的物件型別是未知的(當然作者知道), 所以一般只能儲存單一型別的物件;

因為 tstringlist 有兩個字段, 我們可以用那個 string 欄位來儲存物件型別, 從而讓 tstringlist 可以同時儲存更多型別的物件. 舉例:

unit unit1;

inte***ce

uses

windows, messages, sysutils, variants, classes, graphics, controls, forms,

dialogs, stdctrls;

type

tform1 = class(tform)

button1: tbutton;

procedure button1click(sender: tobject);

end;

varform1: tform1;

implementation

type

pmyrec = ^tmyrec;

tmyrec = record

s: string;

i: integer;

end;

procedure tform1.button1click(sender: tobject);

varlist: tstringlist;

r1,r2: tmyrec;

str: string;

i: integer;

begin

list := tstringlist.create;

r1.s := 'abc';

r1.i := 123;

str := '我是字串';

list.addobject('1', @r1);

list.addobject('2', sender);

list.addobject('3', self);

list.addobject('4', pointer(str));

for i := 0

to list.count - 1

dobegin

case strtointdef(list[i], 0) of

1: begin

r2 := pmyrec(list.objects[i])^;

showmessagefmt('%s,%d', [r2.s, r2.i]);

end;

2: showmessage(tbutton(list.objects[i]).caption);

3: showmessage(tform1(list.objects[i]).text);

4: showmessage(pchar(list.objects[i]));

end;

end;

list.free;

end;

end.

從函式中返回TstringList物件 摘

from 如果乙個函式返回的物件不是我們經常使用的integer,string.而是tstringlist tbutton等object那怎麼辦呢?為什麼會有這個問題,因為函式的result是乙個object,按照object pascal要求,是需要其owner釋放 free 舉例 functio...

TStringList比TStrings好的原因

tstringlist是乙個對tstrings增強的類庫,以前總認為宣告乙個tstrings 物件,然後用tstringlist去create就可以了 但是經過這5天的痛苦之後發現原來tstringlist有他不可缺少的地位,最大的地位就是對object物件的支援,如果你使用delphi,會發現ts...

關於 TStringList 的用法

最近在用delphi開發一些專案的時候,處理一條字串傳遞多個引數的時候,發現了乙個不錯的東西,拿來分享一下。下面的是其的基本用法。tstrings是乙個抽象類,在實際開發中,是除了基本型別外,應用得最多的。常規的用法大家都知道,現在來討論它的一些高階的用法。先把要討論的幾個屬性列出來 1 comma...