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

📄 018.htm

📁 delphi教程
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>—DELPHI基础教程—第六章 文件管理(三)</TITLE><META NAME="keywords" CONTENT=" DELPHI基础教程 第六章 文件管理(三)"><META NAME="description" CONTENT=" - DELPHI基础教程 - 第六章 文件管理(三)"><style><!--#page {position:absolute; z-index:0; left:0px; top:0px}.tt3 {font: 9pt/12pt "宋体"}.tt2 {font: 12pt/15pt "宋体"}a {text-decoration:none}a:hover {color: blue;text-decoration:underline}--></style></HEAD><body text="#000000"  bgcolor="#FFFFFF" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3"><TABLE WIDTH="100%" CELLPADDING=10 CELLSPACING=0 BORDER=0><TR><TD CLASS="tt3" VALIGN="top" 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><TD class="tt2"  width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="隶书">第六章 文件管理(三)</FONT></B></center><hr  width="94%"><p>2.<font face="宋体" lang="ZH-CN">画出每个自画项目 </p><p>  这在</font>TabSet<font face="宋体" lang="ZH-CN">的</font>OnDrawTab<fontface="宋体" lang="ZH-CN">事件处理过程中完成。这一事件处理过程的参数中包含了待画项目索引、画板、待画区域、是否被选中等。这里我们只利用了前三个参数。事实上利用最后一个参数,我们可以对被选中的标签进行一些特殊的视觉效果处理。这一工作就留给读者自己去完成。 </p></font><p>procedure TFMForm.DriveTabSetDrawTab(Sender: TObject; TabCanvas: TCanvas;</p><p>R: TRect; Index: Integer; Selected: Boolean);</p><p>var</p><p>Bitmap: TBitmap;</p><p>begin</p><p>Bitmap := TBitmap(DriveTabSet.Tabs.Objects[Index]);</p><p>with TabCanvas do</p><p>begin</p><p>Draw(R.Left, R.Top + 4, Bitmap);</p><p>TextOut(R.Left + 2 + Bitmap.Width, R.Top + 2, DriveTabSet.Tabs[Index]);</p><p>end;</p><p>end; </p><p>6.4.5 <font face="宋体" lang="ZH-CN">文件管理基本功能的实现 </p><p>  在子窗口的</font>File<font face="宋体" lang="ZH-CN">菜单中,定义了文件管理的基本功能,它们是:</p><p>  ●</font> Open <font face="宋体" lang="ZH-CN">:打开或运行一个文件</font>(<fontface="宋体" lang="ZH-CN">从文件列表框双击该文件可实现同样效果</font>)</p><p><font face="宋体" lang="ZH-CN">●</font> Move <font face="宋体" lang="ZH-CN">:文件在不同目录间的移动</p><p>  ●</font> Copy <font face="宋体" lang="ZH-CN">:文件拷贝</p><p>  ●</font> Delete <font face="宋体" lang="ZH-CN">:文件删除</p><p>  ●</font> Rename <font face="宋体" lang="ZH-CN">:文件更名</p><p>  ●</font> Properties <font face="宋体" lang="ZH-CN">:显示文件属性 </p></font><p>6.4.5.1 <font face="宋体" lang="ZH-CN">文件打开 </p><p>  文件打开功能可以运行一个可执行文件,或把文件在与之相关联的应用程序中打开。文件总是与创建它的应用程序相关联,这种关联可以在</font>Windows<fontface="宋体" lang="ZH-CN">的文件管理器中修改。要注意的是:文件的关联是以后缀名为标志的,因而对一个文件关联方式的修改将影响所有相同后缀名的文件。</p><p>  文件打开功能实现的关键是利用了</font>Windows API<fontface="宋体" lang="ZH-CN">函数</font>ShellExecute <font face="宋体" lang="ZH-CN">。由于</font>WindowsAPI<font face="宋体" lang="ZH-CN">函数的参数要求字符串类型是</font>PChar<fontface="宋体" lang="ZH-CN">,而</font>Delphi<font face="宋体" lang="ZH-CN">中一般用的是有结束标志的</font>String<fontface="宋体" lang="ZH-CN">类型,因此为调用方便我们把这一函数进行了重新定义如下。 </p></font><p>function ExecuteFile(const FileName, Params, DefaultDir: String;</p><p>ShowCmd: Integer): THandle;</p><p>var</p><p>zFileName, zParams, zDir: array[0..79] of Char;</p><p>begin</p><p>Result := ShellExecute(Application.MainForm.Handle, nil,</p><p>StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),</p><p>StrPCopy(zDir, DefaultDir), ShowCmd);</p><p>end;</p><font face="宋体" lang="ZH-CN"><p>  以上函数在</font>fmxutils<fontface="宋体" lang="ZH-CN">单元中定义。</font>fmxutils<font face="宋体"lang="ZH-CN">是一个自定义代码单元。</p><p>  有关</font>ShellExecute<font face="宋体" lang="ZH-CN">中各参数的具体含义读者可查阅联机</font>Help<fontface="宋体" lang="ZH-CN">文件。</p><p>  </font>StrPCopy<font face="宋体" lang="ZH-CN">把一个</font>Pascal<fontface="宋体" lang="ZH-CN">类型的字符串拷贝到一个无结束符的</font>PChar<fontface="宋体" lang="ZH-CN">类型字符串中。</p><p>  在子窗口的</font>Open1Click<font face="宋体" lang="ZH-CN">事件处理过程中: </p></font><p>procedure TFMForm.Open1Click(Sender: TObject);</p><p>begin</p><p>with FileList do</p><p>ExecuteFile(FileName, '', Directory, SW_SHOW) ;</p><p>end;</p><font face="宋体" lang="ZH-CN"><p>  如果</font>FileList<font face="宋体"lang="ZH-CN">允许显示目录的话</font>(<font face="宋体" lang="ZH-CN">即</font>FileType<fontface="宋体" lang="ZH-CN">属性再增加一项</font>ftDirectory)<font face="宋体"lang="ZH-CN">,那么对于一个目录而言,打开的含义应该是显示它下边的子目录和文件。程序修改如下。 </p><p> </font> procefure TFMForm.Open1Click(Sender: Tobject);</p><p>begin</p><p>With FileList do</p><p>begin</p><p>if HasAttr(FileName,faDirectory) then</p><p>DirectoryOutline.Directory := FileName</p><p>else</p><p>ExecuteFile(FileName,' ' ,Directory,SW_SHOW);</p><p>end;</p><p>end; </p><p><font face="宋体" lang="ZH-CN">其中</font>HasAttr<font face="宋体" lang="ZH-CN">是一个</font>fmxutils<fontface="宋体" lang="ZH-CN">单元中的自定义函数,用于检测指定文件是否具有某种属性。 </p></font><p>function HasAttr(const FileName: String; Attr: Word): Boolean;</p><p>begin</p><p>Result := (FileGetAttr(FileName) and Attr) = Attr;</p><p>end; </p><p>6.4.5.2 <font face="宋体" lang="ZH-CN">文件拷贝、移动、删除、更名 </p><p>  文件拷贝的关键是使用了以文件句柄为操作对象的文件管理函数,因而提供了一种底层的</font>I/O<fontface="宋体" lang="ZH-CN">通道。在</font>Object Pascal<font face="宋体"lang="ZH-CN">中这一点是利用无类型文件实现的。</p><p>  在文件拷贝中首先检查目标文件名是否是一个目录。如是则把原文件的文件名添加到目标路径后,生成目标文件全路径名。而后提取源文件的时间戳,以备拷贝完成后设置目标文件。拷贝过程中使用了返回文件句柄或以文件句柄为参数的文件管理函数</font>FileOpen<fontface="宋体" lang="ZH-CN">、</font>FileCreate<font face="宋体" lang="ZH-CN">、</font>FileRead<fontface="宋体" lang="ZH-CN">、</font>FileWrite<font face="宋体" lang="ZH-CN">、</font>FileClose<fontface="宋体" lang="ZH-CN">。为保证文件的正常关闭和内存的释放,在拷贝过程中进行异常保护。</font></p><p><font face="宋体" lang="ZH-CN">过程</font>CopyFile<font face="宋体" lang="ZH-CN">实现上述功能,它定义在</font>fmxutils<fontface="宋体" lang="ZH-CN">单元中。 </p></font><p>procedure CopyFile(const FileName, DestName: TFileName);</p><p>var</p><p>CopyBuffer: Pointer; </p><p>TimeStamp, BytesCopied: Longint;</p><p>Source, Dest: Integer; </p><p>Destination: TFileName; </p><p>const</p><p>ChunkSize: Longint = 8192; </p><p>begin</p><p>Destination := ExpandFileName(DestName); </p><p>if HasAttr(Destination, faDirectory) then </p><p>Destination := Destination + '\' + ExtractFileName(FileName); </p><p>TimeStamp := FileAge(FileName); </p><p>GetMem(CopyBuffer, ChunkSize); </p><p>try</p><p>Source := FileOpen(FileName, fmShareDenyWrite);</p><p>if Source &lt; 0 then </p><p>raise EFOpenError.Create(FmtLoadStr(SFOpenError, [FileName]));</p><p>try</p><p>Dest := FileCreate(Destination); </p><p>if Dest &lt; 0 then </p><p>raise EFCreateError.Create(FmtLoadStr(SFCreateError,[Destination]));</p><p>try</p><p>repeat</p><p>BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); </p><p>if BytesCopied &gt; 0 then </p><p>FileWrite(Dest, CopyBuffer^, BytesCopied); </p><p>until BytesCopied &lt; ChunkSize; </p><p>finally</p><p>FileSetDate(Dest,TimeStamp);</p><p>FileClose(Dest); </p><p>end;</p><p>finally</p><p>FileClose(Source); </p><p>end;</p><p>finally</p><p>FreeMem(CopyBuffer, ChunkSize);</p><p>end;</p><p>end;</p><font face="宋体" lang="ZH-CN"><p>  如果我们不使用</font>FileSetDate<fontface="宋体" lang="ZH-CN">过程,</font>Windows<font face="宋体" lang="ZH-CN">自动把当前时间作为时间戳写入文件。</p><p>  文件移动事实上是文件拷贝与文件删除的结合。</font>fmxutils<fontface="宋体" lang="ZH-CN">单元中的</font>MoveFile<font face="宋体" lang="ZH-CN">过程实现了这一功能。 </p></font><p>procedure MoveFile(const FileName, DestName: TFileName);</p><p>var</p><p>Destination: TFileName;</p><p>begin</p><p>Destination := ExpandFileName(DestName); </p><p>if not RenameFile(FileName, Destination) then </p><p>begin</p><p>if HasAttr(FileName, faReadOnly) then </p><p>raise EFCantMove.Create(Format(SFCantMove, [FileName])); </p><p>CopyFile(FileName, Destination); </p><p>DeleteFile(FileName); </p><p>end;</p><p>end; </p><p>EFCanMove<font face="宋体" lang="ZH-CN">是一个自定义异常类: </p><p>  </font>type</p><p>EFCanMove := Class(EStreamError);</p><font face="宋体" lang="ZH-CN"><p>  有关自定义异常类请参阅第十二章。</p><p>  文件删除、文件更名直接调用</font>Delphi<font face="宋体"lang="ZH-CN">文件管理过程</font>DeleteFile<font face="宋体" lang="ZH-CN">、</font>RenameFile<fontface="宋体" lang="ZH-CN">。它们都以文件名为参数。操作执行前应弹出一个对话框进行确认,执行完毕后应调用</font>Update<fontface="宋体" lang="ZH-CN">方法更新</font>FileList<font face="宋体" lang="ZH-CN">的显示。 </p></font><p>6.4.5.3 <font face="宋体" lang="ZH-CN">一致的界面 </p><p>  文件拷贝、文件移动、</font> <font face="宋体" lang="ZH-CN">文件更名以及后边的改变当前目录在形式上都表现为从一个源文件到一个目标文件。因而可以采用统一的用户界面,即</font>ChangeForm<fontface="宋体" lang="ZH-CN">对话框</font></p><font face="宋体" lang="ZH-CN"><p>这四个菜单项共用一个</font>Click<fontface="宋体" lang="ZH-CN">事件处理过程,通过对</font>Sender<font face="宋体"lang="ZH-CN">参数的检测,决定将要打开对话框的标题和显示内容。当用户按</font>OK<fontface="宋体" lang="ZH-CN">键关闭且目标文件</font>(<font face="宋体"lang="ZH-CN">目录</font>)<font face="宋体" lang="ZH-CN">非空时,程序弹出一个消息对话框要求用户进一步确认,而后执行相应的动作。</p><p>  共用的事件处理过程</font>FileChange<font face="宋体" lang="ZH-CN">的程序清单如下: </p></font><p>procedure TFMForm.FileChange(Sender: TObject);</p><p>var</p><p>ChangeForm: TChangeForm;</p><p>IsFile: Boolean;</p><p>begin</p><p>ChangeForm := TchangeForm.Create(Self);</p><p>IsFile := True;</p><p>with ChangeForm do</p><p>begin</p><p>if Sender = Move1 then Caption := 'Move'</p><p>else if Sender = Copy1 then Caption := 'Copy'</p><p>else if Sender = Rename1 then Caption := 'Rename'</p><p>else if Sender = ChangeDirectory1 then</p><p>begin</p><p>Caption:='Change Directory';</p><p>IsFile:=False;</p><p>end</p><p>else Exit;</p><p>if IsFile then</p><p>begin</p><p>CurrentDir.Caption := FileList.Directory;</p><p>FromFileName.Text := FileList.FileName;</p><p>ToFileName.Text := '';</p><p>end</p><p>else</p><p>begin</p><p>CurrentDir.Caption := DriveTabSet.Tabs[DriveTabSet.TabIndex];</p><p>FromFileName.Text := DirectoryOutline.Directory;</p><p>ToFileName.Text := '';</p>

⌨️ 快捷键说明

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