DBEdit与Onclick事件的小疑问,无法理解
现在我的窗口里有两个为DBEdit1与DBEdit2,我想实现的是互斥按钮的效果,如点击DBEdit则赋值为"√",表示已选择,我是在两个DBEDit1与DBEdit2的onclick事件,都同时指向同一个DBEditClick函数如下:
void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString asTempDBEditName = ((TDBEdit *)Sender)->Name;
AnsiString asDBEditContent;
if ( ((TDBEdit *)Sender)->Text == "" )
((TDBEdit *)Sender)->Text = "√";
else
((TDBEdit *)Sender)->Text = "";
if ( asTempDBEditName == "DBEdit1" || asTempDBEditName == "DBEdit2"){
int sum = (DBEdit1->Text == "√") + (DBEdit2->Text == "√");
if( sum != 0 ){ //如果两个都没选择,则不处理,否则,先清空再赋值
DBEdit1->Text = "";
DBEdit2->Text = "";
((TDBEdit *)Sender)->Text = "√";
}
}
}
上面的代码,运行可以实现互斥了,但现在有个小问题,如,
1.先点击DBEdit1,
2.再点击DBEdit2,可以实现互斥的效果,此时DBEdit2打上勾了,
3.点击DBEdit2,将勾取消,此时两个勾都没了,
4.第四步,当我接着点击DBEdit1时,这个勾打不上,
我单步调试时,发现,在第四步单击DBEdit1时,还没进入DBEditClick事件,就已经被赋值为"√",接着在DBEditClick就会将其作为原来是打勾的,故又赋值为"",从而出现打勾打不上的情况,我所不理解的事情就是在第四步的时候,原来DBEdit1为空的,点击时,还没进入DBEditClick事件,为什么就已经被赋值为"√"
讲得有点啰嗦,求论坛各位指教下。。。。。。
[解决办法]
经测试,第四步没有发现你说的情况
[解决办法]
废话不说,直接上码
void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString asTempDBEditName = ((TDBEdit *)Sender)->Name;
if (asTempDBEditName=="DBEdit1")
{
if (DBEdit1->Text == "√")
{
DBEdit1->Text == "";
}
else
{
DBEdit1->Text == "√";
DBEdit2->Text == "";
}
}
else if (asTempDBEditName=="DBEdit2")
{
if (DBEdit2->Text == "√")
{
DBEdit2->Text == "";
}
else
{
DBEdit2->Text == "√";
DBEdit1->Text == "";
}
}
}
[解决办法]
来个简单的方法
void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString sTemp = ((TDBEdit *)Sender)->Text ;
DBEdit1->Text = "";
DBEdit2->Text = "";
((TDBEdit *)Sender)->Text =sTemp =="√" ? "":"√";
}
如果有多个组件互斥,可以先定义一个数值,把所有组件的指针存进去
事件里循环依次判别,是本组件的,符号取反,不是本组件一律置空。
[解决办法]
我是按楼主的意图写的,代码简单多了,可以互斥,也可以全部取消,lz试试我的代码就知道了。
最后一个条件语句会根据组件原来的值取反的。
lz仔细看这个语句:
((TDBEdit *)Sender)->Text = sTemp == "√" ? "":"√";