结合OnValidate和OnBeforePost?

时间:2016-01-27 09:03:12

标签: delphi

例如,我有一个带有DBNavigator和一些DBEdits的表单。

enter image description here

我想要实现以下目标:

  1. 当用户在DBEdit中输入错误并想要切换到另一个控件时,应显示警告,但他可以继续工作。
  2. 当用户想要发布数据集时,帖子将被拒绝,警告将再次显示。
  3. 问题是,OnValidate只是一个TFieldNotifyEvent,因此无法告诉应用程序编辑是否有效,因此在发布之前无法检查所有内容是否有效。

    我试过以下:

    想法1:让OnBeforePost验证并抛出异常

    • 临:
      • 无法发布无效数据
      • 如果用户无法填写表单,则可以使用DBNavigator继续工作并还原更改。
    • 魂斗罗:
      • 当用户离开DBEdit
      • 时,不会显示警告
      • (低优先级)所有验证必须在一个单一点。如果验证是直接在TField中完成的,那么更好的面向对象就是这样。

    创意2:在OnValidate中抛出异常

    • 临:
      • 无法发布无效数据。
    • 魂斗罗:
      • 如果用户无法输入有效的内容(例如因为他不知道要输入什么内容),用户可能会无限循环,并且他甚至无法按下DBNavigator上的“Revert”按钮!在这种情况下,他必须使用任务管理器终止应用程序,这是一个关于用户友好性的最坏情况。

    创意3:在OnValidate中显示(非异常)警告,并在OnBeforePost中再次验证(并抛出异常)

    • 临:
      • 可以发出警告,无法发布无效数据。
    • 魂斗罗:
      • 检查必须实施两次(即使外包到一个函数中),开发人员可能会忘记这两项检查中的一项。此外,对于需要验证的许多字段的大型项目,它会很快混淆。
      • 当用户在DBEdit中点击后按钮时,他会收到两次消息(一次警告离开DBEdit,一次异常,因为帖子失败)
      • 如果数据 已在数据库中出错,则在加载数据集时(例如由于未检查该值的较旧程序版本),将允许该帖子(如果用户没有编辑此会话中的值)

    有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

在我看来,您正在将业务逻辑(数据验证)与UI(OnValidate)混合在一起。分开他们。将所有业务逻辑放在单独的函数或对象中。可能甚至值得实现MVC模式。但在这种情况下,您必须使用ORM框架+ LiveBindings替换DB控件。

答案 1 :(得分:0)

我找到了解决方案并将其发布在此处:

https://www.viathinksoft.de/?page=codelib&showid=131

当我有更多时间时,我会翻译解释文本。