c – 更改VCL组件内容的正确方法
作者:互联网
我经常在制作VCL程序时遇到这样的情况:
>我在表单上有许多组件,允许用户操作.最常见的是一堆编辑框.
>当用户手动输入内容时,需要通过OnChange事件验证这些编辑框的内容.
>表单上的其他位置,有一些组件可供用户单击以获取加载到编辑框中的一些默认值(在TEdit :: Text中).
现在我想要的是,每当用户在TEdit :: Text中输入内容时,OnChange事件必须处理用户输入.但是当我的程序将TEdit :: Text设置为默认值时,这不是必需的,因为我知道该值是正确的.
不幸的是,写代码如myedit-> Text =“Default”;触发OnChange事件.
我倾向于用我认为相当丑陋的方法解决这个问题:通过创建一个bool变量is_user_input,TEdit :: OnChange检查.如果是,则TEdit :: Text将被验证,否则将被忽略.但是,当然,这并不妨碍程序在不必要时启动TEdit :: OnChange.
是否有更好或更清洁的方法来实现这一目标?
有没有办法让OnChange检查谁叫它?或者我想,一种暂时禁用OnChange事件的方法会更好. TEdit :: Enabled似乎不会影响是否触发OnChange.
解决方法:
您可以暂时取消分配OnChange事件处理程序:
template <typename T>
void SetControlTextNoChange(T *Control, const String &S)
{
TNotifyEvent event = Control->OnChange;
Control->OnChange = NULL;
try {
Control->Text = S;
}
__finally {
Control->OnChange = event;
}
}
SetControlTextNoChange(myedit, "Default");
或者,RAII适合这种事情:
template <typename T>
class DisableChangeEvent
{
private:
T *m_control;
TNotifyEvent m_event;
public:
DisableChangeEvent(T *control);
{
m_control = control;
m_event = control->OnChange;
control->OnChange = NULL;
}
~DisableChangeEvent();
{
m_control->OnChange = m_event;
}
T* operator->() { return m_control; }
};
DisableChangeEvent(myedit)->Text = "Default";
标签:c,cbuilder,vcl 来源: https://codeday.me/bug/20190825/1716981.html