delphi – 结合OnValidate和OnBeforePost?

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

《delphi – 结合OnValidate和OnBeforePost?》

我想要实现以下目标:

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

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

我试过以下:

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

>专业:

>将无法发布无效数据
>如果用户无法填写表单,则可以使用DBNavigator继续工作并还原更改.

> Contra:

>当用户离开DBEdit时,不会显示警告
>(低优先级)所有验证必须在一个点上.如果验证直接在TField中完成,则更好的面向对象.

想法2:在OnValidate中抛出异常

>专业:

>无法发布无效数据.

> Contra:

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

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

>专业:

>可以发出警告,无法发布无效数据.

> Contra:

>检查必须实施两次(即使外包到一个函数中),开发人员可能会忘记这两个检查中的一个.此外,对于具有许多要验证的字段的大型项目,它会很快变得混乱.
>当用户在DBEdit中单击Post-Button时,他会收到两次消息(一次警告离开DBEdit,一次异常,因为帖子失败)
>如果数据库中的数据已经错误,则加载数据集时(例如,由于没有检查该值的旧程序版本),将允许发布帖子(如果用户未编辑该值本次会议)

有没有更好的办法?

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

点赞