分析 tstringlist 訪問物件的特點
在 delphi 中儲存系列物件, 大家常用 tlist 類; 有了 tobjectlist(在 contnrs 單元)以後, 儲存物件就有了更好的選擇, 因為從 tobjectlist 列表中移除的物件同時會得到釋放.
很少有人使用 tstringlist 儲存物件, 殊不知用 tstringlist 儲存物件也有 tlist 和 tobjectlist 所不及的優勢.
我想在繼續**前先重複乙個概念: 物件的 "指標" 和 "首位址":
我們通過物件的指標可以找到物件, 也就是說指標是指向了物件; 物件也不過是一系列資料, "指標" 一般是指向這組資料的 "首位址".
下面**可以獲取 button1 物件的 "指標" 和 "首位址":
procedure tform1.button1click(sender: tobject);我們再看下 tlist、tobjectlist 和 tstringlist 新增物件的方法宣告:begin
showmessagefmt('指標: %d', [integer(@button1)]);
end;
tlist : function add(item: pointer): integer;可以看出, tlist 新增的只是指標; tobjectlist 和 tstringlist 新增的型別是物件.tobjectlist : function add(aobject: tobject): integer;
tstringlist : function addobject(const s: string; aobject: tobject): integer;
新增物件時, 是把整個物件的資料都新增進去嗎? 當然不是, 只要記住物件的首位址就可以了(應該也是用類似指標的辦法, 我沒仔細研究), 測試**:
procedure tform1.button1click(sender: tobject);通過 tstringlist 的 addobject 和 insertobject 方法可以新增物件;varlist: tstringlist;
begin
showmessagefmt('指標: %d', [integer(@button1)]);
list := tstringlist.create;
list.addobject('btn', button1);
showmessagefmt('取出: %d', [integer(list.objects[0])]);
list.free;
end;
用 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);既然也可以新增指標, 那我們也可以新增不屬於 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. 舉例:
type前面說到 tstringlist 還會有點優勢; 首先得承認它的劣勢, 因為它是兩組資料構成的列表, 在資料量特別大的時候效率上會有劣勢; 現在說說它的優勢: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;
從 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...