全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2688
推到 Plurk!
推到 Facebook!

心得分享 : Tag & Hint 屬性的妙用

 
bruce0211
版主


發表:157
回覆:668
積分:279
註冊:2002-06-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-27 22:23:33 IP:163.32.xxx.xxx 未訂閱
心得分享 : 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/ >>
系統時間:2024-04-24 16:02:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!