Delphi 验证模式对话框字段的最佳方法?

Delphi 验证模式对话框字段的最佳方法?,delphi,validation,winapi,dialog,modal-dialog,Delphi,Validation,Winapi,Dialog,Modal Dialog,我经常需要有模式对话框来编辑属性或应用程序配置设置,但我对如何验证属性或应用程序配置设置并向用户展示验证结果并不满意 选择和工具通常包括:- 设计用户界面,使无效的选择 是完全不可能的-即使用 “蒙版编辑”,范围限制为 旋转编辑 尝试捕捉错误,因为它们是错误的 已找到-即时对话框或 当用户拥有无效的 在某处输入的值(尽管, 因为这可能是由于 输入不完整,这可能是错误的 视觉干扰) 在更改数据时检测错误 控制焦点 确定时验证整个对话框 按下,并显示信息 显示问题所在的方框 No.4通常是最简单、最

我经常需要有模式对话框来编辑属性或应用程序配置设置,但我对如何验证属性或应用程序配置设置并向用户展示验证结果并不满意

选择和工具通常包括:-

  • 设计用户界面,使无效的选择 是完全不可能的-即使用 “蒙版编辑”,范围限制为 旋转编辑

  • 尝试捕捉错误,因为它们是错误的 已找到-即时对话框或 当用户拥有无效的 在某处输入的值(尽管, 因为这可能是由于 输入不完整,这可能是错误的 视觉干扰)

  • 在更改数据时检测错误 控制焦点

  • 确定时验证整个对话框 按下,并显示信息 显示问题所在的方框

  • No.4通常是最简单、最快的代码,但我从来都不喜欢它

    你发现了什么好的技巧来处理这个问题


    虽然这个问题相当普遍,但理想的答案很容易在Delphi for Win32中实现…

    我认为N°4是进行验证的最佳方式,除了是最容易和最快的编码方式外,您的所有验证逻辑都在同一个位置,因此如果您需要连接到数据库,比较2+输入,等等。。。每件事只做一次

    而:

    N°1:在某些情况下,这可能是一场噩梦&更新

    N°2/3:您必须了解与验证、输入更改、焦点等相关的所有UI事件…->繁重的编码和难以调试

    一切都一样,这取决于:我试着从用户的角度来看其中的一些

    第一。我个人不喜欢掩码编辑,但是像旋转编辑的范围限制、预填充的组合框等对于一般的健全性检查很有意义,并且它使用户的生活更轻松

    我认为第二点可能会让用户使用对话框感到痛苦。他们可能不会按照您认为的顺序输入信息,或者可能会留下一个不完整的字段,并在最后返回

    为了验证,我使用了3和4的组合

    根据字段(例如所需值),我可能会在每次按键时对其进行验证,如果无效,则禁用OK按钮。您可以选择更改坏字段的颜色,或者使用其他类型的可见验证器控件。这对用户来说是显而易见的,不会打断他们的“流程”


    当用户点击OK时,不容易在运行中检查的事情(例如,对服务器的调用)会被执行一次。

    JVCL提供了一个用于验证输入的组件集(TJVValidator等)。它标记没有有效输入的字段,并在用户将鼠标移到该标记上时向用户显示提示。(我想我在dotNET上读到过类似的功能,但我从未使用过。)


    虽然我喜欢这个概念,并且在许多对话框中实际使用了这些组件,但我不太喜欢这个实现:它占用了大量的cpu使用,JVCL附带的预定义验证器并没有真正发挥作用。当然,有了对jvcl svn存储库的访问权,我可以停止抱怨,开始改进组件…

    别忘了看看Jim的精彩代码会话:

    他有一句关于输入验证的诗句…

    IMO,选项1应该作为一个理所当然的事情来完成,而不是可选的,并且界面尽可能简化,同时仍然允许用户输入应用程序所需的细节。不过,我不喜欢使用蒙面编辑。例如,如果我希望用户输入一个数字,我将只使用一个文本框,然后在保存字段值时尝试解析该数字

    对于直接验证,我只使用#4,除非有特殊情况需要使用其他方法之一。如果我的用户改变主意,我喜欢让他们修改他们的输入,这样他们就可以犯错误,回去自己修复,因为他们已经知道他们的输入中有错误。如果可能的话,我会帮助他们解决问题(例如,如果表单字段为空或无效,他们点击OK,我会在显示错误消息后聚焦/选择有问题的字段)


    在Windows窗体应用程序中执行#2很少能够独立完成,因此我将完全避免将其作为验证的主要手段。但是,它可以与#4有效地结合起来,但我认为在大多数情况下,这会有点过分。

    只是一个观察,但我看到很多用户填充对话框(特别是复杂的对话框),他们不使用TAB键。他们倾向于在“思考”答案或阅读不同文档时单击编辑组合单选按钮。这个订单将与您想象的不一样!我们作为程序员希望是合乎逻辑的(船长,斯波克说),但用户很好

    一种很好(但需要努力)的方法是让每个编辑器在更改或退出时进行自我验证,如果无效,只需更改颜色即可。“OK button”代码中的例程只需迭代控制列表,并将焦点设置为第一个报告自己为“无效”的控件,直到没有一个控件这样做


    我在航空业工作,专注于信用卡业务,我有TTicketNumber Edit、TCardNumber Edit、TExpiryDateEdit、TFormOfPaymentEdit等。这些功能都很好,因为在某些功能中,验证并不简单。如前所述,您需要在早期投入精力,但在复杂的对话框中会得到回报。

    与验证问题没有直接关系。我在几乎所有的项目中都使用模态对话框。很多功能是通用的,所以创建一个自定义对话框是有意义的,我的模态对话框都是从该对话框继承的。除了一致性,它还让我在匆忙中避免走“捷径”和拼凑快速而肮脏的对话。