心得分享 : Tag & Hint 屬性的妙用 ■ 每個 VCL 物件幾乎都有 Tag 屬性 , Tag 可用來放一個 整數值 , 由於此屬性值不會影響物件外觀,或其他物件行為 , 所以通常都用來當作"藏值"的地方 ; 利用事件共用 , 可將一堆相同的物件集合分別藏不同的值 , 然後共用同一事件後再例用分離法 , 將此值取出 ; 如之前介紹的計算機按鈕 , 設計計算機程式時有十個相同的按鈕 0 - 9, 但不用為十個按鈕寫十個 OnClick , 共用同一事件但要能分辨彼此按鍵代表不同的值 ; 但今天若應用在別的地方 , 在 POS 系統觸控螢幕操作畫面 , 按下不同按鈕得出不同的條碼值 , 然後再去資料庫中搜尋商品 , 由於條碼值太長 (13 位數) , 最好是當字串處理 , 那該將每個按鈕所代表不同的條碼值藏在哪呢 ? 筆者第一個想到的就是 Hint 屬性 , 由於面板商品不需 Hint , Hint 設定後只要 ShowHint 不要設為 true , Hint 就不會跑出來 , Hint 就可拿來當作物件本身偷藏"字串"值的地方 , 以下是範例介紹 ■ 動態產生"面板商品"按鈕的範例 □ 須使用按鈕 或是"看起來"像按鈕,且能按下去的元件
□ 要求條件 : Caption 要有兩行 , 按鈕可變顏色 , 要有立體感 , 但不能聚焦(Focused)
□ 測試
使用 Panel , 可變色 , 可設立體感 , 但 Caption 不能折行
使用 TSpeedButton 可設立體感 , Caption 可折行 , 但不能變色
使用 Label , 可變色 , 可折行 , 但不能設立體感
最後方案 使用 Label + Bevel(模擬按鈕立體感,及被按凹下去的感覺)
....當然也可使用 Label + Panel □ 開始實做
1.首先開一個約 800 x 600 的 Form
2.再放一個 800 x 400 左右的 Panel (名叫 Panel1) 在 Form 中間偏下的部位
3.在中間偏上的部分放兩個 button , 一個用來產生動態物件 , 另一個用來釋放動態物件
4.按下"產生動態物件"按鈕後會在 Panel1 上產生一個 8 x 6 的按鈕陣列 , 重點是每個按鈕按下去所得的值都不相同 , 可用來藏"條碼值" , 然後做後續應用 ....
5.完整程式碼如下
//--------------------------------------------------------------------------- #include
#pragma hdrstop #include "Unit1.h"
#include "fstream.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TLabel *lb[49]; // 宣告動態 Label 物件陣列 , Global 變數
TBevel *bv[49]; // 宣告動態 Bevel 物件陣列 , Global 變數
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// 產生動態物件的按鈕事件
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//須使用不能聚焦元件....
//使用 Panel , 可變色 , 可設立體感 , 但 Caption 不能折行
//使用 TSpeedButton 可設立體感 , Caption 可折行 , 但不能變色
//使用 Label , 可變色 , 可折行 , 但不能設立體感
//最後方案 使用 Label Bevel(模擬立體感) int x=0; int y=1;
for (int i=1;i<=48;i )
{
x ;
if (x>8)
{
x=1;
y ;
} bv[i]= new TBevel(this);
bv[i]->Parent=Panel1;
bv[i]->Width=98;
bv[i]->Height=55;
bv[i]->Style=bsRaised;
bv[i]->Left=(x-1)*(bv[i]->Width 1)-0;
bv[i]->Top=(y-1)*(bv[i]->Height 1)-0; lb[i]= new TLabel(this);
lb[i]->Parent=Panel1;
lb[i]->&FF_Plu_MouseDown; //指派動態物件所需的事件
lb[i]->&FF_Plu_MouseUp; //指派動態物件所需的事件
lb[i]->AutoSize=false;
lb[i]->Alignment=taCenter;
lb[i]->Width=96;
lb[i]->Height=53;
lb[i]->Left=bv[i]->Left 1;
lb[i]->Top=bv[i]->Top 1; lb[i]->Tag=i;
lb[i]->Hint="條碼值 : 47100000000" FormatFloat("00",i); lb[i]->Caption="\n" IntToStr(i) "\n" "test";
switch (y)
{
case 0 : lb[i]->Color=clBlack; break; //黑
case 1 : lb[i]->Color=0x000080FF; break; //棕
case 2 : lb[i]->Color=0x00FF80FF; break; //紅
case 3 : lb[i]->Color=0x004080FF; break; //橙
case 4 : lb[i]->Color=0x0080FFFF; break; //黃
case 5 : lb[i]->Color=0x0080FF80; break; //綠
case 6 : lb[i]->Color=0x00FF8000; break; //藍
case 7 : lb[i]->Color=0x00FF0080; break; //紫
case 8 : lb[i]->Color=clBtnFace; break; //灰
case 9 : lb[i]->Color=clWhite; break; //白
} } }
//---------------------------------------------------------------------------
// 自行寫給動態物件用的 OnMousDown() 事件
//---------------------------------------------------------------------------
void __fastcall TForm1::FF_Plu_MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
//按下 Label 時將 Label 中的 Tag 值取出 ,
//再呼叫對應 index 之 Bevel 物件做出外框 "按下"的感覺
bv[((TLabel *)Sender)->Tag]->Style=bsLowered; //按下 Label 時改變 Label 位置以便有"按下"的感覺"
((TLabel *)Sender)->Left ;
((TLabel *)Sender)->Top ;
((TLabel *)Sender)->Width--;
((TLabel *)Sender)->Height--; }
//---------------------------------------------------------------------------
//自行寫給動態物件用的 OnMousUp() 事件
//---------------------------------------------------------------------------
void __fastcall TForm1::FF_Plu_MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
//放開 Label 時將 Label 中的 Tag 值取出 ,
//再呼叫對應 index 之 Bevel 物件做出外框 "浮起"的感覺
bv[((TLabel *)Sender)->Tag]->Style=bsRaised; //放開 Label 時改變 Label Caption 位置以便有"浮起"的感覺"
((TLabel *)Sender)->Left--;
((TLabel *)Sender)->Top--;
((TLabel *)Sender)->Width ;
((TLabel *)Sender)->Height ; ShowMessage(((TLabel *)Sender)->Hint); // 將被按下的 Label 偷藏的字串變數帶出以便應用 } //---------------------------------------------------------------------------
//刪除動態物件的按鈕事件
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
for (int i=1;i<=48;i )
{
delete lb[i];
delete bv[i];
}
}
<< BCB 源碼任務 http://home.kimo.com.tw/bruce0829/ >>