3.1.4 往字符串列表中加入對象
字符串列表除了能在Strings屬性中貯存字符串外,還可以在Objects屬性中貯存對象。與Stings一樣,Objects也是可以索引的,它是對象的索引。
在應用程序使用列表中的字符串與列表中是否有對象沒有多大關系。除非程序特地訪問對象,否則Objects中的內容不變,Delphi只是保存了這些信息,應用程序在必要時對其進行操作。
有些字符串列表忽略加入的對象。如TMemo部件中代表行的列表對加入其中的對象不保存。還有一些字符串列表,把對象與字符串聯系起來,如TNotebook部件的Pages屬性,它同時保存著頁的名字和代表頁的對象。如果應用程序往Pages中加入或刪除字符串,Delphi自動的加入或刪除與之相應的對象。
雖然程序可分配任何類型的對象到列表中,但最常用的是在自畫式控制中把位圖與字符串聯系起來,注意位圖與字符串成對使用。
Delphi在釋放對象的內存空間時並不破壞與之相應的字符串。
3.1.4.1 操作字符串列表中的對象
對於字符串的每一種操作方法,列表中的對象均有相應的方法。例如,應用程序可利用對象的索引來訪問對象。與字符串不同的是,不能省略Objects,因為Strings才是列表的缺省屬性。
表3.1中總結了字符串對字符串和對象操作的方法。
表3.1 TStrings的字符串屬性和對象操作屬性的方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
操 作 字 符 串 對 象
───────────────────────────────
訪 問 Strings屬性 Objects屬性
加入項目 Add 方法 AddObjects方法
插入項目 Insert方法 InsertObjects方法
項目定位 Indexof方法 IndexofObject方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Delete,Clear,More操作整個項目,即刪除字符串時把相應的對象也刪除了。但LoadFromFile,SaveToFile方法只對字符串進行操作。
3.1.4.2 加入對象
如果把對象與已存在的字符串聯系起來,Delphi將分配給該對象同樣的索引號。例如,一個叫Fruits的列表中有字符串('apple'),程序可將名為AppleBitmap的位圖與apple字符相聯系。
With Fruits do Objects[Indexof('apple')]:=AppleBitmap;
另一種方法是調用列表的AddObject方法,AddObject有兩個參數:字符串和對象,如下:
Fruits AddObject('Apple',AppleBitmap);
3.2 字符串列表應用
Delphi應用程序經常要用到字符串列表,我們編寫的strlist. dpr是應用字符串列表的簡單程序。程序運行狀態如圖3.2所示。列表框列出了屏幕支持的各種字體名稱,並且以名稱所代表的字體顯示在列表中;Tabs的標簽不只以字符串來表示,而且附有位圖。這就是所謂的自畫式控制。下面介紹字符串列表在自畫式控制中的應用。
列表框、組合框、Tabset部件中有一個叫“自畫(Ownerdraw)”的風格,它能替代Windows的文本輸出,部件的自畫式控制在運行狀態對每個項目進行重新繪制。最常用的是用圖像代替文本輸出。
自畫式控制有一個共同特點:它們都包含有項目列表,缺省情況下這些列表就是字符串列表,Windows把它們當成文本顯示。Delphi可以把字符串列表與某一對象相聯系,這就使得應用程序能用對象來繪制項目。
通常,創建自畫式控制有以下三個步驟:
1. 設置自畫風格;
2. 把圖像對象加入字符串列表中;
3. 繪制自畫項目。
3.2.1 設置自畫風格
每個能進行自畫式控制的部件都有一個叫Style的屬性,Style決定部件是以缺省方式還是以自畫方式繪制項目。
對於列表框和組合框,也有自畫式風格選項,表3.2列出了Style的取值及含義。
表3.2 Style的取值及含義
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Style 含義舉例
─────────────────────────────────
Fixed 每個項目有相同的高度 1bOwnerDrawFixed
高度由ItenHeight屬性決定 csOwnerDrawFixed
Varible 每個項目有不同的高度 1bOwnweDrawVarible
由運行數據決定 csOwnerDrawVarible
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
tab-set與字符串網格的Style屬性通常是Varible.
在Strlist程序中,列表框與tab-set取值如表3.3:
表3.3 列表框與tab-set的取值
━━━━━━━━━━━━━━━━━━━━━━━━━━
名稱 style
──────────────────────────
ListBox1 lbOwnerDrawVariable
Tabset1 tsOwnerDrawVariable
━━━━━━━━━━━━━━━━━━━━━━━━━━━
3.2.2 把圖像加入字符串列表
上節已介紹如何把對象加入字符串列表,例程把位圖對象加入Tabset1的Tabs中:
procedure TForm1.FormCreate(Sender: TObject);
var
Bitmap: TBitMap;
begin
Listbox1.Items := Screen.Fonts;
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('PHONE.BMP');
Tabset1.Tabs.AddObject('phone',Bitmap);
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('PRINTER.BMP');
Tabset1.Tabs.AddObject('printer ',Bitmap);
end;