BookMark的疑问(100分)

  • 主题发起人 主题发起人 林旭斌
  • 开始时间 开始时间

林旭斌

Unregistered / Unconfirmed
GUEST, unregistred user!
一个非常奇怪的问题,找了一些书也没找到答案,请各位帮忙看看:
环境:delphi 4+Access97

DAtamoduel中添加了一个Tquery控件:Query_Cpmx
为防止用户任意修改,将RequestLive设为False

用户界面中有两个按钮:Add 添加记录
Del 删除记录

代码如下:
procedure TFormCpmc.AddClick(Sender: TObject);
begin
datamodule1.Query_Cpmx.Close;
datamodule1.Query_Cpmx.RequestLive:=true;
datamodule1.Query_Cpmx.Open;
datamodule1.Query_Cpmx.Edit;
datamodule1.Query_Cpmx.Append;
end;

procedure TFormCpmc.DELClick(Sender: TObject);
var
BookMk:Tbookmark;
begin
if Datamodule1.Query_Cpmx.FieldbyName('P_bz').AsString<>'1' then
begin
BookMk:=Datamodule1.Query_Cpmx.GetBookmark;
datamodule1.Query_Cpmx.Close;
datamodule1.Query_Cpmx.RequestLive:=true;
datamodule1.Query_Cpmx.Open;
Datamodule1.Query_Cpmx.GotoBookmark(BookMk);
Datamodule1.Query_Cpmx.delete;
datamodule1.Query_Cpmx.Close;
datamodule1.Query_Cpmx.RequestLive:=false;
datamodule1.Query_Cpmx.Open;
end
else
Messagedlg('该 名 称 已 被 使 用 ,'+#13+#13+'不 将 其 能 删 除!',mtWarning,[mbOk],0);
end;

Query_Cpmx的Afterpost

procedure TDataModule1.Query_CpmxAfterPost(DataSet: TDataSet);
begin
datamodule1.Query_Cpmx.Close;
datamodule1.Query_Cpmx.RequestLive:=false;
datamodule1.Query_Cpmx.Open;
datamodule1.Query_Cpmx.First;
end;

问题是这样的:

当记录数不多时删除无问题,当记录数达到数百(不超过300具体临界值没能找到)时,第一
次删除最后一条记录时无问题,再次删除最后一条记录时,系统提示:'General SQL error,
无效的书签,Table'.此时在DBGrid中的数据可以任意修改,再按删除时无问题;如果从第一条
记录逐条删除不会有问题;
当添加记录后,再删除最后一条记录时也会出现上述问题.

请问,问题出在哪里,别告诉我用别的方法,现在我已经通过其他方法解决该功能的实现,只是想
知道为什么会有这个现象,谢谢!
 
BookMark只是保存了数据集的指针,相当于保存了一个地址。当你的数据集关闭后再
打开,其数据集开辟的内存地址是不一样的,也就是说,保存的标签,在关闭后再打开的
数据集上是无意义的(地址已改变)。
而小数据集为什么不会出错,是因为,一个小数据集需要的内存块较小,关闭数据集
后再打开,他还会使用原来的内存块;但是大数据集需要内存较多,关闭后再打开,可能
要重新组织内存,所以内存的地址就会改变,导致原来的标签指向了一个错误的地方,所
以标签无效。
 
你在GETBOOKMARK时有时到了文件尾(EOF),你的程序里并没有骓验证。所以在得到书签时应该判断记录是否有效。
你对一个空库做删除时应该得到一样的错误,没试!
 
To: menxin
这段程序应当怎样改才不会出错?
 
To menxin:
GETBOOKMARK应该无法保存BOF/EOF的指针吧。
 
谢谢!

To:TYZhang 我也在南京,只不过不是富翁,而且也不是以做软件为业.
 
后退
顶部