怎样删除类型文件中的某条记录?(50分)

  • 主题发起人 主题发起人 Vinson
  • 开始时间 开始时间
V

Vinson

Unregistered / Unconfirmed
GUEST, unregistred user!
比如,类型文件中的记录结构如下:
TPersonRec=packed record
FirstName:String[20];
LastName:String[20];
Birthday:TdateTime;
Age:Integer;
end;
我们可以用如下代码增加一条记录:
var
PersonRec:TPersonRec;
DataFile:File of TPersonRec;
begin
AssignFile(DataFile,'PersonFile.Dat');
Reset(DataFile);
Seek(DataFile,FileSize(DataFile));
try
Write(DataFile,PersonRec);
Finally
CloseFile(DataFile);
end;
end;
但怎样删除一条记录呢?
 
我也想知道!
 
另外建一个文件,把你要删除的记录前的内容考入新文件,再把要删除的记录后的内容写入新
文件,再把源文件删除,再把新文件存成原来的名字,OK.
 
如果这个文件特别大呢?proman的方法也就不太适用了
 
几分钟之前刚答了一个这样的问题。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1046443
 
删除一条记录可获取当前记录位置,并把该位置后的记录逐个向前移动,文件在最后一条记录
停止.
1.获取当前位置currentrec:=stringgrid1.row-1,获取总行数:count:=filesize(DataFile);
2.for i:=currentrec+1 to count-1 do
begin
seek(DataFile,i);
read(DataFile,PersonRec);
seek(DataFile,i-1);
write(Datafile,PersonRec);
end;
3.删除整个文件的化truncate(datafile)
 
procedure TRecFile.DeleteButtonClick(Sender: TObject);
var
i: Integer;
begin
CurrentRec := StringGrid1.Row - 1;
if CurrentRec < 0 then Exit;
if MessageDlg('Delete Current Record ?', mtConfirmation,
[mbYes, mbNo], 0) = idYes then
begin
for I := CurrentRec + 1 to Count - 1 do
begin
seek(DataFile, i);
read(DataFile, PersonRec);
seek(DataFile, i - 1);
Write(DataFile, PersonRec);
end;
Truncate(DataFile);
Count := Count - 1;
ChangeGrid;//调整StringGrid1
end;
end;
 
如果StrigGrid有排序而且顺序有别于库中的记录怎么办?
 
记录里加一个删除标志
 
ChangeGrid的功能就是对记录文件的任何改动都要更新记录文件,因此可实现对记录的修改、
增加、删除等的操作。
 
同意ugvanxk的意见,
 
依据上面的方法,即使找到了具体的位置,删除也不是很容易的。

还有个办法,能不能在数据源上控制?

我很早以前做过类似的东西,是把数据写到一个链里面,如果数据有变动,就先

变化链,最后写入到文件中。

 
procedure DellRec(iNum: LongInt);
{删除记录}
var
i, iTmpNums : LongInt;
begin
iTmpNums := high(lRec);//得到总记录数
//从要删除的那一条开始循环
for i := iNum to iTmpNums do
begin
if i = iTmpNums then break;//到尾跳出
lRec := lRec[i + 1]; //记录上移
end;
//截取掉最后一条记录,总记录数减一,原先是0~iTmpNums共iTmpNums+1条,现在是iTmpNums条
SetLength(lRec, iTmpNums);
end;
 
多人接受答案了。
 
后退
顶部