'光标处于BOF位置'错误

时间:2015-08-20 14:22:04

标签: delphi accuracerdb

在删除表之前我有:

procedure TData_Module.MyTableBeforeDelete(DataSet: TDataSet);
begin    
if MessageDlg('Are you sure you want to delete the record written by '+
                  QuotedStr(MyTable.FieldByName('written_by_who').AsString),mtConfirmation,[mbYes,mbNo],0) = mrYes then
    MyTable.Delete;
end;

然而,在尝试时我收到错误: ...光标位于BOF位置

怎么回事?数据库是Accuracer。

编辑:上面的整个代码:)

2 个答案:

答案 0 :(得分:3)

正如我在评论中所说,它听起来像你在数据集的BeforeDelete事件中调用Delete一样。不要这样做,因为在数据集已经在删除记录的过程中发生BeforeDelete事件。所以你删除它就是从数据集的内置代码中拉出地毯。

因此,如果您想要用户确认,请在调用Delete之前获取它,而不是在BeforeDelete事件中。顺便说一句,标准的TDBNavigator有一个与其集成的DeleteRecord按钮相关联的ConfirmDelete属性,它将完全执行该操作,即向用户弹出确认提示。

更一般地说,人们经常通过尝试在数据集事件中执行不适合调用事件代码时数据集所处状态的操作来为自己创建问题。 TDataSet在其操作中有一个非常精心设计的逻辑流程,对于那些没有经验的粗心的程序员来说,通过在不应该存在的TDataSet事件中做一些事情来破坏它的逻辑是非常容易的:一个例子就是在内部调用Delete一个事件。另一个经常遇到的问题是执行代码,该代码将数据集的光标移动到由于移动光标而调用的事件内,如AfterScroll事件,f.i。

在数据集事件中没有简单的规则来说明你应该和不应该做什么,但一般来说,你试图改变数据集的State属性(参见OLH中的TDataSetState)所采取的任何行动应该是你的主要嫌疑人当你发现意外事件正在发生时。

我认为另一个一般规则,通常从OLH中的事件描述清楚的例外情况是,数据集事件通常应该用于通过对某个其他对象执行某些操作来对事件做出反应,例如更新状态面板而不是做一些数据集。 F.i. AfterScroll事件对于在移动数据集的光标时对更改做出反应非常有用。例外情况是像BeforePost这样的事件,旨在让您有机会做事(比如验证对数据集字段的更改)。

顺便说一下,你可以在BeforeDelete事件中调用Abort,它会阻止删除。但是,imo,检查删除是否应该继续进行并且在继续进行之前计划和编码其后果而不是必须退出部分是更干净和更整洁。所以,尊重,我不同意另一个答案。决定是否越过桥梁的时间是在你开始之前,而不是当你已经跨越它的时候。 Ymmv,当然。

答案 1 :(得分:0)

问题出在正确的地方。在删除之前询问是错误的,因为它会强制您在每次调用删除时提出问题。更正确的答案是在 OnBeforeDelete 中中止删除,如果用户不想删除。