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

條碼 CODE 128

 
a0953329718
一般會員


發表:1
回覆:0
積分:0
註冊:2010-12-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-12-28 17:02:37 IP:59.126.xxx.xxx 訂閱
 
void __fastcall GetCode128(AnsiString strSource,TCanvas *img, int Top, int Left , int Height ,int Dpi)
{
if (strSource.IsEmpty()) return ;
double Ratio ; //算出比例 以 解析 100為基準
if (Dpi > 0)
Ratio=Dpi/100.0;
else
Ratio=1;
int x = Top*Ratio; //左邊界
int y = Left*Ratio; //上邊界
int BarCodeHeight = Height*Ratio; //BarCode高度
int ichecksum; //檢查值
int idx, icodeword_pos;
AnsiString AlphaBet_A = " !\"#$%&'()* ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\^_]" ; //Code A 的
AnsiString AlphaBet_B = " !\"#$%&'()* ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\^_]`abcdefghijklmnopqrstuvwxyz{|}~"; //Code B 的
AnsiString Code128[103] = //Code128對應碼
{
/*a:' '; b:' '; c:'00'*/ "11011001100",
/*a:'!'; b:'!'; c:'01'*/ "11001101100",
/*a:'"'; b:'"'; c:'02'*/ "11001100110",
/*a:'#'; b:'#'; c:'03'*/ "10010011000",
/*a:'$'; b:'$'; c:'04'*/ "10010001100",
/*a:'%'; b:'%'; c:'05'*/ "10001001100",
/*a:'&'; b:'&'; c:'06'*/ "10011001000",
/*a:"'"; b:"'"; c:'07'*/ "10011000100",
/*a:'('; b:'('; c:'08'*/ "10001100100",
/*a:')'; b:')'; c:'09'*/ "11001001000",
/*a:'*'; b:'*'; c:'10'*/ "11001000100",
/*a:' '; b:' '; c:'11'*/ "11000100100",
/*a:'’'; b:'’'; c:'12'*/ "10110011100",
/*a:'-'; b:'-'; c:'13'*/ "10011011100",
/*a:'.'; b:'.'; c:'14'*/ "10011001110",
/*a:'/'; b:'/'; c:'15'*/ "10111001100",
/*a:'0'; b:'0'; c:'16'*/ "10011101100",
/*a:'1'; b:'1'; c:'17'*/ "10011100110",
/*a:'2'; b:'2'; c:'18'*/ "11001110010",
/*a:'3'; b:'3'; c:'19'*/ "11001011100",
/*a:'4'; b:'4'; c:'20'*/ "11001001110",
/*a:'5'; b:'5'; c:'21'*/ "11011100100",
/*a:'6'; b:'6'; c:'22'*/ "11001110100",
/*a:'7'; b:'7'; c:'23'*/ "11101101110",
/*a:'8'; b:'8'; c:'24'*/ "11101001100",
/*a:'9'; b:'9'; c:'25'*/ "11100101100",
/*a:':'; b:':'; c:'26'*/ "11100100110",
/*a:';'; b:';'; c:'27'*/ "11101100100",
/*a:'<'; b:'<'; c:'28'*/ "11100110100",
/*a:'='; b:'='; c:'29'*/ "11100110010",
/*a:'>'; b:'>'; c:'30'*/ "11011011000",
/*a:'?'; b:'?'; c:'31'*/ "11011000110",
/*a:'@'; b:'@'; c:'32'*/ "11000110110",
/*a:'A'; b:'A'; c:'33'*/ "10100011000",
/*a:'B'; b:'B'; c:'34'*/ "10001011000",
/*a:'C'; b:'C'; c:'35'*/ "10001000110",
/*a:'D'; b:'D'; c:'36'*/ "10110001000",
/*a:'E'; b:'E'; c:'37'*/ "10001101000",
/*a:'F'; b:'F'; c:'38'*/ "10001100010",
/*a:'G'; b:'G'; c:'39'*/ "11010001000",
/*a:'H'; b:'H'; c:'40'*/ "11000101000",
/*a:'I'; b:'I'; c:'41'*/ "11000100010",
/*a:'J'; b:'J'; c:'42'*/ "10110111000",
/*a:'K'; b:'K'; c:'43'*/ "10110001110",
/*a:'L'; b:'L'; c:'44'*/ "10001101110",
/*a:'M'; b:'M'; c:'45'*/ "10111011000",
/*a:'N'; b:'N'; c:'46'*/ "10111000110",
/*a:'O'; b:'O'; c:'47'*/ "10001110110",
/*a:'P'; b:'P'; c:'48'*/ "11101110110",
/*a:'Q'; b:'Q'; c:'49'*/ "11010001110",
/*a:'R'; b:'R'; c:'50'*/ "11000101110",
/*a:'S'; b:'S'; c:'51'*/ "11011101000",
/*a:'T'; b:'T'; c:'52'*/ "11011100010",
/*a:'U'; b:'U'; c:'53'*/ "11011101110",
/*a:'V'; b:'V'; c:'54'*/ "11101011000",
/*a:'W'; b:'W'; c:'55'*/ "11101000110",
/*a:'X'; b:'X'; c:'56'*/ "11100010110",
/*a:'Y'; b:'Y'; c:'57'*/ "11101101000",
/*a:'Z'; b:'Z'; c:'58'*/ "11101100010",
/*a:'['; b:'['; c:'59'*/ "11100011010",
/*a:'\'; b:'\'; c:'60'*/ "11101111010",
/*a:']'; b:']'; c:'61'*/ "11001000010",
/*a:'^'; b:'^'; c:'62'*/ "11110001010",
/*a:'_'; b:'_'; c:'63'*/ "10100110000",
/*a:' '; b:'`'; c:'64'*/ "10100001100",
/*a:' '; b:'a'; c:'65'*/ "10010110000",
/*a:' '; b:'b'; c:'66'*/ "10010000110",
/*a:' '; b:'c'; c:'67'*/ "10000101100",
/*a:' '; b:'d'; c:'68'*/ "10000100110",
/*a:' '; b:'e'; c:'69'*/ "10110010000",
/*a:' '; b:'f'; c:'70'*/ "10110000100",
/*a:' '; b:'g'; c:'71'*/ "10011010000",
/*a:' '; b:'h'; c:'72'*/ "10011000010",
/*a:' '; b:'i'; c:'73'*/ "10000110100",
/*a:' '; b:'j'; c:'74'*/ "10000110010",
/*a:' '; b:'k'; c:'75'*/ "11000010010",
/*a:' '; b:'l'; c:'76'*/ "11001010000",
/*a:' '; b:'m'; c:'77'*/ "11110111010",
/*a:' '; b:'n'; c:'78'*/ "11000010100",
/*a:' '; b:'o'; c:'79'*/ "10001111010",
/*a:' '; b:'p'; c:'80'*/ "10100111100",
/*a:' '; b:'q'; c:'81'*/ "10010111100",
/*a:' '; b:'r'; c:'82'*/ "10010011110",
/*a:' '; b:'s'; c:'83'*/ "10111100100",
/*a:' '; b:'t'; c:'84'*/ "10011110100",
/*a:' '; b:'u'; c:'85'*/ "10011110010",
/*a:' '; b:'v'; c:'86'*/ "11110100100",
/*a:' '; b:'w'; c:'87'*/ "11110010100",
/*a:' '; b:'x'; c:'88'*/ "11110010010",
/*a:' '; b:'y'; c:'89'*/ "11011011110",
/*a:' '; b:'z'; c:'90'*/ "11011110110",
/*a:' '; b:'{'; c:'91'*/ "11110110110",
/*a:' '; b:'|'; c:'92'*/ "10101111000",
/*a:' '; b:'}'; c:'93'*/ "10100011110",
/*a:' '; b:'~'; c:'94'*/ "10001011110",
/*a:' '; b:' '; c:'95'*/ "10111101000",
/*a:' '; b:' '; c:'96'*/ "10111100010",
/*a:' '; b:' '; c:'97'*/ "11110101000",
/*a:' '; b:' '; c:'98'*/ "11110100010",
/*a:' '; b:' '; c:'99'*/ "10111011110", //A轉C , B轉C , 99
/*a:' '; b:' '; c:' '*/ "10111011110", //A轉B , F4 , C轉B
/*a:' '; b:' '; c:' '*/ "11101011110", //F4 , B轉A , C轉A
/*a:' '; b:' '; c:' '*/ "11110101110" //F1
};
AnsiString CODEA = "11010000100"; //起始碼 CODE A
AnsiString CODEB = "11010010000"; //起始碼 CODE B
AnsiString CODEC = "11010011100"; //起始碼 CODE C
AnsiString strend = "1100011101011"; //終止碼有13線
AnsiString strStar = "";
AnsiString strEncode="";
//先判斷要用 CODE A , B , C
/*
1. 一開始數字連續4個以上時,使用C類。
2. 先遇上ASCII 0~31者,使用A類,先遇上ASCII 96~127者,使用B類。都遇不上,一律採用A類。
*/
if (strSource.Length() > 0) //判斷是不是空的
{
strStar = "";
//決定用哪一種CODE
if (TryStrToFloat(strSource) && (strSource.Length() % 2 == 0)) //數字且長度為雙數的用CODE C
strStar = CODEC;
else
{
for (int i = 1; i <= strSource.Length(); i )
{
//檢查是不是含有 ASCII 96~127 用 CODE B
char a = strSource[i] ;
int iTmp=a;
if (iTmp >= 96 && iTmp <= 127)
strStar = CODEB;
}
if (strStar == "") strStar = CODEA; //都不符合用 CODE A
}
}
/* 檢查碼初始值
Code A = 103
Code B = 104
Code C = 105
*/
if (strStar == CODEC)
{ //CODE C 的做法
strEncode = strStar; //給啟始碼
ichecksum = 105; // ex:1234 ichecksum = (105 12*1 34*2) % 103
idx = 0;
icodeword_pos = 1;
for (int i = 0; i < strSource.Length() / 2; i ) //CODE C 是一次2碼
{
idx = StrToInt(strSource.SubString((i * 2) 1, 2)); //取2碼 EX:1234 分成 12跟34 取
strEncode = strEncode Code128[idx]; //換成條碼 編碼值
ichecksum = ichecksum idx * icodeword_pos; //算檢查值
icodeword_pos = icodeword_pos 1;
}
strEncode = strEncode Code128[ichecksum % 103] strend; //加上檢查值與結束字串
}
else
{
//由CODE 類別帶出 初始 檢查值
if (strStar == CODEA) ichecksum = 103; //CODE A
else if (strStar == CODEB) ichecksum = 104; //CODE B
else ichecksum = 0;
strEncode = strStar; //給啟始碼
idx = 0;
icodeword_pos = 1;
AnsiString sstmp;
for (int i = 1; i <= strSource.Length() ; i )
{
sstmp=strSource.SubString(i, 1);
if (strStar == CODEA) //查字元位置
idx = AlphaBet_A.Pos(sstmp); //CODE A
else
idx = AlphaBet_B.Pos(sstmp); //CODE B
strEncode = strEncode Code128[idx-1]; //由位置 換成條碼 編碼值
ichecksum = ichecksum idx * icodeword_pos; //算檢查值
icodeword_pos = icodeword_pos 1;
}
strEncode = strEncode Code128[ichecksum % 103] strend; //加上檢查值與結束字串
}
int intEncodeLength = strEncode.Length(); //編碼後長度
img->Brush->Style = bsSolid;
img->Brush->Color=clWhite;
img->Pen->Color=clWhite;
img->Rectangle(0,0,(1*intEncodeLength) (x*2) 2,BarCodeHeight (y * 2));
for (int i = 1; i <= intEncodeLength; i ) //依碼畫出BarCode
{
if (strEncode.SubString(i, 1)==1)
{ //黑色的 線
img->Brush->Color=clBlack;
img->Pen->Color=clBlack;
}
else
{ //白色的
img->Brush->Color=clWhite;
img->Pen->Color=clWhite;
}
img->Rectangle( x, y, x (1*Ratio), BarCodeHeight);
x =x 1*Ratio;
}
}
[/code]
系統時間:2024-11-23 3:58:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!