2022年2022年利用Delphi的FileOfType创建并管理属于你自己的数据库

上传人:大米 文档编号:567377152 上传时间:2024-07-20 格式:PDF 页数:8 大小:51.94KB
返回 下载 相关 举报
2022年2022年利用Delphi的FileOfType创建并管理属于你自己的数据库_第1页
第1页 / 共8页
2022年2022年利用Delphi的FileOfType创建并管理属于你自己的数据库_第2页
第2页 / 共8页
2022年2022年利用Delphi的FileOfType创建并管理属于你自己的数据库_第3页
第3页 / 共8页
2022年2022年利用Delphi的FileOfType创建并管理属于你自己的数据库_第4页
第4页 / 共8页
2022年2022年利用Delphi的FileOfType创建并管理属于你自己的数据库_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《2022年2022年利用Delphi的FileOfType创建并管理属于你自己的数据库》由会员分享,可在线阅读,更多相关《2022年2022年利用Delphi的FileOfType创建并管理属于你自己的数据库(8页珍藏版)》请在金锄头文库上搜索。

1、前言在程序中,我们需要用一个途径去把一些有规律的信息存储在磁盘上。不能用TXT 格式的文件 因为它不是基于 “ 记录” 的,而且管理很不方便。BDE 或 ADO 也就是说Paradox 、Access 唉,不列举了 这些我都不想用,尤其不想用BDE 。我要用的是 ASCII 文本文件。 Delphi 能做到吗?当然能!这就是“File Of” 类型文件,或者说files of some type/binary files 。(译者注:与所有的Win32 桌面应用程序编译器相比,Delphi 有一个很独到的特点:它编译的Exe可以不需要一些公共动态链接库的支持,尽管因此Delphi 的 EXE

2、文件可能大一点。而VC、C+Builder 、VFP 等等这些我用过的编译器,却不是这样,它们编译的EXE 往往需要打包一些Dll 才可以用。那么,我们用 Delphi 开发数据库程序时,使用BDE 、ADO 等等引擎,却因此给Delphi 蒙羞 BDE 、ADO 等等,一般都需要单独安装到操作系统中去。)下面举例演示这个应用。首先我们首先要定义一个基类,也就是一个记录结构:type TMember = record Name : string10; eMail : string20; Posts : LongInt; end; 然后声明一个记录集,假设有5 条记录:var Members :

3、 array1.5 of TMember; 在我们读写我们的数据信息前,我们需要声明一个基于我们记录结构的文件变量:var F : file of TMember; 注:在 Delphi 里,我们声明一个文件变量的一般格式就是:var SomeTypedFile : file of SomeType; 这里所说的基类(Some Type ),比如可以是Double 、数组、记录。但不能是长字符串格式、动态数组、类类型以及指针。接下来我们要把我们的“ 数据库 ” 文件链接到我们的程序里去:AssignFile(F, Members.dat) ; 使用一个 “ 文件 ” ,我们需要这样“ 打开 ”

4、 它,并调用Reset方法打开一个已存在于硬盘上的文件,用Rewrite 方法去创建一个新文件。当文件使用完毕, 关闭应用程序之前, 我们要记得用CloseFile 方法 “ 关闭 ”它。如果忘记关闭,将引起一个I/O 错误。当文件句柄被关闭,此前对它的所有更新操作将应用。(译者注:上面所说的“ 文件 ” ,不仅仅包括磁盘文件,而且包括串口、打印机、其他设备 这些都是“ 文件 ” 。)写入到文件假设我们已经填充了Members里的 5 条记录。那么,接下来就是把这5 条记录写入磁盘文件的代码:var 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -

5、- - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - F : file of TMember; i : integer; begin AssignFile(F,members.dat) ; Rewrite(F) ; try for i:= 1 to 5 do Write (F, Membersi) ; finally CloseFile(F) ; end; end; 从磁盘文件读出所有记录var Member: Tmember; F : file of TMember; begin AssignFile(F,members.d

6、at) ; Reset(F) ; try while not Eof(F) do begin Read (F, Member) ; DoSomethingWithMember; end; finally CloseFile(F) ; end; end; 注: EOF 是文件的结束标志。我们通过判断它的真假,来知道哪里是文件里最后的一条记录。Seeking and Positioning文件记录通常是要不断更新的。在一般情况下,我们读写一条记录后,游标立即指向下一条记录。我们可以用下面的方法实现在记录间自由移动游标: 回到文件头,即第1 条记录 Seek(F, 0) ; 跳到第 3 条记录 Se

