【问题标题】:'cursor is in BOF position' error'光标在 BOF 位置' 错误
【发布时间】:2015-08-20 14:22:04
【问题描述】:

在删除我的表之前打开:

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。

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

【问题讨论】:

  • 我们肯定需要更多关于您的代码、错误和用例的信息。
  • 这就是所有的代码。在删除表之前没有更多内容。只是一个简单的提示。
  • 我认为问题在于你在一个事件(OnBeforeDelete?)中调用 Delete ,其中记录已经在被删除的过程中。不要那样做。在开始删除之前获得用户的确认。
  • 不确定我是否关注你Martyn...提示是在删除记录之前。还能去哪里?
  • 当然还有更多代码。最重要的是,你在什么时候调用这个?在什么程序?那个程序是怎么调用的? Martyn 只是假设可能出了什么问题,因为您没有为代码提供足够的上下文。

标签: delphi accuracerdb


【解决方案1】:

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

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

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

没有简单的规则来说明您应该在数据集事件中做什么和不应该做什么,但一般来说,您尝试更改数据集的 State 属性的任何操作(请参阅 OLH 中的 TDataSetState)都应该是您的主要嫌疑人当你发现有意想不到的事情发生时。

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

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

【讨论】:

    【解决方案2】:

    问题来对地方了。在删除之前询问是错误的,因为它会迫使您每次调用 Delete 时都询问问题。如果用户不想删除,更正确的答案是在 OnBeforeDelete 中中止删除。

    【讨论】:

    • " 每次调用 Delete 时都会强制您提出问题" - 抱歉,当然不会。实际上,恰恰相反。如果它在 BeforeDelete 中,它总是会被询问,而您可以选择何时调用 .Delete。
    • 我看到你强调之前。该事件称为 OnBeforeDelete。这不就是活动的目的,做之前的事情吗?包括警卫?
    • TDataSet 没有“OnBeforeDelete”事件,它被称为 BeforeDelete。是的,它是在删除之前做的事情。我只是说 imo 这不是防止删除的正确位置。相反,如果您认为需要,请事先获得用户的确认。
    • 我没有说我的答案是WTG,你说了。我说一个更正确的答案,这仍然是我的观点。 BeforeDelete 不是“部分完成” 删除,BeforeDelete 也用于验证。重要的是@user763539 了解事件的工作方式和使用方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2014-08-11
    • 2018-09-16
    • 1970-01-01
    相关资源
    最近更新 更多