DBEdit与Onclick事件的小疑问,无法理解

yang_jnu 2011-07-02 11:29:17
现在我的窗口里有两个为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事件,为什么就已经被赋值为"√"
讲得有点啰嗦,求论坛各位指教下。。。。。。
...全文
94 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bosman 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yang_jnu 的回复:]

引用 8 楼 bosman 的回复:

.......又出意外..

void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString asTempDBEditName = ((TDBEdit *)Sender)->Name;
if (asTempDBEditName=="DBEdit1")
{
if (D……
[/Quote]

三个以上没得叫互斥了.
要么全为空,要么只有一个打勾.这更好判断了.
yang_jnu 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 tst1255 的回复:]

引用 11 楼 yang_jnu 的回复:
引用 9 楼 tst1255 的回复:

来个简单的方法

void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString sTemp = ((TDBEdit *)Sender)->Text ;
DBEdit1->Text = "";
DBEdit2->Text……
[/Quote]

在没绑定字段时,这种方法确实可行,但实际绑定的时候就出问题了,在网上找了好久,终于找到解决方案了,是关于DBEdit赋值更新的问题,上网查了下,不少人也出现赋值更新的时候,更新不了数据的问题,换成DBEdit->field->AsString = "***";就可解决问题了。。
tst1255 2011-07-11
  • 打赏
  • 举报
回复
我是按楼主的意图写的,代码简单多了,可以互斥,也可以全部取消,lz试试我的代码就知道了。
最后一个条件语句会根据组件原来的值取反的。
lz仔细看这个语句:
((TDBEdit *)Sender)->Text = sTemp == "√" ? "":"√";

tst1255 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yang_jnu 的回复:]
引用 9 楼 tst1255 的回复:

来个简单的方法

void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString sTemp = ((TDBEdit *)Sender)->Text ;
DBEdit1->Text = "";
DBEdit2->Text = "";

((TDBEdit *)Se……
[/Quote]


可以都取消啊,楼主仔细看看,最后一个条件语句就是根据被点击的组件的值(临时变量保存的)设置打勾或取消的。
yang_jnu 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bosman 的回复:]

引用 10 楼 yang_jnu 的回复:

引用 8 楼 bosman 的回复:

.......又出意外..

void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString asTempDBEditName = ((TDBEdit *)Sender)->Name;
if (asTempDBEditN……
[/Quote]
再次感谢你的回答,现在感觉问题出现在字段的绑定上,不知应该怎么解决。。。。
yang_jnu 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cppfile 的回复:]

经测试,第四步没有发现你说的情况
[/Quote]
我在没绑定数据源的某字段的情况,测试是没问题的,当两个DBEdit绑定某个字段时就出现问题了,我另外再拉两个DBEDit3和DBEdit4来做测试,DBEDit3绑定的字段跟DBEdit1绑定的相同,DBEdit4绑定的字段跟DBEdit2绑定的字段相同,此时再重复我原来的步骤:
1.先点击DBEdit1, (DBEdit1打上勾了,DBEDit3却没打上勾)
2.再点击DBEdit2,可以实现互斥的效果,此时DBEdit2打上勾了,(此时DBEdit3却打上勾了,而2对应的DBEdit4没打上勾)
3.点击DBEdit2,将勾取消,此时两个勾都没了,(1和2没了,4也没了,3依旧打着勾)
4.第四步,当我接着点击DBEdit1时,这个勾打不上 ,(此时1的勾先是打上,再取消,出现打不上的情况,之前已经分析过了,是因为点击的时候,还没进入响应onclick事件时,已经将DBEdit1作为打勾了)

绑定的都是同一个字段,却出现1和3,2和4不同步的情况,像是3与4慢1拍的感觉,不知谁能解释下。。。。。。
yang_jnu 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cppfile 的回复:]

经测试,第四步没有发现你说的情况
[/Quote]
我新建一个空project,拖两个DBEdit测试确实没发现描述的情况,但在我原来的程序上确实出现描述的情况,正在纳闷
yang_jnu 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tst1255 的回复:]

来个简单的方法

void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString sTemp = ((TDBEdit *)Sender)->Text ;
DBEdit1->Text = "";
DBEdit2->Text = "";

((TDBEdit *)Sender)->Text =……
[/Quote]
你这种写法跟我原来的写法差不多,只是你这种写法是点击后必须存在一项,不可以都取消....
yang_jnu 2011-07-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bosman 的回复:]

.......又出意外..

void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString asTempDBEditName = ((TDBEdit *)Sender)->Name;
if (asTempDBEditName=="DBEdit1")
{
if (DBEdit1->Text == "√")
……
[/Quote]
这种写法当只有两个选项的时候,还可以,当有三个或者四个的选项,岂不是很复杂的写法了.
tst1255 2011-07-04
  • 打赏
  • 举报
回复
来个简单的方法

void __fastcall TfrmAddBl::DBEditClick(TObject *Sender)
{
AnsiString sTemp = ((TDBEdit *)Sender)->Text ;
DBEdit1->Text = "";
DBEdit2->Text = "";

((TDBEdit *)Sender)->Text =sTemp =="√" ? "":"√";

}

如果有多个组件互斥,可以先定义一个数值,把所有组件的指针存进去
事件里循环依次判别,是本组件的,符号取反,不是本组件一律置空。
Bosman 2011-07-03
  • 打赏
  • 举报
回复
.......又出意外..

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 = "";
}
}
}
Bosman 2011-07-03
  • 打赏
  • 举报
回复
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 = "";
}
}
}
Bosman 2011-07-03
  • 打赏
  • 举报
回复
废话不说,直接上码
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 == "";
}
}
}
yang_jnu 2011-07-02
  • 打赏
  • 举报
回复
没人回答,自己顶一下。。
yang_jnu 2011-07-02
  • 打赏
  • 举报
回复
我的也是BCB6,怎么会出现这种问题呢。。。。。难道还有其它可能性???
CppFile 2011-07-02
  • 打赏
  • 举报
回复
bcb6
yang_jnu 2011-07-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cppfile 的回复:]

经测试,第四步没有发现你说的情况
[/Quote]
非常感谢你的测试,请问下,你用的是BCB几?
CppFile 2011-07-02
  • 打赏
  • 举报
回复
经测试,第四步没有发现你说的情况

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