7、ek(F, 3) ; 跳到文件尾,即最后一条记录的后面 Seek(F, FileSize(F) ; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - 记录的更新前面我们仅仅学习了如何读写记录。那么如果我们要求找到第10 条记录, 然后把这条记录的某个字段(如: Email )修改一下,怎么做?请看下面的代码:procedure ChangeEMail(const RecN : integer; const NewEMail : s

8、tring) ; var DummyMember : TMember; begin assign, open, exception handling 模块略 Seek(F, RecN) ; Read(F, DummyMember) ; DummyMember.Email := NewEMail; 此时游标已下移,我们需要重新返回游标位置 Seek(F, RecN) ; Write(F, DummyMember) ; 关闭文件 end; 结束语至此,我们已经知道如何写记录到磁盘文件,如何读取,如何仅仅改变文件中间某条记录的一部分数据。附:一个完整的例子代码(译者注: 这个完整的例子代码是由译者附

9、加的,在 Delphi6 + Windows2000上编译通过。 因时间紧,没有写 “ 添加 ”“删除 ” 一条记录的代码。基于本文及本例,读者完全可以写一个控件,完成象BDE、ADO 那样的功能。)unit Unt_Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TFrm_Main = class(TForm) Btn_FillDemoData: TButton; Btn_ReadAll: TButto

10、n; Edt_Name: TEdit; Edt_Email: TEdit; Edt_Posts: TEdit; Btn_GoFirst: TButton; Btn_Go4th: TButton; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - Btn_GoLastRecord: TButton; Btn_ReWriteNowRec: TButton; Btn_Next: TButton; Btn_Previous: TButto

11、n; procedure Btn_FillDemoDataClick(Sender: TObject); procedure Btn_ReadAllClick(Sender: TObject); procedure Btn_GoFirstClick(Sender: TObject); procedure Btn_Go4thClick(Sender: TObject); procedure Btn_GoLastRecordClick(Sender: TObject); procedure Btn_NextClick(Sender: TObject); procedure Btn_Previous

12、Click(Sender: TObject); procedure Btn_ReWriteNowRecClick(Sender: TObject); private Private declarations public Public declarations end; var Frm_Main: TFrm_Main; implementation $R *.dfm type TMember = record Name : string10; eMail : string20; Posts : LongInt; end; const DBFname : string = c:members.d

13、at; var Members : array1.5 of TMember; aMember : TMember; nowRecNo: integer = -1; procedure MembersInit; begin Members1.Name := TheFirst; Members1.eMail:= ; Members1.Posts:= 262201; Members2.Name := TheSecond; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页

14、- - - - - - - - - Members2.eMail:= ; Members2.Posts:= 262202; Members3.Name := TheThird; Members3.eMail:= ; Members3.Posts:= 262203; Members4.Name := The4th; Members4.eMail:= ; Members4.Posts:= 262204; Members5.Name := The5th; Members5.eMail:= ; Members5.Posts:= 262205; end; function SeekRec(RecNo :

15、 integer; var aMember : TMember):boolean; var F : file of TMember; begin AssignFile(F,DBFname) ; Reset(F) ; try Seek(F,RecNo-1); Read (F, aMember); Result := True; Except Result := False; end; CloseFile(F); end; function UpdateRec(RecNo : integer; var aMember : TMember):boolean; var F : file of TMem

16、ber; begin AssignFile(F,DBFname) ; Reset(F) ; try Seek(F,RecNo-1); Write(F, aMember); Result := True; Except Result := False; end; CloseFile(F); end; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - procedure TFrm_Main.Btn_FillDemoDataClick(

17、Sender: TObject); var F : file of TMember; i : integer; begin MembersInit; AssignFile(F,DBFname) ; Rewrite(F) ; try for i:= Low(Members) to High(Members) do Write (F, Membersi) ; finally CloseFile(F) ; end; end; procedure TFrm_Main.Btn_ReadAllClick(Sender: TObject); var Member: TMember; F : file of

18、TMember; begin AssignFile(F,DBFname) ; Reset(F) ; try while not Eof(F) do begin Read (F, Member) ; DoSomethingWithMember; end; finally CloseFile(F) ; end; end; procedure TFrm_Main.Btn_GoFirstClick(Sender: TObject); begin nowRecNo := 1; if SeekRec(nowRecNo,aMember) then begin Edt_Name.Text := aMember

19、.Name; Edt_Email.Text:= aMember.eMail; Edt_Posts.Text:= IntToStr(aMember.Posts); end else showmessage(Error); end; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - procedure TFrm_Main.Btn_Go4thClick(Sender: TObject); begin nowRecNo := 4; if

20、SeekRec(nowRecNo,aMember) then begin Edt_Name.Text := aMember.Name; Edt_Email.Text:= aMember.eMail; Edt_Posts.Text:= IntToStr(aMember.Posts); end else showmessage(Error); end; procedure TFrm_Main.Btn_GoLastRecordClick(Sender: TObject); Or Use SeekRec(5,aMember) var F : file of TMember; begin AssignF

21、ile(F,DBFname) ; Reset(F) ; nowRecNo := FileSize(F); try Seek(F,nowRecNo-1); Read (F, aMember); Edt_Name.Text := aMember.Name; Edt_Email.Text:= aMember.eMail; Edt_Posts.Text:= IntToStr(aMember.Posts); Except showmessage(Error); end; CloseFile(F); end; procedure TFrm_Main.Btn_NextClick(Sender: TObjec

22、t); begin nowRecNo := nowRecNo + 1; if SeekRec(nowRecNo,aMember) then begin Edt_Name.Text := aMember.Name; Edt_Email.Text:= aMember.eMail; Edt_Posts.Text:= IntToStr(aMember.Posts); end else showmessage(Error); end; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共

23、 8 页 - - - - - - - - - procedure TFrm_Main.Btn_PreviousClick(Sender: TObject); begin nowRecNo := nowRecNo - 1; if SeekRec(nowRecNo,aMember) then begin Edt_Name.Text := aMember.Name; Edt_Email.Text:= aMember.eMail; Edt_Posts.Text:= IntToStr(aMember.Posts); end else showmessage(Error); end; procedure

24、TFrm_Main.Btn_ReWriteNowRecClick(Sender: TObject); begin aMember.Name := Edt_Name.Text; aMember.eMail:= Edt_Email.Text; aMember.Posts:= StrToInt(Trim(Edt_Posts.Text); if not UpdateRec(nowRecNo,aMember) then showmessage(Error); end; end. 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号