⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 018.htm

📁 delphi教程
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<p>  正当我一筹莫展时,突然想到:</font>DirectoryOutline<fontface="宋体" lang="ZH-CN">是一个</font>Sample<font face="宋体" lang="ZH-CN">部件,</font>Delphi<font face="宋体" lang="ZH-CN">提供了它的源代码。而当我分析了它的源代码后,我知道应该做什么了,那就是为</font>DirectoryOutline<fontface="宋体" lang="ZH-CN">增添一个</font>Reset<font face="宋体" lang="ZH-CN">方法</font>! </p><p>6.7.3 <font face="宋体" lang="ZH-CN">为部件增添一个方法 </p><p>  严格地说,我们所做的工作属于创建一个新部件。但因为我们有源代码,所以不必从</font>DirectoryOutline<fontface="宋体" lang="ZH-CN">继承而是直接修改它。这样我们可以省去与创建部件有关的许多繁琐工作。对创建新部件感兴趣的读者可阅读本书第三编的有关章节。</p><p>  在</font>Delphi IDE<font face="宋体" lang="ZH-CN">中打开</font>DirectoryOutline<fontface="宋体" lang="ZH-CN">的源文件后:</font></p><p>1.<font face="宋体" lang="ZH-CN">把库单元名改为</font>DirPlus<fontface="宋体" lang="ZH-CN">,类名改为</font>TDirectoryOutlinePlus<font face="宋体"lang="ZH-CN">,表明这是</font>DirectoryOutline<font face="宋体" lang="ZH-CN">的增强版。而后存入另一个目录中;</p><p> </font> 2.<font face="宋体" lang="ZH-CN">添加一个公有方法</font>Reset<fontface="宋体" lang="ZH-CN">。这一方法的作用是重新读取当前驱动器的目录。程序清单如下。 </p></font><p>procedure TDirectoryOutlinePlus.Reset;</p><p>begin</p><p>ChDir(FDrive + ':');</p><p>GetDir(0, FDirectory); </p><p>FDirectory := ForceCase(FDirectory); </p><p>if not (csLoading in ComponentState) then BuildTree; </p><p>end;</p><p><font face="宋体" lang="ZH-CN">  读者也许被这段代码弄糊涂了。由于篇幅所限,而且涉及到许多自定义部件开发的内容,我们也不准备去详细解释它。假如读者想彻底搞懂它,我建议先看一下本书第三编有关自定义部件开发的内容,而后再对照原</font>DirectoryOutline<fontface="宋体" lang="ZH-CN">的源代码进行分析。</font></p><font face="宋体" lang="ZH-CN"><p>  </font>3.<font face="宋体" lang="ZH-CN">编译成一个库文件</font>DirPlus.tpu;</p><p>4.<font face="宋体" lang="ZH-CN">把</font>DirPlus<font face="宋体" lang="ZH-CN">加入部件的</font>Samples<fontface="宋体" lang="ZH-CN">页中。</p><p>  如何添加一个部件见第三编有关章节的介绍。</p><p>  当增强的目录树准备好以后,必须修改我们的子窗口设计,但却不必亲自修改源代码。</p><p>  </font>1.<font face="宋体" lang="ZH-CN">删除子窗口中的</font>TDirectoryOutline<fontface="宋体" lang="ZH-CN">类部件</font>DirectoryOutline<font face="宋体"lang="ZH-CN">。此时</font>FileList<font face="宋体" lang="ZH-CN">占据了整个客户区;</p><p>  </font>2.<font face="宋体" lang="ZH-CN">把</font>FileList<font face="宋体"lang="ZH-CN">的</font>Align<font face="宋体" lang="ZH-CN">属改为</font>None<fontface="宋体" lang="ZH-CN">,并留出左边的空白供放部件用;</p><p>  </font>3.<font face="宋体" lang="ZH-CN">在窗口左部加入</font>TDirectoryOutlinPlus<fontface="宋体" lang="ZH-CN">类的部件</font>DirectoryOutline<font face="宋体"lang="ZH-CN">;</font></p><p>4.<font face="宋体" lang="ZH-CN">把</font>DirectoryOutline<font face="宋体"lang="ZH-CN">的</font>Align<font face="宋体" lang="ZH-CN">属性改为</font>Left<fontface="宋体" lang="ZH-CN">,</font>FileList<font face="宋体" lang="ZH-CN">的</font>Align<fontface="宋体" lang="ZH-CN">属性还原为</font>Client<font face="宋体" lang="ZH-CN">;</font></p><p>5.<font face="宋体" lang="ZH-CN">在</font>DirectoryOutline<font face="宋体"lang="ZH-CN">的事件</font>OnChange<font face="宋体" lang="ZH-CN">列表中选取</font>DirectoryOutlineChange<fontface="宋体" lang="ZH-CN">,即原</font>DirectoryOutline<font face="宋体"lang="ZH-CN">的处理过程。</p><p>  以上工作的最终目标是实现目录创建、删除后屏幕的正确显示。这只需要调用</font>DirectoryOutline<fontface="宋体" lang="ZH-CN">的</font>Reset<font face="宋体" lang="ZH-CN">方法即可。</font></p><p><font face="宋体" lang="ZH-CN">目录删除过程的实现代码如下。 </p></font><p>procedure TFMForm.DeleteDirectory1Click(Sender: TObject);</p><p>var</p><p>path: String;</p><p>k: Integer;</p><p>begin</p><p>{$I-}</p><p>path := DirectoryOutline.Directory;</p><p>DirectoryOutline.Directory := ExtractFilePath(Path);</p><p>if MessageDlg('Delete ' + path + '?', mtConfirmation,[mbYes, mbNo], 0) = idYes then</p><p>RmDir(path);</p><p>if IOResult &lt;&gt; 0 then</p><p>MessageDlg(' Cannot remove directory! The path might not'+</p><p>'exist,non-empty or is the current logged directory.',mtWarning,[mbOk], 0)</p><p>else</p><p>DirectoryOutline.Reset;</p><p>end;</p><p><font face="宋体" lang="ZH-CN">修改后的目录创建过程如下。 </p></font><p>procedure TFMForm.CreateDirectory1Click(Sender: TObject);</p><p>var</p><p>NewDir: TNewDir;</p><p>Dir: String;</p><p>begin</p><p>{$I-}</p><p>NewDir := TNewDir.Create(self);</p><p>with NewDir do</p><p>begin</p><p>CurrentDir.Caption := DirectoryOutline.Directory;</p><p>if (ShowModal &lt;&gt; idCancel) and (DirName.Text &lt;&gt; '') then</p><p>Dir := ExpandFileName(DirName.text);</p><p>end;</p><p>MkDir(Dir);</p><p>if IOResult &lt;&gt; 0 then</p><p>MessageDlg('Cannot Create directory', mtWarning, [mbOk], 0)</p><p>else</p><p>DirectoryOutline.Reset;</p><p>end;</p><font face="宋体" lang="ZH-CN"><p>  当完成了这些工作,把程序重新编译、运行后,可以发现我们所希望实现的功能完全实现了!同时,我们有了一个更好的目录树部件。 </p></font><p>6.4.7.4 <font face="宋体" lang="ZH-CN">改变当前目录 </p><p>  改变当前目录的实现非常简单,只要修改</font>DirectoryOutline<fontface="宋体" lang="ZH-CN">的</font>Directory<font face="宋体" lang="ZH-CN">属性。但需注意的是:当改变后目录所在驱动器也发生变化时应相应修改</font>DriveTabSet<fontface="宋体" lang="ZH-CN">的当前值。由于驱动器名与</font>DriveTabSet<fontface="宋体" lang="ZH-CN">的索引属性</font>TabIndex<font face="宋体" lang="ZH-CN">之间并没有确定的对应关系,因而需要通过一个循环进行查找匹配。</font></p><p>Change Directory<font face="宋体" lang="ZH-CN">的菜单事件处理过程是</font>FileChange<fontface="宋体" lang="ZH-CN">,即与文件的移动、拷贝、更名共用一个事件处理过程。详细情况请读者参看</font>(6.4.5.3)<fontface="宋体" lang="ZH-CN">中的介绍。</font></p><p><font face="宋体" lang="ZH-CN">改变当前目录的实现如下。 </p></font><p>procedure TFMForm.ChangeDirectory(Todir: String);</p><p>var</p><p>i: Integer;</p><p>begin</p><p>{$I-}</p><p>ChDir(ToDir);</p><p>if IOResult &lt;&gt; 0 then</p><p>MessageDlg('Cannot find directory', mtWarning, [mbOk], 0)</p><p>else</p><p>begin</p><p>with DirectoryOutline do</p><p>begin</p><p>Directory := ToDir;</p><p>Refresh;</p><p>if DriveTabSet.Tabs[DriveTabSet.TabIndex][1]&lt;&gt;drive then</p><p>for I := 1 to 25 do</p><p>if DriveTabSet.Tabs[i][1] = drive then</p><p>begin</p><p>DriveTabSet.TabIndex := i;</p><p>Exit;</p><p>end;</p><p>end;</p><p>end;</p><p>end;</p><p>6.4.8 <font face="宋体" lang="ZH-CN">一些问题的处理 </p></font><p>6.4.8.1 <font face="宋体" lang="ZH-CN">子窗口的标题 </p><p>  </font>Windows<font face="宋体" lang="ZH-CN">的文件管理器是我们设计的楷模,在子窗口显示标题上也不例外。我们把当前目录加上文件的类型作为子窗口的标题。</font></p><p><font face="宋体" lang="ZH-CN">过程</font>CreateCaption<font face="宋体"lang="ZH-CN">用于生成子窗口的标题。 </p></font><p>procedure TFMForm.CreateCaption;</p><p>var</p><p>Cap: String;</p><p>begin</p><p>Cap := DirectoryOutline.Directory;</p><p>Cap := cap+'\'+FileList.mask;</p><p>Caption := Cap;</p><p>end; </p><p><font face="宋体" lang="ZH-CN">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前目录或文件显示类型发生变化时改变子窗口的标题。如</font>DirectoryOutline<fontface="宋体" lang="ZH-CN">的</font>Change<font face="宋体" lang="ZH-CN">事件处理过程和</font>ViewType<fontface="宋体" lang="ZH-CN">菜单项的</font>Click<font face="宋体" lang="ZH-CN">事件处理过程就调用了该过程。 </p></font><p>6.4.8.2 <font face="宋体" lang="ZH-CN">状态条的显示 </p><p>  状态条用于显示当前目录和当前选中文件。它们的值在</font>DirectoryOutline<font face="宋体" lang="ZH-CN">和</font>FileList<font face="宋体" lang="ZH-CN">的</font>Change<fontface="宋体" lang="ZH-CN">事件处理过程中修改。</p><p>  </font>DirectoryOutline<font face="宋体" lang="ZH-CN">和</font>FileList<fontface="宋体" lang="ZH-CN">最终的</font>Change<font face="宋体" lang="ZH-CN">事件处理过程如下: </p></font><p>procedure TFMForm.DirectoryOutlineChange(Sender: TObject);</p><p>begin</p><p>CreateCaption;</p><p>FileList.clear;</p><p>FileList.Directory := DirectoryOutline.Directory;</p><p>FileList.Update;</p><p>FileManager.DirectoryPanel.Caption := DirectoryOutline.Directory;</p><p>end;</p><p>procedure TFMForm.FileListChange(Sender: TObject);</p><p>begin</p><p>with FileList do</p><p>begin</p><p>if (ItemIndex &gt;= 0) and (Not HasAttr(FileName,faDirectory)) then</p><p>begin</p><p>TheFileName := FileName;</p><p>FileManager.FilePanel.Caption :=</p><p>Format('%s, %d bytes', [TheFileName, GetFileSize(TheFileName)]);</p><p>end</p><p>else</p><p>FileManager.FilePanel.Caption := '';</p><p>end;</p><p>end; </p><p>6.4.8.3 <font face="宋体" lang="ZH-CN">版本信息 </p><p>  当用户单击主窗口的</font>Help|About<font face="宋体" lang="ZH-CN">菜单项时将弹出一个</font>About<fontface="宋体" lang="ZH-CN">对话框,用于显示版本信息(如图</font>6.13<fontface="宋体" lang="ZH-CN">)。</p><p>  这一对话框是用</font>Delphi<font face="宋体" lang="ZH-CN">提供的模板做的。</font></p><p>6.4.8.4 <font face="宋体" lang="ZH-CN">菜单项的变灰与使能 </p><p>  </font>File<font face="宋体" lang="ZH-CN">菜单中定义的文件管理功能只有当活动焦点在</font>FileList(<fontface="宋体" lang="ZH-CN">即有当前选中文件</font>)<font face="宋体"lang="ZH-CN">时才起作用。否则所有菜单项应变灰,以免导致系统崩溃。</p><p>  这一功能在</font>File<font face="宋体" lang="ZH-CN">菜单的</font>Click<fontface="宋体" lang="ZH-CN">事件处理过程中实现。这一点并不很容易被人想到,希望读者能从中受到启发。 </p></font><p>procedure TFMForm.File1Click(Sender: TObject);</p><p>var</p><p>FileSelected: Boolean;</p><p>begin</p><p>FileSelected := FileList.ItemIndex &gt;= 0;</p><p>Open1.Enabled := FileSelected;</p><p>Delete1.Enabled := FileSelected;</p><p>Copy1.Enabled := FileSelected;</p><p>Move1.Enabled := FileSelected;</p><p>Rename1.Enabled := FileSelected;</p><p>Properties1.Enabled := FileSelected;</p><p>end;</p><font face="宋体" lang="ZH-CN"><p>  判断是否有文件被选中是通过检测</font>ItemIndex<fontface="宋体" lang="ZH-CN">属性是否大于等于</font>0<font face="宋体"lang="ZH-CN">来实现的。</p><p>  </font> FileSelected := FileList.ItemIndex &gt;= 0<font face="宋体"lang="ZH-CN">; </p></font><p>6.4.8.5 <font face="宋体" lang="ZH-CN">可重用的文件处理模块 </p><p>  库单元</font>fmxutils<font face="宋体" lang="ZH-CN">是一个代码库,提供了若干文件处理模块。这些模块除在本程序中使用外,读者可以在其它应用程序中直接调用,而且不必重新编译,只要在</font>Uses<fontface="宋体" lang="ZH-CN">子句中包含即可。从中我们可以体会到,</font>Delphi<font face="宋体" lang="ZH-CN">以库单元为中心的程序组织方式提供了一种较完善的代码重用机制。 </p></font><p>6.4.9 <font face="宋体" lang="ZH-CN">小结 </p><p>  文件管理器是一个较为综合的例程,使用到了绝大部分以文件名、文件句柄以及其它参数</font>(<fontface="宋体" lang="ZH-CN">除文件变量</font>)<font face="宋体" lang="ZH-CN">为操作对象的文件管理过程</font>/<fontface="宋体" lang="ZH-CN">函数,同时也提供了一些程序设计开发的思想。我们的介绍是以程序功能模块来组织的,我建议读者在学习并试图自己建立这一程序时采用同样的方法。</font>(6.4.8)<fontface="宋体" lang="ZH-CN">中的内容或许是一开始就应了解的,但其它完全可以按顺序逐步地扩充,最后得到一个完整的程序。这一例程在后边的拖放操作和异常处理等章节中还要用到。读者可以以此为基础进一步完善它,使它真正成为一个完全实用的程序。</p><p>  文件管理是在开发一个高级的</font>Windows<font face="宋体"lang="ZH-CN">程序中不可避免的要涉及到的问题。本章介绍的思路和方法将为读者成为一个熟练的程序员奠定基础。</font></p><BR><hr  width="94%"></TD><TD CLASS="tt3" VALIGN="bottom" width="8%"  ><strong><A HREF="019.htm"><FONT style="FONT-SIZE: 9pt">后一页</font></A><BR><A HREF="017.htm"><FONT style="FONT-SIZE: 9pt">前一页</font></A><BR><A HREF="index.html"><FONT style="FONT-SIZE: 9pt">回目录</font></A><BR></strong></TD></TR></table></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -