记录文件的打开和创建
记录文件的打开和创建同文本文件一样也需要关联和初始化两个步骤 同文本文件唯一的不同是不能使用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
有以下办法复制整个文件夹:
1、使用 winexec 调用 xcopy 命令行:
winexec( 'xcopy d:\test e:\ /s/e', false)
2、调用 winAPI 函数:
function CopyDir(const SourceDir,DestDir: string): Booleanvar
lpFileOp: TSHFileOpStruct
begin
with lpFileOp do
begin
Wnd := Application.Handle
wfunc := FO_COPY
pFrom := pchar(SourceDir)
pTo := pchar(DestDir)
fFlags := FOF_ALLOWUNDO
hNameMappings := nil
lpszProgressTitle := nil
fAnyOperationsAborted := false
end
Result := SHFileOperation(lpFileOp) = 0
end
3、使用 delphi 文件函数编写:
function DoCopyDir(sDirName:StringsToDirName:String):Booleanvar
hFindFile:Cardinal
t,tfile:String
sCurDir:String[255]
FindFileData:WIN32_FIND_DATA
begin
//记录当前目录
sCurDir:=GetCurrentDir
ChDir(sDirName)
hFindFile:=FindFirstFile('*.*',FindFileData)
if hFindFile<>INVALID_HANDLE_VALUE then
begin
if not DirectoryExists(sToDirName) then
ForceDirectories(sToDirName)
repeat
tfile:=FindFileData.cFileName
if (tfile='.') or (tfile='..') then
Continue
if FindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY then
begin
t:=sToDirName+'\'+tfile
if not DirectoryExists(t) then
ForceDirectories(t)
if sDirName[Length(sDirName)]<>'\' then
DoCopyDir(sDirName+'\'+tfile,t)
else
DoCopyDir(sDirName+tfile,sToDirName+tfile)
end
else
begin
t:=sToDirName+'\'+tFile
CopyFile(PChar(tfile),PChar(t),True)
end
until FindNextFile(hFindFile,FindFileData)=false
/// FindClose(hFindFile)
end
else
begin
ChDir(sCurDir)
result:=false
exit
end
//回到当前目录
ChDir(sCurDir)
result:=true
end
第一种方法,使用SelectDirectory 函数 ,在ShellApi中procedure TForm2.BtSelectPathClick(Sender: TObject)
var
strCaption,strDirectory:String
wstrRoot:WideString
begin
strCaption:='这是浏览文件夹的说明文字,可以根据需要进行书写。'
+#13#10+'一般二行文字就满了。'
//该参数是浏览文件夹窗口的显示说明部分
wstrRoot:=''
//这个参数表示所显示的浏览文件夹窗口中的根目录,默认或空表示“我的电脑”。
SelectDirectory(strCaption,wstrRoot,strDirectory)
EdLocalPath.Text:=strDirectory
end
第二种方法
要求:利用Win32 API SHBrowseForFolder开启一个选择文件目录的对话框,预先定位到默认的目录,最后返回所选择的结果,如果没有进行选择(即单击“取消”结束选择)则返回空''。
代码如下:(以下两个函数定义需要在uses中引入两个单元ShlObj,Windows)
function BrowseCallbackProc(Wnd: HWNDuMsg: UINTlParam, lpData: LPARAM): Integer stdcall
begin
case uMsg of
BFFM_INITIALIZED: SendMessage(Wnd, BFFM_SETSELECTION, 1, lpData)
end
Result := 0
end
function BrowsFolder(const Folder: string): string
var
TitleName: string
lpItemID: PItemIDList
BrowseInfo: TBrowseInfo
DisplayName: array[0..MAX_PATH] of char
TempPath: array[0..MAX_PATH] of char
begin
Result := Folder
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0)
BrowseInfo.hwndOwner := GetActiveWindow
BrowseInfo.pszDisplayName := @DisplayName
TitleName := '请选择一个目录'
BrowseInfo.lpszTitle := PChar(TitleName)
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS
BrowseInfo.lpfn := BrowseCallbackProc
BrowseInfo.lParam := Integer(PChar(Folder))
lpItemID := SHBrowseForFolder(BrowseInfo)
if Assigned(lpItemId) then
begin
SHGetPathFromIDList(lpItemID, TempPath)
GlobalFreePtr(lpItemID)
Result := string(TempPath)
end
else
Result:=''
end
函数BrowsFolder是主体,传入参数即默认的目录,返回值即选择的结果。
BrowseCallbackProc是由SHBrowseForFolder执行时需要的回调(Call Back)函数。在这个函数中,截取了BFFM_INITIALIZED消息,在目录选择对话框初始化的时候,向对话框发送一个BFFM_SETSELECTION消息,选中默认的目录。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)