【问题标题】:What is the proper way to handle a yes/no Message Dialog when leaving a text field?离开文本字段时处理是/否消息对话框的正确方法是什么?
【发布时间】:2014-12-04 22:22:35
【问题描述】:

我的问题标题可能有点误导;如果是这样,我很抱歉。我不确定如何更好地命名它。

我正在尝试将地址验证的地理编码添加到 Delphi 7 表单(使用 CLX 构建),但我遇到了一些问题。详情如下:

  • 用户应按顺序在地址字段中输入数据 - 地址、城市、州、邮政编码。
  • 离开邮政编码字段后,将立即调用地址验证。 (用户规范。)
  • 如果返回的地址无效,用户将获得一个是/否选择,询问是否更正给定地址。 (用户规范)
  • 如果是,请将焦点重置到相应的字段(地址、城市、州、邮编),如地理编码 api 的结果所示。否则,继续下一个字段。

退出是/否对话框后,鼠标的行为似乎有点古怪。单击一次,看起来好像以前的表单(应该在此时关闭)正在接收焦点 - 该表单上的点击事件能够更改此表单上的某些值(预加载数据),并且如果单击鼠标,这些值将更改。禁用 on-click 事件只是意味着在新表单上单击鼠标一次没有执行任何操作,然后单击行为返回到预期的行为。

在研究这个问题时,我在网上看到了几件事;这些的共识是我的问题是邮政编码字段的 OnExit 事件内的消息对话框的结合。 (如果我理解正确阅读的内容,MouseUp 事件似乎在两个窗口之间迷路了。)

如果我有自己的方式,我会手动按下按钮来运行验证。鉴于最终用户的限制将我束缚在我没有该选项的情况下,处理这种情况的最佳方法是什么?

【问题讨论】:

  • @KenWhite:这对 VCL 来说通常是正确的,但它也适用于 CLX 吗?
  • @Remy:我很确定同样的解决方案(尤其是 Sertac 的答案)适用,但我没有任何方法可以在 CLX 上对其进行测试。如果发帖人编辑表明他们已经看到并尝试过该帖子的解决方案但它不起作用,我将撤消重复的关闭投票。
  • @KenWhite:试过了 - PostMessage 不适用于 CLX 表单,因为它要求句柄是 HWND 值,而 CLX 不使用该值。尝试通过使用 Self.Dispatch(Msg) 来解决这个问题,这是我能找到的 PostMessage 调用的最佳替代品,但该方法仍然产生相同的错误行为。
  • 具体来说,请查看 NGLN 对链接问题的answer,它具有 PostMessage 的替代方案,应该在 CLX 中正常工作。该答案不被接受(它没有绿色复选标记),但它仍然应该解决您遇到的问题。
  • 因此我推荐一种不同的方法。而不是在数据验证失败后显示对话框消息,只需更改其中包含错误数据的字段的背景颜色,以便可以轻松看到错误(亮红色很容易注意到)。但是不要改变焦点,这样您仍然可以让职员继续在其余字段中输入数据而不会中断。您可以播放声音以向用户发出声音警告,提示他输入了错误的数据。但最后要确保用户不能离开此表单而不会再次被错误数据警告。 ...

标签: delphi delphi-7 clx


【解决方案1】:

理想情况下,您可以让 zip 字段的 OnExit 事件使用 TThread.Queue() 将消息对话框延迟到 OnExit 首先退出之后。唉,TThread.Queue() 直到 Delphi 8 才引入。所以OnExit 将不得不使用等效的方法,例如向自己发布一条自定义异步消息或启动一个短的一次性计时器,以触发延迟操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2010-11-27
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多