gpt4 book ai didi

delphi - 结合 OnValidate 和 OnBeforePost?

转载 作者:行者123 更新时间:2023-12-03 15:34:41 26 4
gpt4 key购买 nike

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

enter image description here

我想实现以下目标:

  1. 当用户在 DBEdit 中输入错误并想要切换到另一个控件时,应该显示警告,但他可以继续工作。
  2. 当用户想要发布数据集时,该发布将被拒绝,并再次显示警告。

问题是,OnValidate 只是一个 TFieldNotifyEvent,因此无法告诉应用程序编辑是否有效,因此无法在发布之前检查所有内容是否有效。

我尝试过以下操作:

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

  • 优点:
    • 无效数据不会发布
    • 如果用户无法完成表单,可以继续工作并使用 DBNavigator 恢复更改。
  • 反对:
    • 用户离开 DBEdit 时不显示警告
    • (低优先级)所有验证都必须在一个点上。如果验证直接在 TField 中完成,则更好的面向对象。

想法2:在OnValidate中抛出异常

  • 优点:
    • 不可能发布无效数据。
  • 反对:
    • 如果用户无法输入有效的内容(例如,因为他不知道要输入什么),他可能会陷入无限循环,甚至无法按 DBNavigator 上的“恢复”按钮!在这种情况下,他必须使用任务管理器终止应用程序,这对于用户友好性来说是最坏的情况。

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

  • 优点:
    • 可能会发出警告,并且无法发布无效数据。
  • 反对:
    • 该检查必须实现两次(即使外包到一个函数中),并且存在开发人员可能忘记这 2 次检查中的 1 次的风险。此外,对于需要验证许多字段的大型项目,它很快就会变得困惑。
    • 当用户在 DBEdit 中单击 Post-Button 时,他会收到两次消息(一次是离开 DBEdit 时发出警告,另一次是因为发布失败而出现异常)
    • 如果数据库中的数据已经错误,则在加载数据集时(例如,由于较旧的程序版本未检查该值),将允许发布(如果用户未在此 session 中编辑该值)

有更好的方法吗?

最佳答案

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

关于delphi - 结合 OnValidate 和 OnBeforePost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35032857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com