提前说明: 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);
}
//---------------------------------------------------------------------------
效果图如下:
当然了, 还可以考虑用线程来实现, 具体思路是如出一辙的。 个人建议用定时器, 因为定时器更简单更方便。