mfc CEdit 啥时候应该进行验证?

Posted

技术标签:

【中文标题】mfc CEdit 啥时候应该进行验证?【英文标题】:mfc CEdit when should I do validation?mfc CEdit 什么时候应该进行验证? 【发布时间】:2017-07-23 23:56:29 【问题描述】:

那么根据标题,我应该什么时候对 CEdit(文本框)进行验证?

背景:我被调到我们公司的一个新开发组,他们的做法是按 Enter,那时他们在 CEdit(mfc 对话框)上进行验证。而我来自 .net,特别是来自 WinForms,那里有 ValidatedValidating 事件,每个开发人员都会看到并意识到这是您应该进行验证的正确事件。

我的详细问题是:

我应该按照他们的做法(按 Enter 键)吗? 或者我想到的是使用EN_KILLFOCUS(与上述事件密切/相关)?或者两者都不正确,是否有更适合验证的事件?

我需要你的建议,因为如果我的共同开发人员被问及,他们都会立即说我应该在按下 Enter 后处理验证。谢谢!

【问题讨论】:

【参考方案1】:

即使在我的公司,我们也有两个聚会。

第一方严格说只有在按下 Enter 时才会验证信息,所以在所有信息可用的那一刻。如果你有一堆相互影响的信息,这种方法很容易。 MFC DoDataExchange 方法是他们的最爱。

第二方说:必须尽早验证信息。我认为当每个值几乎是独立的时,这种方法是可以的。在这种情况下,您检查 EN_CHANGE 或 EN_KILLFOCUS 上的所有数据并禁用 OK 按钮,直到所有数据都有效。

第二种方法的缺点是你必须在输入数据的那一刻给用户更多的信息,引导他更正数据。第一种方法可能会在一条错误消息中解释问题。

我在我的程序中使用这两种方法。在大多数情况下,我们使用第一种方法,因为我们发现,带有详细信息的综合错误消息更易于维护和用户理解,例如当他们看到一个对话框时无法访问启用的 OK 按钮。 ..

顺便说一句:我讨厌可以输入负数的对话框,其中只允许输入正数。始终使用您可以获得的正确和最佳输入字段以获得最佳指导。所以按回车后说“超出范围”的MFC方法不是一个好的解决方案。如果您有最小值和最大值,您甚至可以在用户输入后直接更正该值。

但这个答案和问题往往是基于意见的。

【讨论】:

【参考方案2】:

无论您决定做什么,都应尽量减少对用户工作流程的干扰。同时,您需要与用户对验证行为的期望保持一致。不要让你的偏见影响对话行为,从而导致用户混淆,或者额外的时间使用对话。要记住的最重要的事情是与您采取的任何方法保持一致。

【讨论】:

【参考方案3】:

1) MFC 为许多数据类型提供验证工具。这取决于您要在该控件中输入的数据类型。这可以使用这个设施吗?

在我看来,EN_KILLFOCUS 是一个更好的选择,因为如何验证用户是否没有按 Enter 键并按 Tab 键移动到下一个控件?您仍然可以与您的同行讨论这个问题,并得出结论哪个是处理验证的更好地方。

【讨论】:

WM_KILLFOCUS is the wrong time to do field validation. 我提到了 EN_KILLFOCUS 而不是 WM_KILLFOCUS。当编辑控件失去键盘焦点时发送 EN_KILLFOCUS。编辑完就验证不正确吗? 如果确实是“编辑完成后立即发送”,那将是正确的。我发布的链接解释了为什么消息可能发送得太晚。此外,一旦编辑完成就验证输入仍然是错误的方法,因为它使界面可能更难使用。有时,用户会输入暂时无效的数据(例如,日期选择器,设置为 2 月;现在用户希望输入 1 月 31 日;一旦输入 31,输入验证将丢弃输入,因为 - 嗯 - 二月没有 31 天)。 验证输入最合适的方法是禁用OK/Accept按钮,只要输入无效,并突出显示验证失败的输入。验证应该是非侵入性的,并且永远不会干扰用户尝试输入数据。 同意,这就是为什么在用户输入数据后立即尝试验证。当用户移动到下一个控件时,是验证数据的好时机,因此请在 EN_KILLFOCUS 上进行。

以上是关于mfc CEdit 啥时候应该进行验证?的主要内容,如果未能解决你的问题,请参考以下文章

MFC输入框CEdit控件十六进制转换

我应该使用啥 SSL URL 进行 Azure 门户身份验证

DDV_MinMaxUInt :自定义验证消息

MFC CEdit 将非 ascii 字符转换为 ascii

MFC:更改 CEdit 的颜色

MFC - 是不是可以为除 CEdit 之外的任何其他控件显示气球提示?