BCB中的TComboBox如何显示用户选择名称所对应的映射值?------尝试好久终于想到利用定时器来间接实现

       提前说明: 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);
}
//---------------------------------------------------------------------------

         效果图如下:



       当然了, 还可以考虑用线程来实现, 具体思路是如出一辙的。 个人建议用定时器, 因为定时器更简单更方便。







你可能感兴趣的:(BCB中的TComboBox如何显示用户选择名称所对应的映射值?------尝试好久终于想到利用定时器来间接实现)