Delphi “光标位于BOF位置”错误

Delphi “光标位于BOF位置”错误,delphi,accuracerdb,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,[m

在删除表格之前,我有:

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


编辑:上面的全部代码:

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

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

更一般地说,当调用事件代码时,人们常常试图在数据集事件中执行不适合数据集所处状态的操作,从而给自己制造问题。TDataSet有一个非常精心设计的操作逻辑流,对于没有经验的粗心大意的程序员来说,在TDataSet事件中做一些不应该发生的事情来破坏它的逻辑太容易了:一个例子是在事件中调用Delete。另一个经常遇到的问题是执行代码,将数据集的光标移动到一个事件中,该事件被称为移动光标的结果,如AfterScroll事件f.i

没有简单的规则来说明在dataset事件中应该做什么和不应该做什么,但一般来说,当您发现发生意外事件时,您采取的任何试图更改dataset的状态属性(请参阅OLH中的TDataSetState)的操作都应该是您的主要怀疑对象

我假设另一条一般规则(OLH中的事件描述中通常可以清楚地看到例外情况)是,数据集事件通常应用于对事件作出反应,方法是对其他对象执行某些操作,例如更新状态面板,而不是对数据集执行某些操作。F.i.当数据集的光标移动时,Aftercroll事件对于响应更改非常有用。例外情况是类似BeforePost的事件,其目的是让您有机会验证对数据集字段的更改


顺便说一句,您可以从BeforeDelete事件内部调用Abort,它将阻止删除。然而,依国际海事组织的说法,检查删除是否应该进行,并在进行之前对其后果进行计划和编码,而不必中途退出,这样做更干净、更整洁。因此,恕我直言,我不同意另一个答案。决定是否过桥的时间是在你开始之前,而不是在你已经过桥一半的时候。当然是Ymmv。

问题在正确的地方。在删除之前提问是错误的,因为它迫使你在每次调用delete时都要提问。更正确的答案是,如果用户不想删除,请在OnBeforeDelete中中止此处的删除。

我们需要关于您的代码、错误和用例的更多信息。这就是所有代码。在删除表格之前,没有其他内容了。只是一个简单的提示。我认为问题在于您在事件OnBeforeDelete中调用Delete?记录已在删除过程中。不要那样做。在开始删除之前获得用户的确认。不确定我是否了解您Martyn…提示是在删除记录之前。它还能去哪里?当然还有更多的代码。最重要的是,你把这叫做什么?在什么程序中?这个过程叫什么?Martyn只是假设可能有什么问题,因为您没有提供足够的代码上下文。它迫使你每次打电话删除时都要问这个问题——对不起,当然不是。事实上,恰恰相反。如果它在BeforeDelete中,它总是被询问,而你可以选择何时打电话。Delete。我看到你以前强调过。该事件称为OnBeforeDelete。这不是活动的目的吗,在之前做些事情吗?包括guards?TDataSet没有OnBeforeDelete事件,称为BeforeDelete。是的,它是在删除之前做的事情。我只是说,在我看来,这不是防止删除的正确地方。相反,如果你认为你需要的话,事先得到用户的确认。我没有说我的答案是WTG,你说了。我说了一个更正确的答案,这仍然是我的观点。BeforeDelete不是删除的一部分,BeforeDelete也用于验证。重要的是@user763539了解事件的工作方式和可使用性。