记录文件的打开和创建
记录文件的打开和创建同文本文件一样也需要关联和初始化两个步骤 同文本文件唯一的不同是不能使用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用record来处理,给个小示例
Header = record //假设是个头文件的数据格式
Count: Integer
end
Play = record //假设是记录的数据格式
Account: String[20]
Name: String[20]
end
File: TFileStream//假设加载了文件
读取头部信息:
var
H:Header
P:Play
I: Integer
begin
File.Seek(0, smFromBeging)//这个参数名我记不清楚,自己查下
File.ReadBuffer(@H, SizeOf(Header))
for I = 0 to H.Count -1 do
File.ReadBuffer(@P, SizeOf(Play)) //这里读取一个记录后,即可针对记录做些处理
end
大致就是这样读取了,写入的方式差不多,用Writebuffer就可以 。你声明相应的头文件格式和记录的格式,按照我这个思路去处理就行
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)