在以前DOS版本下用过,比较繁。
修改:先寻找到该记录(不惜一切手段),用SEEK定位该记录的位置(可能要用到filepos),
再写到文件中(用WRITE)。
当然,文件最后用记录型的文件file of TMyRecord。
删除:可以借鉴Foxpro2.5 for Dos的数据表中伪删除的方法,在记录中做个删除记号,
真正删除时可以再物理删除这些记录,当然真正删除也是没有办法,除了用循环
复制有用的记录外。
修改:先寻找到该记录(不惜一切手段),用SEEK定位该记录的位置(可能要用到filepos),
再写到文件中(用WRITE)。
当然,文件最后用记录型的文件file of TMyRecord。
删除:可以借鉴Foxpro2.5 for Dos的数据表中伪删除的方法,在记录中做个删除记号,
真正删除时可以再物理删除这些记录,当然真正删除也是没有办法,除了用循环
复制有用的记录外。
修改:先寻找到该记录(不惜一切手段),用SEEK定位该记录的位置(可能要用到filepos),
再写到文件中(用WRITE)。
当然,文件最后用记录型的文件file of TMyRecord。
删除:可以借鉴Foxpro2.5 for Dos的数据表中伪删除的方法,在记录中做个删除记号,
真正删除时可以再物理删除这些记录,当然真正删除也是没有办法,除了用循环
复制有用的记录外。
Windows也不要了,那多大啊!那多慢啊!
Linux也不能要,你应该直接在裸机上作。
另外请问问题是注意标题,别人总不能用“小要求”为关键字来搜索你的帖子吧?!
·无须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 或更高版本
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;implementationconstructor 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;