【发布时间】:2014-03-07 13:46:12
【问题描述】:
我在做 VCL 程序的时候经常会遇到这样的场景:
- 我在表单上有许多组件,允许用户摆弄。最常见的是一堆编辑框。
- 当用户手动输入内容时,这些编辑框的内容需要通过 OnChange 事件进行验证。
- 在表单的其他位置,用户可以单击某些组件以将一些默认值加载到编辑框(在 TEdit::Text 中)。
现在我想要的是,每当用户在 TEdit::Text 中键入内容时,OnChange 事件必须处理用户输入。但是当我的程序将 TEdit::Text 设置为默认值时,这不是必需的,因为我知道该值是正确的。
不幸的是,编写myedit->Text = "Default"; 之类的代码会触发 OnChange 事件。
我倾向于用我认为相当丑陋的方法来解决这个问题:通过创建一个布尔变量is_user_input,TEdit::OnChange 会检查它。如果为真,则 TEdit::Text 将得到验证,否则将被忽略。但是当然,这并不妨碍程序在不必要的时候启动TEdit::OnChange。
有没有更好或更清洁的方法来实现这一点?
OnChange 有没有办法检查谁调用了它?或者我想,暂时禁用 OnChange 事件的方法会更好。 TEdit::Enabled 似乎不会影响 OnChange 是否被触发。
【问题讨论】:
-
您不认为验证也适用于您的默认值是件好事吗?如果您决定在某个时候更改默认值,并错误地将其设置在合法范围之外怎么办?
-
@barakmanos 通常,是的。但通常存在多个组件与同一组私有变量相关的情况。所以我让所有组件从它们各自的 OnChange 中调用相同的“更改”设置器函数。现在假设我还想在内部更改此变量 - 然后我必须更新所有组件以反映更改。如果我这样做,他们会一遍又一遍地自动触发 OnChange 并启动“更改”功能。所以有了这样的设计,我最终会得到奇怪的循环依赖。加上毫无意义的执行延迟。
标签: c++ c++builder vcl