DELPHI基础教程:文件管理(二)[4]

DELPHI基础教程:文件管理(二)[4],第1张

窗口主菜单包括File Function Directory三个菜单项 分别用于完成文件的基本管理功能 其它管理功能和目录管理功能

由于对话框界面设计很简单 这里不再进行赘述 读者可直接参考后面将给出的对话框界面图(图 )进行设计

子窗口的创建 布置和关闭

子窗口的创建 布置由父窗口的Windows菜单控制 其菜单项如下

● New Windows : 创建新的子窗口

● Tile : 平铺

● Cascade : 层叠

● ArrangeIcon : 排列图标

● Minimized All : 极小化所有子窗口

子窗口的创建只需要简单调用窗体的Create方法

FileMan := TFMForm Create(Application)

子窗口的标准排列方式直接调用MDI窗口的标准方法Tile Cascade和ArrangeIcons

极小化所有子窗口的实现利用MDI窗口的两个属性 MDIChildCount和MDIChildren:

for i := to MDICount do

MDIChildren[i] Windowstate := wsMinimized

子窗口关闭时释放内存空间 为此在子窗口TFMForm的OnClose事件中令

Action := OnFree

为了保持和Windows的File Manager的一致性 我们也禁止关闭最后一个子窗口 这需要在子窗口的OnCloseQuery事件处理过程中实现

If FileManager MDIChildCount <= then

CanClose := False

CanClose是OnCloseQuery事件过程返回的一个参数 用于判定窗口是否可以关闭

由于这一过程归子窗口所有 因而MDIChildCount前必须加上其对象名FileManager

但不幸的是 这样一来我们的程序无法终止了!原来MDI窗口关闭前首先关闭其所有的子窗口 如果子窗口不能关闭 MDI窗口也不能关闭

为此我们需要判断发出关闭消息的是子窗口的系统菜单还是菜单的Exit项

定义一个全局变量

var

ExitClick: Boolean

在子窗口的Exit Click事件处理过程中

ExitClick := True

FileManager Exit Click(Sender)

子窗口关闭前可以利用这一全局变量检测是否应关闭

If (FileManager MDIChildCount <= ) and (Not ExitClick) then

CanClose := False

文件控件的联系

在本例中我们使用了一组新的控件 TabSet DirectoryOutline FileListBox 用于显示和选择驱动器 目录和文件 与( )中所用方法相比 使用这一组控件需要少量的代码支持

TabSet与DirectoryOutline的联系在TabSet的Click事件处理过程中建立

With DriveTabSet do

DirectoryOutline Drive := Tabs[TabIndex][ ]

DirectoryOutline与FileListBox的联系在DirectoryOutline的Change事件处理过程中建立

FileList Directory := DirectoryOutline Directory

FileList Update

DriveTabSet的自画风格显示

Dephi为一些控件提供了自画风格的显示 如ListBox ComboBox TabSet等 在缺省情况下 这些控件自动显示文本 而在自画风格下 拥有控件的窗体在运行时间内自己画出控件的每一项目

自画风格显示通常的应用是为项目除文本外再添加图形显示 能以自画风格显示的控件有一个共同特点 都拥有一个TStrings类型的项目链 由于TStrings类的特点(参第三章) 它们都可以加入一个和对应文本相联系的对象 而这正是自画风格显示的关键

通常情况下产生一个自画风格需要三个步骤

设置自画风格

向字符串链表添加图形对象

画出自画项目

设置自画风格

控件属性Style 用于设置自画风格 对于DriveTabSet 我们把Style 属性设置为tsOwnerDraw

对于ListBox ComboBox等控件的设置与TabSet略有差异 读者可参阅联机帮助文档

向字符串链表添加图形对象

在应用程序中添加图片部件

在本程序中我们设置了三个图片部件NetWork Floppy Fixed 并分别与三个位图文件NetWork bmp Floppy bmp Fixed bmp相关联

把图片添加到字符串链表中

根据字符串链表的性质 我们可以把对象与已存在的字符串建立联系 也可以同时添加字符串和对象 这里我们采用后一种方法

在子窗口的OnCreate事件处理过程中 我们利用一个循环依次检测从a到z的驱动器是否存在以及驱动器的类型 这利用了Windwos API函数GetDrivetype 如果驱动器不存在则返回 否则返回驱动器的类型(DRIVE_REMOVABLE DRIVE_FIXED DRIVE_REMOTE) 根据驱动器类型我们可以判断与文本(驱动器名)同时添加到Tabs中的不同图形对象 在添加过程中 DriveTabSet的TabIndex被设置为当前驱动器

程序清单如下

procedure TFMForm FormCreate(Sender: TObject)

var

Drive AddedIndex: Integer

DriveLetter: Char

begin

for Drive := to do

begin

DriveLetter := Chr(Drive + ord( a ))

case GetDrivetype(Drive) of

DRIVE_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 Neork Picture Graphic)

end

if UpCase(DriveLetter) = UpCase(FileList Drive) then

DriveTabSet TAbIndex := AddedIndex

end

end

画出自画项目

当把一个控件的风格设置为自画时 Windows不再负责往屏幕上画出控件的项目 而是为每个可见项目产生自画事件 应用程序可以通过处理自画事件画出控件的项目

确定自画项目的大小

对于TabSet而言 这在OnMeasureTab事件处理过程中完成 我们需要把DriveTabSet每个标签的宽度增大到足以同时放下文本和位图

procedure TFMForm DriveTabSetMeasureTab(Sender: TObjectIndex: Integer

var TabWidth: Integer)

var

BitmapWidth: Integer

begin

BitmapWidth := TBitmap(DriveTabSet Tabs Objects[Index]) Width

