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);
}
//---------------------------------------------------------------------------

 

         效果图如下:



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

 

 

 

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值