📄 017.htm
字号:
face="宋体" lang="ZH-CN">三项。</font>File<font face="宋体" lang="ZH-CN">菜单项在子窗口生成时被子窗口同名菜单项所取代。设置</font>Windows<font
face="宋体" lang="ZH-CN">、</font>Help<font face="宋体" lang="ZH-CN">的</font>GroupIndex
= 9<font face="宋体" lang="ZH-CN">,可以使子窗口生成时这两个菜单项仍存在。</p>
<p> 子窗口界面包括主菜单、目录树</font>(DirectoryOutline)<font
face="宋体" lang="ZH-CN">、文件列表框、</font> <font face="宋体" lang="ZH-CN">用于显示驱动器的标签集</font>(TabSet)<font
face="宋体" lang="ZH-CN">以及三个用于显示驱动器类型的</font>TImage<font
face="宋体" lang="ZH-CN">部件。 </p>
<p> 表</font>6.9 <font face="宋体" lang="ZH-CN">子窗口界面设计</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>部件 属性 功能</p>
<p>───────────────────────────────────────</font></p>
<p>FMForm ActiveControl=DirectoryOutline <font face="宋体" lang="ZH-CN">子窗口</p>
</font><p>Position=poDefault</p>
<p>Style=fsMDIChild</p>
<p>MainMenu1 <font face="宋体" lang="ZH-CN">主菜单</font></p>
<p>DriveTabSet Align=alTop <font face="宋体" lang="ZH-CN">显示驱动器</p>
</font><p>style=tsOwnerDraw</p>
<p>DirectoryOutline Align=alLeft <font face="宋体" lang="ZH-CN">显示当前驱动器的目录树</p>
</font><p>options=[ooDrawTreeRoot,</p>
<p>ooDrawFocusRect,ooStretchBitmaps]</p>
<p>FileList Align=alClient <font face="宋体" lang="ZH-CN">显示当前目录中的文件</p>
</font><p>FileType=[ftReadOnly,</p>
<p>ftHidden,ftSystem,ftArchive,ftNormal]</p>
<p>ShowGlyphs=True</p>
<p>Network(Image) Picture(Network.bmp) <font face="宋体" lang="ZH-CN">标志网络驱动器</p>
</font><p>Vsible=False</p>
<p>Floppy(Image) Picture(Floppy.bmp) <font face="宋体" lang="ZH-CN">标志软驱</p>
</font><p>Visible=False</p>
<p>Fixed(Image) Picture(Fixed.bmp) <font face="宋体" lang="ZH-CN">标志硬驱</p>
</font><p>Visible=False</p>
<font face="宋体" lang="ZH-CN"><p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</font></p>
<p> </p>
<font face="宋体" lang="ZH-CN"><p>子窗口主菜单包括</font>File<font face="宋体"
lang="ZH-CN">、</font>Function<font face="宋体" lang="ZH-CN">、</font>Directory<font
face="宋体" lang="ZH-CN">三个菜单项,</font> <font face="宋体" lang="ZH-CN">分别用于完成文件的基本管理功能、其它管理功能和目录管理功能。</p>
<p> 由于对话框界面设计很简单,这里不再进行赘述。</font> <font
face="宋体" lang="ZH-CN">读者可直接参考后面将给出的对话框界面图</font>(<font
face="宋体" lang="ZH-CN">图</font>6.8---6.13)<font face="宋体" lang="ZH-CN">进行设计。</p>
<p> </font></p>
<p>6.4.2 <font face="宋体" lang="ZH-CN">子窗口的创建、布置和关闭</p>
<p> </p>
<p> 子窗口的创建、布置由父窗口的</font>Windows<font face="宋体"
lang="ZH-CN">菜单控制,其菜单项如下:</p>
<p> ●</font> New Windows : <font face="宋体" lang="ZH-CN">创建新的子窗口</font></p>
<p><font face="宋体" lang="ZH-CN">●</font> Tile : <font face="宋体" lang="ZH-CN">平铺</p>
<p> ●</font> Cascade : <font face="宋体" lang="ZH-CN">层叠</p>
<p> ●</font> ArrangeIcon : <font face="宋体" lang="ZH-CN">排列图标</p>
<p> </font> <font face="宋体" lang="ZH-CN">●</font> Minimized All : <font
face="宋体" lang="ZH-CN">极小化所有子窗口</p>
<p> </p>
<p> 子窗口的创建只需要简单调用窗体的</font>Create<font face="宋体"
lang="ZH-CN">方法:</p>
<p> </p>
<p> </font>FileMan := TFMForm.Create(Application);</p>
<p> </p>
<p><font face="宋体" lang="ZH-CN">子窗口的标准排列方式直接调用</font>MDI<font
face="宋体" lang="ZH-CN">窗口的标准方法</font>Tile<font face="宋体"
lang="ZH-CN">、</font>Cascade<font face="宋体" lang="ZH-CN">和</font>ArrangeIcons<font
face="宋体" lang="ZH-CN">。</p>
<p> 极小化所有子窗口的实现利用</font>MDI<font face="宋体" lang="ZH-CN">窗口的两个属性:</font>MDIChildCount<font
face="宋体" lang="ZH-CN">和</font>MDIChildren<font face="宋体" lang="ZH-CN">:</p>
<p> </p>
<p> </font>for i := 0 to MDICount - 1 do</p>
<p>MDIChildren[i].Windowstate := wsMinimized;</p>
<p> </p>
<p> </p>
<font face="宋体" lang="ZH-CN"><p> 子窗口关闭时释放内存空间,为此在子窗口</font>TFMForm<font
face="宋体" lang="ZH-CN">的</font>OnClose<font face="宋体" lang="ZH-CN">事件中令</p>
<p> </p>
</font><p>Action := OnFree<font face="宋体" lang="ZH-CN">;</p>
<p> </p>
<p> 为了保持和</font>Windows<font face="宋体" lang="ZH-CN">的</font>File
Manager<font face="宋体" lang="ZH-CN">的一致性,我们也禁止关闭最后一个子窗口,这需要在子窗口的</font>OnCloseQuery<font
face="宋体" lang="ZH-CN">事件处理过程中实现:</p>
<p> </font></p>
<p>If FileManager.MDIChildCount <= 1 then</p>
<p>CanClose := False;</p>
<p> </p>
<p>CanClose<font face="宋体" lang="ZH-CN">是</font>OnCloseQuery<font face="宋体"
lang="ZH-CN">事件过程返回的一个参数,用于判定窗口是否可以关闭。</p>
<p> 由于这一过程归子窗口所有,因而</font>MDIChildCount<font
face="宋体" lang="ZH-CN">前必须加上其对象名</font>FileManager<font
face="宋体" lang="ZH-CN">。</p>
<p> 但不幸的是:这样一来我们的程序无法终止了!原来</font>MDI<font
face="宋体" lang="ZH-CN">窗口关闭前首先关闭其所有的子窗口。如果子窗口不能关闭,</font>MDI<font
face="宋体" lang="ZH-CN">窗口也不能关闭。</font></p>
<p><font face="宋体" lang="ZH-CN">为此我们需要判断发出关闭消息的是子窗口的系统菜单还是菜单的</font>Exit<font
face="宋体" lang="ZH-CN">项。</p>
<p> 定义一个全局变量</p>
<p> </p>
<p> </font>var</p>
<p>ExitClick: Boolean;</p>
<p> </p>
<p><font face="宋体" lang="ZH-CN">在子窗口的</font>Exit1Click<font face="宋体"
lang="ZH-CN">事件处理过程中:</p>
<p> </font></p>
<p>ExitClick := True;</p>
<p>FileManager.Exit1Click(Sender);</p>
<p> </p>
<p> </p>
<font face="宋体" lang="ZH-CN"><p> 子窗口关闭前可以利用这一全局变量检测是否应关闭:</p>
<p> </p>
<p> </font>If (FileManager.MDIChildCount <= 1) and (Not ExitClick) then</p>
<p>CanClose := False;</p>
<p> </p>
<p>6.4.3 <font face="宋体" lang="ZH-CN">文件控件的联系</p>
<p> </p>
<p> 在本例中我们使用了一组新的控件:</font>TabSet<font face="宋体"
lang="ZH-CN">、</font>DirectoryOutline<font face="宋体" lang="ZH-CN">、</font>FileListBox<font
face="宋体" lang="ZH-CN">,用于显示和选择驱动器、目录和文件。与</font>(6.3)<font
face="宋体" lang="ZH-CN">中所用方法相比,使用这一组控件需要少量的代码支持。</p>
<p> </font>TabSet<font face="宋体" lang="ZH-CN">与</font>DirectoryOutline<font
face="宋体" lang="ZH-CN">的联系在</font>TabSet<font face="宋体" lang="ZH-CN">的</font>Click<font
face="宋体" lang="ZH-CN">事件处理过程中建立:</p>
<p> </p>
<p> </font>With DriveTabSet do</p>
<p>DirectoryOutline.Drive := Tabs[TabIndex][1];</p>
<p> </p>
<p>DirectoryOutline<font face="宋体" lang="ZH-CN">与</font>FileListBox<font
face="宋体" lang="ZH-CN">的联系在</font>DirectoryOutline<font face="宋体"
lang="ZH-CN">的</font>Change<font face="宋体" lang="ZH-CN">事件处理过程中建立:</p>
<p> </font></p>
<p>FileList.Directory := DirectoryOutline.Directory;</p>
<p>FileList.Update;</p>
<p> </p>
<p>6.4.4 DriveTabSet<font face="宋体" lang="ZH-CN">的自画风格显示 </p>
<p> </font>Dephi<font face="宋体" lang="ZH-CN">为一些控件提供了自画风格的显示,如</font>ListBox<font
face="宋体" lang="ZH-CN">、</font>ComboBox<font face="宋体" lang="ZH-CN">、</font>TabSet<font
face="宋体" lang="ZH-CN">等。</font> <font face="宋体" lang="ZH-CN">在缺省情况下,这些控件自动显示文本。而在自画风格下,拥有控件的窗体在运行时间内自己画出控件的每一项目。</font></p>
<p><font face="宋体" lang="ZH-CN">自画风格显示通常的应用是为项目除文本外再添加图形显示。能以自画风格显示的控件有一个共同特点:都拥有一个</font>TStrings<font
face="宋体" lang="ZH-CN">类型的项目链。由于</font>TStrings<font face="宋体"
lang="ZH-CN">类的特点</font>(<font face="宋体" lang="ZH-CN">参第三章</font>)<font
face="宋体" lang="ZH-CN">,它们都可以加入一个和对应文本相联系的对象。</font>
<font face="宋体" lang="ZH-CN">而这正是自画风格显示的关键。</p>
<p> 通常情况下产生一个自画风格需要三个步骤:</p>
<p> </font>1.<font face="宋体" lang="ZH-CN">设置自画风格;</p>
<p> </font>2.<font face="宋体" lang="ZH-CN">向字符串链表添加图形对象;</p>
<p> </font>3.<font face="宋体" lang="ZH-CN">画出自画项目。 </p>
</font><p>6.4.4.1 <font face="宋体" lang="ZH-CN">设置自画风格 </p>
<p> 控件属性</font>Style <font face="宋体" lang="ZH-CN">用于设置自画风格。对于</font>DriveTabSet<font
face="宋体" lang="ZH-CN">,我们把</font>Style <font face="宋体" lang="ZH-CN">属性设置为</font>tsOwnerDraw<font
face="宋体" lang="ZH-CN">。</p>
<p> 对于</font>ListBox<font face="宋体" lang="ZH-CN">、</font>ComboBox<font
face="宋体" lang="ZH-CN">等控件的设置与</font>TabSet<font face="宋体"
lang="ZH-CN">略有差异,读者可参阅联机帮助文档。 </p>
</font><p>6.4.4.2 <font face="宋体" lang="ZH-CN">向字符串链表添加图形对象 </p>
<p> </font>1.<font face="宋体" lang="ZH-CN">在应用程序中添加图片部件</p>
<p> 在本程序中我们设置了三个图片部件</font>NetWork<font face="宋体"
lang="ZH-CN">、</font>Floppy<font face="宋体" lang="ZH-CN">、</font>Fixed<font
face="宋体" lang="ZH-CN">,并分别与三个位图文件</font>NetWork.bmp<font
face="宋体" lang="ZH-CN">、</font>Floppy.bmp<font face="宋体" lang="ZH-CN">、</font>Fixed.bmp<font
face="宋体" lang="ZH-CN">相关联。</p>
<p> </font>2.<font face="宋体" lang="ZH-CN">把图片添加到字符串链表中</p>
<p> 根据字符串链表的性质,我们可以把对象与已存在的字符串建立联系,也可以同时添加字符串和对象。这里我们采用后一种方法。</p>
<p> 在子窗口的</font>OnCreate<font face="宋体" lang="ZH-CN">事件处理过程中,我们利用一个循环依次检测从</font>a<font
face="宋体" lang="ZH-CN">到</font>z<font face="宋体" lang="ZH-CN">的驱动器是否存在以及驱动器的类型。这利用了</font>Windwos
API<font face="宋体" lang="ZH-CN">函数</font>GetDrivetype, <font face="宋体"
lang="ZH-CN">如果驱动器不存在则返回</font>0<font face="宋体" lang="ZH-CN">,否则返回驱动器的类型</font>(DRIVE_REMOVABLE<font
face="宋体" lang="ZH-CN">、</font>DRIVE_FIXED<font face="宋体" lang="ZH-CN">、</font>DRIVE_REMOTE)<font
face="宋体" lang="ZH-CN">。根据驱动器类型我们可以判断与文本</font>(<font
face="宋体" lang="ZH-CN">驱动器名</font>)<font face="宋体" lang="ZH-CN">同时添加到</font>Tabs<font
face="宋体" lang="ZH-CN">中的不同图形对象。在添加过程中,</font>DriveTabSet<font
face="宋体" lang="ZH-CN">的</font>TabIndex<font face="宋体" lang="ZH-CN">被设置为当前驱动器。</font></p>
<p><font face="宋体" lang="ZH-CN">程序清单如下: </p>
</font><p>procedure TFMForm.FormCreate(Sender: TObject);</p>
<p>var</p>
<p>Drive, AddedIndex: Integer;</p>
<p>DriveLetter: Char;</p>
<p>begin</p>
<p>for Drive := 0 to 25 do</p>
<p>begin</p>
<p>DriveLetter := Chr(Drive + ord('a'));</p>
<p>case GetDrivetype(Drive) of</p>
<p>DRIVE_REMOVABLE:</p>
<p>AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Floppy.Picture.Graphic);</p>
<p>DRIVE_FIXED:</p>
<p>AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Fixed.Picture.Graphic);</p>
<p>DRIVE_REMOTE:</p>
<p>AddedIndex := DriveTabSet.Tabs.AddObject(DriveLetter, Network.Picture.Graphic);</p>
<p>end;</p>
<p>if UpCase(DriveLetter) = UpCase(FileList.Drive) then</p>
<p>DriveTabSet.TAbIndex := AddedIndex;</p>
<p>end;</p>
<p>end;</p>
<p>6.4.4.3 <font face="宋体" lang="ZH-CN">画出自画项目 </p>
<p> 当把一个控件的风格设置为自画时,</font>Windows<font face="宋体"
lang="ZH-CN">不再负责往屏幕上画出控件的项目,而是为每个可见项目产生自画事件。应用程序可以通过处理自画事件画出控件的项目。 </p>
</font><p>1.<font face="宋体" lang="ZH-CN">确定自画项目的大小 </p>
<p> 对于</font>TabSet<font face="宋体" lang="ZH-CN">而言,这在</font>OnMeasureTab<font
face="宋体" lang="ZH-CN">事件处理过程中完成。我们需要把</font>DriveTabSet<font
face="宋体" lang="ZH-CN">每个标签的宽度增大到足以同时放下文本和位图。 </p>
</font><p>procedure TFMForm.DriveTabSetMeasureTab(Sender: TObject; Index: Integer;</p>
<p>var TabWidth: Integer);</p>
<p>var</p>
<p>BitmapWidth: Integer;</p>
<p>begin</p>
<p>BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;</p>
<p>Inc(TabWidth, 2 + BitmapWidth);</p>
<p>end;</p>
<font face="宋体" lang="ZH-CN"><p> 由于</font>TStrings<font face="宋体"
lang="ZH-CN">的</font>Objects<font face="宋体" lang="ZH-CN">属性中存放的对象都是</font>TObject<font
face="宋体" lang="ZH-CN">类型,并没有</font>Width<font face="宋体" lang="ZH-CN">属性,因而需要再把它转化为</font>TBitmap<font
face="宋体" lang="ZH-CN">类型的对象: </p>
<p> </font> BitmapWidth := TBitmap(DriveTabSet.Tabs.Objects[Index]).Width;</p>
<p align="center"><font face="宋体" lang="ZH-CN"> </font></p>
<hr color="#EE9B73" size="1" width="94%">
</TD>
<TD CLASS="tt3" VALIGN="bottom" width="8%" bgcolor="#e0e0e0"><strong><A HREF="018.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR>
<A HREF="016.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR>
<A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR>
<A HREF="../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首页</font></A><BR>
</strong>
</TD>
</TR>
</table>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -