不知道算不算BCB的Bug? DateTimePicker的问题

bluesen 2003-07-09 05:52:18
大家可以做个极其简单的试验:
Form上放三个控件:DateTimePicker, Label, Button

DateTimePicker带CheckBox, 即ShowCheckBox属性为true

写上几行代码:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if( DateTimePicker1->Checked ){
Label1->Caption = DateTimePicker1->Date;
}
else{
Label1->Caption = "没有选中";
}
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
DateTimePicker1->Checked = false; // 不要选中
}

运行程序,点击Button, 按道理应该显示"没有选中",但Label1上显示的结果居然是"2003-7-9 ..."!就是说DateTimePicker1->Checked = false;好像没有起作用,但从画面上看日期控件确实没有打勾。

谁知道这后面的原因吗?
...全文
180 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sigui 2003-10-16
  • 打赏
  • 举报
回复
我正准备提问呢。我现在在dll的窗体里遇到这个问题,设计期间和OnCreat()事件里显式的置Checked属性为false都不行,运行起来就是打了勾的。
但是我的另一个不用dll的程序这样是可以的,所以我就很奇怪。

放到构造函数里也不行,我试过了,只能连续两次显式赋值才行,但是一旦跳转到其它事件中,这些控件的Checked值又变成True了,看来不是我的问题了……
wjlsmail 2003-07-11
  • 打赏
  • 举报
回复
Lewolf(别叫我李狼(MM除外)) : 有道理 :) , 不过 Borland 完全可以解决构造次序上的问题
cqsun 2003-07-11
  • 打赏
  • 举报
回复
放到OnShow里试验一下呢。
bluesen 2003-07-11
  • 打赏
  • 举报
回复
to Bensoon(Bensoon) :

在我的系统上该故障总是出现。

 我的系统是: C++Builder6.0, 操作系统是: WindowsXP Professional 简体中文版。

 不知道你的系统配置是怎么样的?

 此外,第二个例子你要注意将控件DateTimePicker1的ShowCheckBox属性设置为true.

bajiao2(暴风一族) :
是怎么样的?
Lewolf 2003-07-10
  • 打赏
  • 举报
回复
OnCreate是为Delphi使用的,Borland建议将OnCreate中的代码放置在构造函数中的,这个应该和Object Pascal和C++父类的构造顺序有关的,看看OnCreate是在什么时候触发的。放在构造函数中应该是没有问题的
bluesen 2003-07-10
  • 打赏
  • 举报
回复
解决的方法当然很多,我其实最想知道:原因何在?
snla 2003-07-10
  • 打赏
  • 举报
回复
在oncreate事件中修改类似的属性可能会出现这个问题。我也同意项羽的看法。在onshow修改属性不会有问题。
bluesen 2003-07-10
  • 打赏
  • 举报
回复
我用的版本是CB6, 打补丁后此问题并未消失。

to nanhui(晖):
那条语句并非完全不起作用,你注意观察CheckBox的勾已经没有了,表示其状态的确为false.

to luhongjun(过江项羽):
恐怕未必是控件的建立期问题,这个我做过试验。何况其它控件无此问题。再说,如果有大量的DateTimePicker控件要按照数据库里存储的状态显示出来,按你的方法岂不麻烦的要死?

我的应用是在通讯簿中用该控件表示生日,Checked表示有无记录生日。

我后来的解决办法是(举例):

void __fastcall TForm1::FormCreate(TObject *Sender)
{
DateTimePicker1->Checked = false; // 不要选中
DateTimePicker1->Checked = false; // 重复一条语句,解决该BUG
}

当然很丑陋,说不定哪天其它维护代码的同事就把后面那条语句给删了。

 希望熟悉VCL控件,读过源代码的人,说说其中的奥妙。
bajiao2 2003-07-10
  • 打赏
  • 举报
回复
是这样的。
Bensoon 2003-07-10
  • 打赏
  • 举报
回复
我刚刚试了一下,没有问题呀,楼主说的好像有点不一样呀!!

是显示“没有选中”呀!! 很正确的噢!不知道你是怎么弄的噢!!

呵呵
bluesen 2003-07-10
  • 打赏
  • 举报
回复
看来这个控件是有不少问题。
有没有替代控件?
bluesen 2003-07-10
  • 打赏
  • 举报
回复
to Lewolf(别叫我李狼(MM除外)) :
这恐怕不是问题的本质,我在首帖中只是为了说明问题的方便将代码放在FormCreate中,你可以试下面的例子,这个更靠近我实际的代码:

1. 创建一个新工程,有两个Form: Form1和Form2

2. Form1为主Form, 上面只有一个Button1

3. Form2上有三个控件,类似首帖: DateTimePicker1, Label1和Button1, 双击Button1:
void __fastcall TForm2::Button1Click(TObject *Sender)
{
if( DateTimePicker1->Checked ){
Label1->Caption = DateTimePicker1->Date;
}
else{
Label1->Caption = "没有选中";
}
}

4. 在Unit1.cpp上包含"Unit2.h", 双击Form1上的Button1:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2->DateTimePicker1->Checked = false; // 不要选中
Form2->ShowModal();
}

5. 运行,出现Form1, 点击Button后出现Form2, 再点击Button1, 这时候观察结果

这难道还是OnCreate的问题吗?这时候已经没有任何地方试用OnCreate事件了。
我认为是DateTimePicker的设计上有Bug。
sczyq 2003-07-10
  • 打赏
  • 举报
回复
还有呢,当

DateTimePicker1->MinDate = Date();

时,选当天时,出错
luhongjun 2003-07-09
  • 打赏
  • 举报
回复
bluesen (善哉) ,的确有这个问题但不是BCB的Bug是你的问题。

你把 DateTimePicker1->Checked = false; // 不要选中 放到窗体的OnShow事件中就可以了

主要是控件的建立期问题。在FormCreate中改变组件的属性是会出现很多问题的。
zbc 2003-07-09
  • 打赏
  • 举报
回复
是好的啊,我用的是c++builder5.0,没人再用比此低的版本吧?
nanhui 2003-07-09
  • 打赏
  • 举报
回复
我这里似乎也有这样的问题
不知道 Lewolf(别叫我李狼(MM除外)) 用的是哪一个版本

附:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
DateTimePicker1->Checked = false; // 不要选中
}
上面这句话好像是不起作用的
而如果把这句话放大在Button1Click中,是生效的

关注此问题
yejun52 2003-07-09
  • 打赏
  • 举报
回复
应该不可能是bug的。看看BCBhelp
Lewolf 2003-07-09
  • 打赏
  • 举报
回复
好着啊,你用的呢硌版本的BCB

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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