6.4.3 文件控件的聯系
在本例中我們使用了一組新的控件:TabSet、DirectoryOutline、FileListBox,用於顯示和選擇驅動器、目錄和文件。與(6.3)中所用方法相比,使用這一組控件需要少量的代碼支持。
TabSet與DirectoryOutline的聯系在TabSet的Click事件處理過程中建立:
With DriveTabSet do
DirectoryOutline.Drive := Tabs[TabIndex][1];
DirectoryOutline與FileListBox的聯系在DirectoryOutline的Change事件處理過程中建立:
FileList.Directory := DirectoryOutline.Directory;
FileList.Update;
6.4.4 DriveTabSet的自畫風格顯示
Dephi為一些控件提供了自畫風格的顯示,如ListBox、ComboBox、TabSet等。 在缺省情況下,這些控件自動顯示文本。而在自畫風格下,擁有控件的窗體在運行時間內自己畫出控件的每一項目。
自畫風格顯示通常的應用是為項目除文本外再添加圖形顯示。能以自畫風格顯示的控件有一個共同特點:都擁有一個TStrings類型的項目鏈。由於TStrings類的特點(參第三章),它們都可以加入一個和對應文本相聯系的對象。 而這正是自畫風格顯示的關鍵。
通常情況下產生一個自畫風格需要三個步驟:
1.設置自畫風格;
2.向字符串鏈表添加圖形對象;
3.畫出自畫項目。
6.4.4.1 設置自畫風格
控件屬性Style 用於設置自畫風格。對於DriveTabSet,我們把Style 屬性設置為tsOwnerDraw。
對於ListBox、ComboBox等控件的設置與TabSet略有差異,讀者可參閱聯機幫助文檔。
6.4.4.2 向字符串鏈表添加圖形對象
1.在應用程序中添加圖片部件
在本程序中我們設置了三個圖片部件NetWork、Floppy、Fixed,並分別與三個位圖文件NetWork.bmp、Floppy.bmp、Fixed.bmp相關聯。
2.把圖片添加到字符串鏈表中
根據字符串鏈表的性質,我們可以把對象與已存在的字符串建立聯系,也可以同時添加字符串和對象。這裡我們采用後一種方法。
在子窗口的OnCreate事件處理過程中,我們利用一個循環依次檢測從a到z的驅動器是否存在以及驅動器的類型。這利用了Windwos API函數GetDrivetype, 如果驅動器不存在則返回0,否則返回驅動器的類型(DRIVE_REMOVABLE、DRIVE_FIXED、DRIVE_REMOTE)。根據驅動器類型我們可以判斷與文本(驅動器名)同時添加到Tabs中的不同圖形對象。在添加過程中,DriveTabSet的TabIndex被設置為當前驅動器。
程序清單如下:
procedure TFMForm.FormCreate(Sender: TObject);
var
Drive, AddedIndex: Integer;
DriveLetter: Char;
begin
for Drive := 0 to 25 do
begin
DriveLetter := Chr(Drive + ord('a'));
case GetDrivetype(Drive) of
DRIVE_REMOVABLE:
AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Floppy.Picture.Graphic);
DRIVE_FIXED:
AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Fixed.Picture.Graphic);
DRIVE_REMOTE:
AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Network.Picture.Graphic);
end;
if UpCase(DriveLetter) = UpCase(FileList.Drive) then
DriveTabSet.TAbIndex := AddedIndex;
end;
end;
6.4.4.3 畫出自畫項目
當把一個控件的風格設置為自畫時,Windows不再負責往屏幕上畫出控件的項目,而是為每個可見項目產生自畫事件。應用程序可以通過處理自畫事件畫出控件的項目。
1.確定自畫項目的大小
對於TabSet而言,這在OnMeasureTab事件處理過程中完成。我們需要把DriveTabSet每個標簽的寬度增大到足以同時放下文本和位圖。
procedure TFMForm.DriveTabSetMeasureTab(Sender: TObject; Index: Integer;
var TabWidth: Integer);
var
BitmapWidth: Integer;
begin
BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;
Inc(TabWidth, 2 + BitmapWidth);
end;
由於TStrings的Objects屬性中存放的對象都是TObject類型,並沒有Width屬性,因而需要再把它轉化為TBitmap類型的對象:
BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;