提前说明: ComboBox1的style属性是csDropDown
先描述一个场景:如图1:
现在, 当用户点击"英语分数"的时候, 系统默认ComboBox1的Text中会显示“英语分数”这四个汉字, 但是, 现在的需求是: 当用户选择“英语分数”后, ComboBox1的Text中会出现具体的值, 比如98.
刚开始可能觉得这个很好做, 不就是在ComboBox1的某方法中增加ComboBox1->Text = "98";这样的语句就行了吗? 事实上, 我在ComboBox1的方法的所有方法中加了这句话, 然后选择“英语分数”的时候, ComboBox1还是显示“英语分数”, 而不是我需要的具体值98, 比如, 下面的代码是徒劳的:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ComboBox1->Text = ""; ComboBox1->Items->Add("数学分数"); ComboBox1->Items->Add("英语分数"); ComboBox1->AddItem("历史分数", NULL); Button1->Enabled = false; } //--------------------------------------------------------------------------- void __fastcall TForm1::ComboBox1Select(TObject *Sender) { ComboBox1->Text = "98"; } //---------------------------------------------------------------------------那是不是在最后这个函数中增加一个延时的语句就ok呢? 我们试一下如下代码:
void __fastcall TForm1::ComboBox1Select(TObject *Sender) { Sleep(1000); ComboBox1->Text = "98"; } //---------------------------------------------------------------------------还是不行啊, 看来ComboBox1值的Text值的确定还在ComboBox1Select函数之后。 经历了诸多尝试失败后, 我决定巧妙的利用定用定时器来实现, 定时器的定时时间是20ms, 且初始状态默认为false, 不开启它。 利用定时器方法的关键之处在于: 让系统在某个时间(Combox1的Text被默认置为"英语分数")之后来重新置ComboBox1的Text值为98. 代码如下:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ComboBox1->Text = ""; ComboBox1->Items->Add("数学分数"); ComboBox1->Items->Add("英语分数"); ComboBox1->AddItem("历史分数", NULL); Button1->Enabled = false; } //--------------------------------------------------------------------------- void __fastcall TForm1::ComboBox1Select(TObject *Sender) { Timer1->Enabled = true; // 开启定时器 } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) // 让系统来定时触发, 便于对ComboBox1的Text重新赋值 { int index = ComboBox1->ItemIndex; if(-1 == index) { ComboBox1->Text = ""; } else if(0 == index) { ComboBox1->Text = "100"; } else if(1 == index) { ComboBox1->Text = "98"; } else if(2 == index) { ComboBox1->Text = "96"; } Timer1->Enabled = false; // 用一次后就关掉定时器 } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { ShowMessage(ComboBox1->Text); } //---------------------------------------------------------------------------
效果图如下:
当然了, 还可以考虑用线程来实现, 具体思路是如出一辙的。 个人建议用定时器, 因为定时器更简单更方便。