Delphi容器類之---TList、TStringList、TObjectList,以及一個例程的程式碼分析
看了這裡標題,大家可能以為我會談TListBox控制元件,那就錯了。我要談的是Delphi提供給我們的具有列表性質的類:TStringList、TList和TObjectList。TStringList用來存放字串,TList存放指標,而TObjectList則存放物件(Object)
在我們使用Delphi的過程中,有很多資料的儲存是要靠 陣列解決的。雖然Delphi現在已經支援了可變陣列,不過總有那麼點缺陷:我們不能在刪除一個項之後,使後邊的專案自動前靠。因此,說說Delphi現成的List還是很有價值的。
TStringList
TStringList原始碼在 classes.pas裡面。
Text屬性和Strings屬性
在TStringList裡面,那些String被一行一行地儲存存。TStringList.Text返回全部的String。如果第一、二、三行分別是/'aa/'、/'bb/'、/'cc/'的話,那麼Text返回的是“/'aa/'+#13#10+/'bb/'+#13#10+/'cc/'+#13#10” (不包括雙引號 )。所有的String都被TStringList用回車符和換行符(#13#10)連線起來。如果一次向Text賦值的話,Text就會被自動地分割成儲存在TStringList裡。這裡充分地體現出TStringList的一個很實用的價值:它能讓我們逐行處理String。假如我們要操作第4行,只需要操作TStringList[3]。相信大家會問,TStringList明明是一個類,為什麼能當陣列那樣子用呢?其實,我們在寫TStringList[3]的時候,就是在寫TStringList.Strings[3]。Strings是TStringList的一個預設屬性。陣列性的預設屬性就是這樣子使用的。如果大家在編寫類的時候要使用到這麼一個功能的話,刻意參考如方法
1 2 |
property AProperty[I: Integer ]
read *** write ***;
default;
|
Strings是一個可讀寫的屬性。這也就是說,大家並不僅可以獲取第N行的內容,也可以改變第N行的內容。因此我們需要知道TStringList裡String的總數。TStringList的屬性Count則可以滿足我們的需求。
上面已經說過,Text是返回所有字串的屬性。向Text賦值時,TStringList能夠自動地把Texxt分成一行一行的,然後儲存在TStringList裡(當然,TStringList裡面並不完全時這麼儲存的,詳細的過程可以參見TStringList和TStrings的程式碼)。這樣,Strings返回的字串就是沒有回車和換行的。但是,如果我們向Strings賦值的字串有回車和換行,那麼會出現什麼情況呢?此時,Strings就會把哪個字串斷成幾行,插入到原來的位置上。如果TStringListt只有這麼些功能的話,那我就不必專門拿出來講了——我是說,TStringList能讓我們任意地插入或刪除某行,這就要用到TStringList提供的方法
TStringList裡的每一個字元都有自己的位置標號(從0開始)。
Add和Append方法
1 2 |
function Add( const S: String ): Integer ;
procedure Append( const S: String );
|
Add方法向TStringList的尾行新增一行String(在這裡和下面我們都假設輸入的字串沒有回車和換行,否則Strings將被分割)。引數S代表的是要插入的字串的內容。Add的返回值代表了新的字串在TStringList的位置——也就是最後一行的位置,即新的Count減去一。
Append方法和Add唯一不同的地方就是沒有返回值。
Insert方法
1 |
procedure Insert(Index: Integer ; const S: String );
|
Insert方法向TStringList插入一行字串。在Insert裡,我們可以自由地選擇字串插入的位置。引數S代表要插入的字串的內容,Index代表要插入的位置。
Delete方法
1 |
procedure Delete(Index: Integer );
|
Delete方法刪除某行字串,我們同樣可以自由地選擇刪除任意一行字串。引數Index代表要刪除的那一行字串的位置。
0是第一個資料。
IndexOf方法
1 |
function IndexOf( const S: String ): Integer ;
|
IndexOf查詢某一字串在TStringList裡的位置。引數S代表要查詢的字串。如果TStringList裡面不存在S的話,則返回-1。
Move和Exchange方法
1 2 |
procedure Move(CurIndex,
NewInddex: Integer
|