第六章-文件管理(二)(5)2007-05-076.4.3 文件控件的联系在本例中我们使用了一组新的控件:TabSet、DirectoryOutline、FileListBox,用于显示和选择驱动器、目录和文件。与(6.3)中所用方法相比,使用这一组控件需要少量的代码支持。TabSet与DirectoryOutline的联系在TabSet的Click事件处理过程中建立:With DriveTabSet doDirectoryOutline.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);varDrive, AddedIndex: Integer;DriveLetter: Char;beginfor Drive := 0 to 25 dobeginDriveLetter := Chr(Drive + ord("a"));case GetDrivetype(Drive) ofDRIVE_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) thenDriveTabSet.TAbIndex := AddedIndex;end;end;6.4.4.3 画出自画项目 当把一个控件的风格设置为自画时,Windows不再负责往屏幕上画出控件的项目,而是为每个可见项目产生自画事件。应用程序可以通过处理自画事件画出控件的项目。 1.确定自画项目的大小 对于TabSet而言,这在OnMeasureTab事件处理过程中完成。我们需要把DriveTabSet每个标签的宽度增大到足以同时放下文本和位图。 procedure TFMForm.DriveTabSetMeasureTab(Sender: TObject; Index: Integer;var TabWidth: Integer);varBitmapWidth: Integer;beginBitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;Inc(TabWidth, 2 + BitmapWidth);end;由于TStrings的Objects属性中存放的对象都是TObject类型,并没有Width属性,因而需要再把它转化为TBitmap类型的对象: BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;