首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 计算机等级考试 > 计算机二级 > Delphi > 复习资料 > 正文

2011年计算机等级考试Delphi讲义:文件管理

来源:考试吧Exam8.com) 2010-10-27 14:27:37 考试吧:中国教育培训第一门户 模拟考场
本章首先介绍Delphi文件管理的基本概念和标准过程/函数,并提供了一个记录文件的应用实例,这是从我们实际课题开发中提取出来的。而后介绍Delphi提供的文件控件的使用方法。最后提供的一个综合例程MDI文件管理器则是对Delphi文件管理功能的综合应用。

  6.4.7.1 创建目录

  创建目录时首先弹出一个TNewDir类型的对话框

  对话框中要求用户输入目录名。如果用户不输入路径,则缺省认定为当前目录的子目录:

  Dir := ExpandFileName(DirName.Text);

  而后调用MkDir函数。在目录创建过程中关闭了I/O错误检测,出错不产生异常而是把IOResult设置为非零值。通过检查IOResult是否为0可以确定创建是否成功。

  程序清单如下:

  procedure TFMForm.CreateDirectory1Click(Sender: TObject);

  var

  NewDir: TNewDir;

  Dir: String;

  begin

  {$I-}

  NewDir := TNewDir.Create(self);

  with NewDir do

  begin

  CurrentDir.Caption := DirectoryOutline.Directory;

  if (ShowModal <> idCancel) and (DirName.Text <> '') then

  Dir := ExpandFileName(DirName.text);

  end;

  MkDir(Dir);

  if IOResult <> 0 then

  MessageDlg('Cannot Create directory', mtWarning, [mbOk], 0);

  end;

  但不幸的是目录创建后我们却无法从当前目录树中看到。必须移到另一个驱动器而后再返回,创建的目录才是可见的。在后边我们将提供一种解决方法。

  6.4.7.2 删除目录

  在实现目录删除过程中,远不如创建目录那么顺利。碰到的问题是:

  1.RmDir不允许删除当前目录。但为了操作方便,我们要求删除的恰恰是当前目录;

  2.目录删除后调用Refresh方法或Update方法并不能使该目录从屏幕显示中去除。因而当用户试图进入该目录时会导致系统崩溃。

  对第一个问题,我们的解决办法是把当前目录转换到其父目录。假如读者记得目录也被操作系统作为一种特殊的文件对待的话,那么就不会对下面的语句感到奇怪了:

  path := DirectoryOutline.Directory;

  Directoryoutlin.Directory := ExpandFilePath(Path);

  而后调用RmDir过程:

  RmDir(Path);

  第二个问题的解决却颇为费神。因为DirectoryOutline是Delphi提供的示例部件,没有Help文件支持。通过试验发现:只有当DirectoryOutline的Drive属性改变时,才重新从相应驱动器读取目录。而且它基本上是只读的,除非清除( Clear) 它,象Add、Delete这些方法对它都是无效的。

  我曾经考虑过一个笨拙的方法,那就是先改变当前驱动器而后再改回来。但这种方法一方面速度无法忍受,另一方面当只存在一个驱动器可用时会导致系统崩溃。

  正当我一筹莫展时,突然想到:DirectoryOutline是一个Sample部件,Delphi 提供了它的源代码。而当我分析了它的源代码后,我知道应该做什么了,那就是为DirectoryOutline增添一个Reset方法!

  6.4.7.3 为部件增添一个方法

  严格地说,我们所做的工作属于创建一个新部件。但因为我们有源代码,所以不必从DirectoryOutline继承而是直接修改它。这样我们可以省去与创建部件有关的许多繁琐工作。对创建新部件感兴趣的读者可阅读本书第三编的有关章节。

  在Delphi IDE中打开DirectoryOutline的源文件后:

  1.把库单元名改为DirPlus,类名改为TDirectoryOutlinePlus,表明这是DirectoryOutline的增强版。而后存入另一个目录中;

  2.添加一个公有方法Reset。这一方法的作用是重新读取当前驱动器的目录。程序清单如下。

  procedure TDirectoryOutlinePlus.Reset;

  begin

  ChDir(FDrive + ':');

  GetDir(0, FDirectory);

  FDirectory := ForceCase(FDirectory);

  if not (csLoading in ComponentState) then BuildTree;

  end;

  读者也许被这段代码弄糊涂了。由于篇幅所限,而且涉及到许多自定义部件开发的内容,我们也不准备去详细解释它。假如读者想彻底搞懂它,我建议先看一下本书第三编有关自定义部件开发的内容,而后再对照原DirectoryOutline的源代码进行分析。

  3.编译成一个库文件DirPlus.tpu;

  4.把DirPlus加入部件的Samples页中。

  如何添加一个部件见第三编有关章节的介绍。

  当增强的目录树准备好以后,必须修改我们的子窗口设计,但却不必亲自修改源代码。

  1.删除子窗口中的TDirectoryOutline类部件DirectoryOutline。此时FileList占据了整个客户区;

  2.把FileList的Align属改为None,并留出左边的空白供放部件用;

  3.在窗口左部加入TDirectoryOutlinPlus类的部件DirectoryOutline;

  4.把DirectoryOutline的Align属性改为Left,FileList的Align属性还原为Client;

  5.在DirectoryOutline的事件OnChange列表中选取DirectoryOutlineChange,即原DirectoryOutline的处理过程。

  以上工作的最终目标是实现目录创建、删除后屏幕的正确显示。这只需要调用DirectoryOutline的Reset方法即可。

  目录删除过程的实现代码如下。

  procedure TFMForm.DeleteDirectory1Click(Sender: TObject);

  var

  path: String;

  k: Integer;

  begin

  {$I-}

  path := DirectoryOutline.Directory;

  DirectoryOutline.Directory := ExtractFilePath(Path);

  if MessageDlg('Delete ' + path + '?', mtConfirmation,[mbYes, mbNo], 0) = idYes then

  RmDir(path);

  if IOResult <> 0 then

  MessageDlg(' Cannot remove directory! The path might not'+

  'exist,non-empty or is the current logged directory.',mtWarning,[mbOk], 0)

  else

  DirectoryOutline.Reset;

  end;

  修改后的目录创建过程如下。

  procedure TFMForm.CreateDirectory1Click(Sender: TObject);

  var

  NewDir: TNewDir;

  Dir: String;

  begin

  {$I-}

  NewDir := TNewDir.Create(self);

  with NewDir do

  begin

  CurrentDir.Caption := DirectoryOutline.Directory;

  if (ShowModal <> idCancel) and (DirName.Text <> '') then

  Dir := ExpandFileName(DirName.text);

  end;

  MkDir(Dir);

  if IOResult <> 0 then

  MessageDlg('Cannot Create directory', mtWarning, [mbOk], 0)

  else

  DirectoryOutline.Reset;

  end;

  当完成了这些工作,把程序重新编译、运行后,可以发现我们所希望实现的功能完全实现了!同时,我们有了一个更好的目录树部件。

  6.4.7.4 改变当前目录

  改变当前目录的实现非常简单,只要修改DirectoryOutline的Directory属性。但需注意的是:当改变后目录所在驱动器也发生变化时应相应修改DriveTabSet的当前值。由于驱动器名与DriveTabSet的索引属性TabIndex之间并没有确定的对应关系,因而需要通过一个循环进行查找匹配。

  Change Directory的菜单事件处理过程是FileChange,即与文件的移动、拷贝、更名共用一个事件处理过程。详细情况请读者参看(6.4.5.3)中的介绍。

  改变当前目录的实现如下。

  procedure TFMForm.ChangeDirectory(Todir: String);

  var

  i: Integer;

  begin

  {$I-}

  ChDir(ToDir);

  if IOResult <> 0 then

  MessageDlg('Cannot find directory', mtWarning, [mbOk], 0)

  else

  begin

  with DirectoryOutline do

  begin

  Directory := ToDir;

  Refresh;

  if DriveTabSet.Tabs[DriveTabSet.TabIndex][1]<>drive then

  for I := 1 to 25 do

  if DriveTabSet.Tabs[i][1] = drive then

  begin

  DriveTabSet.TabIndex := i;

  Exit;

  end;

  end;

  end;

  end;

  6.4.8 一些问题的处理

  6.4.8.1 子窗口的标题

  Windows的文件管理器是我们设计的楷模,在子窗口显示标题上也不例外。我们把当前目录加上文件的类型作为子窗口的标题。

  过程CreateCaption用于生成子窗口的标题。

  procedure TFMForm.CreateCaption;

  var

  Cap: String;

  begin

  Cap := DirectoryOutline.Directory;

  Cap := cap+'\'+FileList.mask;

  Caption := Cap;

  end;

  当前目录或文件显示类型发生变化时改变子窗口的标题。如DirectoryOutline的Change事件处理过程和ViewType菜单项的Click事件处理过程就调用了该过程。

  6.4.8.2 状态条的显示

  状态条用于显示当前目录和当前选中文件。它们的值在DirectoryOutline 和FileList的Change事件处理过程中修改。

  DirectoryOutline和FileList最终的Change事件处理过程如下:

  procedure TFMForm.DirectoryOutlineChange(Sender: TObject);

  begin

  CreateCaption;

  FileList.clear;

  FileList.Directory := DirectoryOutline.Directory;

  FileList.Update;

  FileManager.DirectoryPanel.Caption := DirectoryOutline.Directory;

  end;

  procedure TFMForm.FileListChange(Sender: TObject);

  begin

  with FileList do

  begin

  if (ItemIndex >= 0) and (Not HasAttr(FileName,faDirectory)) then

  begin

  TheFileName := FileName;

  FileManager.FilePanel.Caption :=

  Format('%s, %d bytes', [TheFileName, GetFileSize(TheFileName)]);

  end

  else

  FileManager.FilePanel.Caption := '';

  end;

  end;

  6.4.8.3 版本信息

  当用户单击主窗口的Help|About菜单项时将弹出一个About对话框,用于显示版本信息(如图6.13)。

  这一对话框是用Delphi提供的模板做的。

  6.4.8.4 菜单项的变灰与使能

  File菜单中定义的文件管理功能只有当活动焦点在FileList(即有当前选中文件)时才起作用。否则所有菜单项应变灰,以免导致系统崩溃。

  这一功能在File菜单的Click事件处理过程中实现。这一点并不很容易被人想到,希望读者能从中受到启发。

  procedure TFMForm.File1Click(Sender: TObject);

  var

  FileSelected: Boolean;

  begin

  FileSelected := FileList.ItemIndex >= 0;

  Open1.Enabled := FileSelected;

  Delete1.Enabled := FileSelected;

  Copy1.Enabled := FileSelected;

  Move1.Enabled := FileSelected;

  Rename1.Enabled := FileSelected;

  Properties1.Enabled := FileSelected;

  end;

  判断是否有文件被选中是通过检测ItemIndex属性是否大于等于0来实现的。

  FileSelected := FileList.ItemIndex >= 0;

  6.4.8.5 可重用的文件处理模块

  库单元fmxutils是一个代码库,提供了若干文件处理模块。这些模块除在本程序中使用外,读者可以在其它应用程序中直接调用,而且不必重新编译,只要在Uses子句中包含即可。从中我们可以体会到,Delphi 以库单元为中心的程序组织方式提供了一种较完善的代码重用机制。

  6.4.9 小结

  文件管理器是一个较为综合的例程,使用到了绝大部分以文件名、文件句柄以及其它参数(除文件变量)为操作对象的文件管理过程/函数,同时也提供了一些程序设计开发的思想。我们的介绍是以程序功能模块来组织的,我建议读者在学习并试图自己建立这一程序时采用同样的方法。(6.4.8)中的内容或许是一开始就应了解的,但其它完全可以按顺序逐步地扩充,最后得到一个完整的程序。这一例程在后边的拖放操作和异常处理等章节中还要用到。读者可以以此为基础进一步完善它,使它真正成为一个完全实用的程序。

  文件管理是在开发一个高级的Windows程序中不可避免的要涉及到的问题。本章介绍的思路和方法将为读者成为一个熟练的程序员奠定基础。

上一页  1 2 3 4 5 6 7 8 9  下一页
  相关推荐:2010年9月计算机等级考试试题及答案解析专题
       预告:名师解析2010年9月计算机等级考试试题答案
       2010年9月计算机等级考试成绩查询时间及入口
       2010年9月计算机等考成绩查询短信免费提醒开通
文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。