Inc(TabWidth + BitmapWidth)

end

由于TStrings的Objects属性中存放的对象都是TObject类型 并没有Width属性 因而需要再把它转化为TBitmap类型的对象

BitmapWidth := TBitmap(DriveTabSet Tabs Objects[Index]) Width

返回目录 DELPHI基础教程

       编辑推荐

       Java程序设计培训视频教程

       J EE高级框架实战培训视频教程

Visual C++音频/视频技术开发与实战

Oracle索引技术

ORACLE G数据库开发优化指南

Java程序性能优化 让你的Java程序更快 更稳定

C嵌入式编程设计模式

Android游戏开发实践指南

lishixinzhi/Article/program/Delphi/201311/25239

记录文件的打开和创建

记录文件的打开和创建同文本文件一样也需要关联和初始化两个步骤 同文本文件唯一的不同是不能使用Append过程

记录文件缺省情况下以读写方式打开 如果想以只读或只写方式打开 则需要修改System单元中定义的变量FileMode的值

FileMode的取值和意义如下表

表 FileMode的取值和意义

━━━━━━━━━━━━━━

取值 意义

──────────────

只读

只写

读写

━━━━━━━━━━━━━━

FileMode是一个全局变量 对它的每次修改都将影响所有Reset的 *** 作 因此在打开自己的文件后应还原它的值

在本系统中 当用户按下 打开 按钮时 首先d出一个标准文件打开对话框 要求用户输入或选择文件名 确认后如果该文件名的文件存在 则用Reset打开 若不存在则创建 程序清单如下

procedure TRecFileForm OpenButtonClick(Sender: TObject)

begin

if OpenDialog Execute then

FileName := OpenDialog FileName

else

exit

AssignFile(MethodFile Filename)

try

Reset(MethodFile)

FileOpened := True

except

On EInOutError do

begin

try

if FileExists(FileName) = False then

begin

ReWrite(MethodFile)

FileOpened := True

end

else

begin

FileOpened := False

MessageDlg( 文件不能打开 mtWarning [mbOK] )

end

except

On EInOutError do

begin

FileOpened := False

MessageDlg( 文件不能创建 mtWarning [mbOK] )

end

end

end

end

if FileOpened = False then exit

Count := FileSize(MethodFile)

if Count>then

ChangeGrid

RecFileForm Caption := FormCaption+ +FileName

NewButton Enabled := False

OpenButton Enabled := False

CloseButton Enabled := True

end

首先系统试图用Reset打开一个文件 并置FileOpened为True 如果文件不能打开 则引发一个I/O异常 在异常处理过程中 首先检测文件是否存在 若不存在则创建这个文件 否则是其它原因引发的异常 则把FileOpend重置为False 并显示信息 文件不能打开 在文件创建过程中仍可能引发异常 因而在一个嵌套的异常处理中把FileOpened重置为False 并提示信息 文件不能创建

有关异常处理的内容请读者参看第十二章 这段程序说明 异常处理机制不仅能使我们的程序更健壮 而且为编程提供了灵活性

当用户按下 创建 按钮时 系统首先d出一个标准输入框 要求用户输入文件名 确认后系统首先检测文件是否存在 若存在则直接打开 否则创建一个新文件 打开或创建过程导致异常 则重置FileName和FileOpened两个全局变量

procedure TRecFileForm NewButtonClick(Sender: TObject)

begin

FileName := InputBox( 输入框 请输入文件名 )

if FileName = then Exit

try

AssignFile(MethodFile FileName)

if FileExists(FileName) then

begin

Reset(MethodFile)

Count := FileSize(MethodFile)

if Count>then

ChangeGrid

end

else

begin

Rewrite(MethodFile)

count :=

end

FileOpened := true

Except

on EInOutError do

begin

FileName :=

FileOpened := False

end

end

if FileOpened then

begin

NewButton Enabled := False

OpenButton Enabled := False

CloseButton Enabled := True

RecFileForm Caption := FormCaption+ +FileName

end

end

当文件打开或创建后 所要做的工作有

● 若文件非空 则计算文件长度 并用文件内容填充StringGrid

● 创建 打开 按钮变灰 关闭 按钮使能

● 把文件名附到窗口标题后

记录文件的读入和显示

定义一个全局变量Count用来保存文件中的记录个数 当文件装入时

Count := FileSize(MethodFile)

如果Count >则首先确定StringGrid 的高度 行数 为保证StringGrid 不会覆盖窗口下面的编辑框 定义一个常量MaxShow 当Count <MaxShow时 记录可全部显示 当Count >= MaxShow时 StringGrid 自动添加一个滚动棒 为保证滚动棒不覆盖掉显示内容 StringGrid 的宽度应留有余地

确定StringGrid 高度 行数的代码如下

With StringGrid do

if count <MaxShow then

Height := DefaultRowHeight * (Count+ )+

else

Height := DefaultRowHeight * MaxShow+

RowCount := Count+

end

而后从文件中逐个读入记录并显示在StringGrid 的相应位置

for i := to Count do

begin

Read(MethodFile MethodRec)

ShowMethod(MethodRec i)

end

ShowMehtod是一个过程 用来把一条记录填入StringGrid 的一行中 对于Name Condition域而言 只须直接赋值即可 而对Nature 域需要把枚举类型值转化为对应意义的字符串( : 微观 : 宏观 ) 而对Result域则需要把数值转化为一定格式的字符串

Str (MethodRec Result: : ResultStr)

StringGrid Cells[ Pos] := ResultStr

即Result显示域宽为 其中小数点后位数为

lishixinzhi/Article/program/Delphi/201311/25242


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8080201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存