如果用DELPHI中的数据库控件的话,在以后的软件发布中将带有大量的库文件,才能使用,这将增大发布软件的容量大小,我想自己用如:filecreate,read,write,..等函数来自编一个DAT文件,对其进行操作,在对dat文件的操作过程中,读和写都很容易,我想在此问各位高手,-----如何对dat文件进行数据修改和删除里面的记录数据呢??
你可以到http://www.21jx.com/~tinydb/gb/下在一个TinyDB.以下是其网页上的介绍:
TinyDB 是什么?
TinyDB是提供给Delphi和BCB程序员的一组Delphi组件,目前包含 TTinyTable 和 TTinyDB。
·完全兼容Delphi和BCB中所有的Data Controls
·无须BDE的支持,无须附带任何DLL或OCX,开发绿色软件的最佳选择
·支持对BLOB型字段数据的压缩,并提供多种不同压缩方案
·优良的加密性能,预置三种先进的加密算法对数据库进行加密
·提供数据处理扩展接口,可挂接任意压缩和加密或者自定义算法
·加密和压缩均对用户透明,存取数据库时自动进行
·单一文件型数据库,无论数据库多复杂,只有一个文件
·完全支持基本的数据库结构定义
·接口和Delphi(BCB)中的数据库相关组件保持一致,易于使用
·提供配套工具 TinyDB Desktop 以及详细开发帮助文档和例程
TinyDB 能做什么? 当我们用Delphi或BCB做一个软件的时候,如果要将大量数据保存到硬盘上,通常采用的方法无外乎两种:第一种是使用Borland Database Engine(BDE);第二种是自己制定一个文件格式,用读写文件的方法把数据保存到文件中。
对于第一种方法,没什么可说的,这大概是最常用也是最权威的方法。但它有个缺陷:必须附带并安装BDE的支持包。这对于开发一个力求精致小巧、绿色实用的软件来说,似乎并不是最好的方案。
而第二种方法,虽然无须BDE的支持,但文件格式的拟定、维护往往让人累不堪言。当软件的功能增加,文件格式需要做相应调整的时候,为了保持兼容性而付出的代价往往是相当巨大的。而且稍有不慎,便会给用户数据带来损失。
TinyDB所要做的事情,便是在不需要BDE支持的前提下,给软件提供一个稳定的数据库系统,把逻辑格式和物理格式分开,并提供高效的压缩和加密功能,让软件开发者能方便而且快速地建立绿色、实用、稳定、安全的数据库程序。
关于TinyDB
软件名称:TinyDB
目前版本:2.0
软件性质:免费软件
开发平台:Windows9x/NT/2000
语言支持:Delphi, C++Builder 5.0 或更高版本
********************
MSHawk(憨憨) (2001-4-26 16:27:00) 得0分
老兄,我这儿有个东西可能能满足你的要求。
unit SingleLinkList;//单链表单元文件
interface
type
int = integer;
TSDLinkListRec = class//单链表数据类。
public
Next: TSDLinkListRec;
constructor Create;
end;
TSDLinkListMGR = class//单链表管理类。
private
FCount: integer;
public
Head: TSDLinkListRec;
constructor Create;
destructor Destroy;override;
function IndexOf(Index: integer): TSDLinkListRec;
function GetIndex(SL: TSDLinkListRec): int;
procedure Clear;virtual;
procedure Append(SL: TSDLinkListRec);virtual;
procedure Insert(Index, SL: TSDLinkListRec);virtual;
procedure Delete(SL: TSDLinkListRec);virtual;
procedure MovePrev(SL: TSDLinkListRec);
procedure MoveNext(SL: TSDLinkListRec);
property Count: int read FCount;
end;
implementation
constructor TSDLinkListRec.Create;
begin
inherited;
Next := nil;
end;
constructor TSDLinkListMGR.Create;
begin
inherited;
Clear;
end;
destructor TSDLinkListMGR.Destroy;
begin
Clear;
inherited;
end;
function TSDLinkListMGR.IndexOf(Index: integer): TSDLinkListRec;
var
T: TSDLinkListRec;
i: integer;
begin
i := 1;
Result := nil;
T := Head;
while T <> nil do
begin
if i = Index then
begin
Result := T;
Break;
end;
T := T.Next;
Inc(i);
end;
end;
function TSDLinkListMGR.GetIndex(SL: TSDLinkListRec): int;
var
P: TSDLinkListRec;
begin
Result := 0;
P := Head;
while P <> nil do
begin
Inc(Result);
if P = SL then
Exit;
P := P.Next;
end;
Result := 0;
end;
procedure TSDLinkListMGR.Clear;
var
T: TSDLinkListRec;
begin
T := Head;
while T <> nil do
begin
Head := T.Next;
T.Destroy;
T := Head;
end;
Head := nil;
FCount := 0;
end;
procedure TSDLinkListMGR.Append(SL: TSDLinkListRec);
var
T: TSDLinkListRec;
C: integer;
begin
T := SL;
C := 0;
while T <> nil do
begin
inc(C);
T := T.Next;
end;
if C = 0 then
Exit;
if Head = nil then
Head := SL
else
begin
T := Head;
while T.Next <> nil do
T := T.Next;
T.Next := SL;
end;
inc(FCount, C);
end;
procedure TSDLinkListMGR.Insert(Index, SL: TSDLinkListRec);
var
T, T1, T2: TSDLinkListRec;
C: integer;
begin
C := 0;
T := SL;
while T <> nil do
begin
inc(C);
T := T.Next;
end;
if C = 0 then
Exit;
if Head = nil then
Head := SL
else
begin
T := Head;
while T <> nil do
begin
if T = Index then
begin
T1 := T;
T.Next := SL;
T2 := SL;
while T2.Next <> nil do
T2 := T2.Next;
T2.Next := T1;
Break;
end;
T := T.Next;
end;
end;
inc(FCount, C);
end;
procedure TSDLinkListMGR.Delete(SL: TSDLinkListRec);
var
T: TSDLinkListRec;
begin
if SL = nil then
Exit;
if Head = SL then
begin
Head := SL.Next;
SL.Destroy;
end
else
begin
T := Head;
while T <> nil do
begin
if T.Next = SL then
begin
T.Next := SL.Next;
SL.Destroy;
Break;
end;
T := T.Next;
end;
end;
dec(FCount);
end;
procedure TSDLinkListMGR.MovePrev(SL: TSDLinkListRec);
var
P, C: TSDLinkListRec;
begin
if (SL = nil) or (SL = Head) then
Exit;
if Head.Next = SL then
begin
C := SL.Next;
SL.Next := Head;
Head.Next := C;
Head := SL;
end;
P := Head;
C := P.Next;
while (C.Next <> SL) and (C.Next <> nil) do
begin
P := C;
C := C.Next;
end;
if C.Next = nil then
Exit;
P.Next := SL;
C.Next := SL.Next;
SL.Next := C;
end;
procedure TSDLinkListMGR.MoveNext(SL: TSDLinkListRec);
var
P, C: TSDLinkListRec;
begin
if SL = nil then
Exit;
if Head = nil then
Exit;
P := Head;
C := P.Next;
while C <> SL do
begin
P := C;
C := C.Next;
end;
if C.Next = nil then
Exit;
C := SL.Next;
P.Next := C;
SL.Next := C.Next;
C.Next := SL;
end;
end.
以上是一个单链表的完整实现。包括两个类:之一是单链表中的存储数据的类。之二是对此单链表进行管理的类。在管理类中实现了一下操作:
1、APPEND操作:向链表中添加节点。
2、INSERT操作:向链表中插入节点。(插入的节点在INDEX节点后面。)
(注意:以上操作支持多节点。)
3、DELETE操作:删除链表中的一个节点。
4、MOVEPREV操作:将一个节点移动到其前一个节点前。
5、MOVENEXT操作:将一个节点移动到其后一个节点后。
6、INDEX操作:通过索引方式查找节点。
对此两个类的使用方法如下:
TUserRec = class(TSDLinkListRec)
private
FStatus: TUserStatus;//当前用户状态。
FUserID: Word;//用户ID。
FSpeakHandle: THandle;
procedure SetUserStatus(Value: TUserStatus);
procedure GeneralUserID;//产生用户ID。
procedure GeneralComEnCode;//产生用户加密密码。
public
UserName: TShortString;//用户名称。
FullName: TShortString;//用户全名。
PassWord: TShortString;//用户密码。
UserLevel: Word;//用户等级。数值越低,则权限越低。数值越高,则权限越高。
LoginSource: TLoginSource;//登录源。
LoginComputerUNC: string;//登录源计算机的UNC名。(统一命名规则。)
LoginTime, LogOffTime, ElapsedTime: string[16];//登录时间、取消登录时间以及登录持续时间。
ListenComCount, SpeakComCount: Word;//对话计数器。
ComEnCode: array [0..LenCode - 1] of Byte;//用户加密密码。
TimeOut, TimeNoLink: int;//客户未连接时间。当此时间减小到零时,将断开客户连接。以秒为单位。
property Status: TUserStatus read FStatus write SetUserStatus;
property UserID: Word read FUserID;
property SpeakHandle: THandle read FSpeakHandle write FSpeakHandle;
constructor Create;
destructor Destroy;override;
procedure ReadFromFile(var F: Text);
procedure WriteToFile(var F: Text);
end;
TUserMGR = class(TSDLinkListMGR)
DefaultUser: TUserRec;
Modifyed: Bool;
function FindUserByName(UserName, PassWord: TShortString): TUserRec;
function FindUserByDoMain(DoMain: string): TUserRec;
function FindUserByLoginSource(S: string): TUserRec;
function FindUserByID(ID: DWord): TUserRec;
procedure ReadFromFile(FileName: string);
procedure WriteToFile(FileName: string);
constructor Create;
destructor Destroy;override;
end;
以上的TUserRec类是关于用户的数据类,而TUserMGR类是对此用户链表的管理类。
在加入用户时,可以这样做:
var
User: TUserRec;
begin
User := TUserRec.Create;
User.UserName := '*****';
User.FullName := '*****';
......
Users.Append(User);
end;
在删除用户时,可以这样做:
var
User: TUserRec;
begin
User := TUserRec(Users.IndexOf(*));
Users.Delete(User);
end;
在遍历用户时,可以这样做:
var
User: TUserRec;
begin
User := TUserRec(Users.Head);
while User <> nil do
begin
......
User := TUserRec(User.Next);
end;
end;