BarDef.inc
上传用户:xdwang_66
上传日期:2016-04-26
资源大小:1726k
文件大小:31k
源码类别:

Static控件

开发平台:

Delphi

  1. // =============================================================================
  2. //
  3. // Barcode VCL Component
  4. //
  5. // For Delphi 4/5/6/7, C++ Builder 4/5/6, BDS 2005/2005, Turbo Delphi 2006
  6. //
  7. // Copyright (c) 2001, 2007  Han-soft Software, all rights reserved.
  8. //
  9. // $Rev: 44 $   $Id: BarDef.inc 44 2007-01-16 01:16:04Z hanjy $
  10. //
  11. // =============================================================================
  12. {********************}
  13. {  For make barcode  }
  14. {********************}
  15. { Convert codebar data }
  16. function Convert(const s:string):string;
  17. var
  18.   i, v : integer;
  19. begin
  20.   Result := s;  { same Length as Input - string }
  21.   for i:=1 to Length(s) do
  22.   begin
  23.     v := ord(s[i]) - 1;
  24.     if odd(i) then
  25.       Inc(v, 5);
  26.     Result[i] := Chr(v);
  27.   end;
  28. end;
  29. { Calculate sum of digitally }
  30. function quersumme(x:integer):integer;
  31. var
  32.   sum:integer;
  33. begin
  34.   sum := 0;
  35.   while x > 0 do
  36.   begin
  37.     sum := sum + (x mod 10);
  38.     x := x div 10;
  39.   end;
  40.   result := sum;
  41. end;
  42. { Calculate checksum }
  43. function CheckSumModulo10(const data:string):string;
  44. var
  45.   i,fak,sum : Integer;
  46. begin
  47.   sum := 0;
  48.   fak := Length(data);
  49.   for i:=1 to Length(data) do
  50.   begin
  51.     if (fak mod 2) = 0 then
  52.       sum := sum + (StrToInt(data[i])*1)
  53.     else
  54.       sum := sum + (StrToInt(data[i])*3);
  55.     dec(fak);
  56.   end;
  57.   if (sum mod 10) = 0 then
  58.     result := data+'0'
  59.   else
  60.     result := data+IntToStr(10-(sum mod 10));
  61. end;
  62. { Get checksum }
  63. function DoCheckSumming(const CS_CheckSum:TCheckSum; const data:string):string;
  64. begin
  65.   case CS_CheckSum of
  66.     csNone:
  67.       Result := data;
  68.     csModulo10:
  69.       Result := CheckSumModulo10(data);
  70.   end;
  71. end;
  72. { Assist function for Get barcode data }
  73. function SetLen(pI:byte; HL_BarCode:string):string;
  74. begin
  75.   Result := StringOfChar('0', pI-Length(HL_BarCode)) + HL_BarCode;
  76. end;
  77. { Assist function for get UPC data }
  78. function getSupp(Nr : String) : String;
  79. var
  80.   i,fak,sum : Integer;
  81.   tmp   : string;
  82. begin
  83.   sum := 0;
  84.   tmp := copy(Nr,1,Length(Nr)-1);
  85.   fak := Length(tmp);
  86.   for i:=1 to length(tmp) do
  87.   begin
  88.     if (fak mod 2) = 0 then
  89.       sum := sum + (StrToInt(tmp[i])*9)
  90.     else
  91.       sum := sum + (StrToInt(tmp[i])*3);
  92.     dec(fak);
  93.   end;
  94.   sum:=((sum mod 10) mod 10) mod 10;
  95.   result := tmp+IntToStr(sum);
  96. end;
  97. {********************}
  98. {  For EAN           }
  99. {********************}
  100. { Pattern for Barcode EAN Charset A - L1   S1   L2   S2 }
  101. const tabelle_EAN_A:array['0'..'9'] of string =
  102.   (
  103.   ('2605'),    { 0 }
  104.   ('1615'),    { 1 }
  105.   ('1516'),    { 2 }
  106.   ('0805'),    { 3 }
  107.   ('0526'),    { 4 }
  108.   ('0625'),    { 5 }
  109.   ('0508'),    { 6 }
  110.   ('0706'),    { 7 }
  111.   ('0607'),    { 8 }
  112.   ('2506')     { 9 }
  113.   );
  114. { Pattern for Barcode EAN Charset B - S1   L1   S2   L2 }
  115. const tabelle_EAN_B:array['0'..'9'] of string =
  116.   (
  117.   ('0517'),    { 0 }
  118.   ('0616'),    { 1 }
  119.   ('1606'),    { 2 }
  120.   ('0535'),    { 3 }
  121.   ('1705'),    { 4 }
  122.   ('0715'),    { 5 }
  123.   ('3505'),    { 6 }
  124.   ('1525'),    { 7 }
  125.   ('2515'),    { 8 }
  126.   ('1507')     { 9 }
  127.   );
  128. { Pattern for Barcode EAN Charset C - S1   L1   S2   L2 }
  129. const tabelle_EAN_C:array['0'..'9'] of string =
  130.   (
  131.   ('7150' ),    { 0 }
  132.   ('6160' ),    { 1 }
  133.   ('6061' ),    { 2 }
  134.   ('5350' ),    { 3 }
  135.   ('5071' ),    { 4 }
  136.   ('5170' ),    { 5 }
  137.   ('5053' ),    { 6 }
  138.   ('5251' ),    { 7 }
  139.   ('5152' ),    { 8 }
  140.   ('7051' )     { 9 }
  141.   );
  142. { Get EAN8 data }
  143. function  Code_EAN8(const H_BarCode:string; const H_CheckSum:TCheckSum):string;
  144. var
  145.   i : integer;
  146.   tmp : String;
  147. begin
  148.   if H_CheckSum <> csNone then
  149.   begin
  150.     tmp := SetLen(7,H_BarCode);
  151.     tmp := DoCheckSumming(H_CheckSum,copy(tmp,length(tmp)-6,7));
  152.   end
  153.   else
  154.     tmp := SetLen(8,H_BarCode);
  155.   Assert(Length(tmp)=8, 'EAN8 : ' + ErrorLength);
  156.   result := '505';   {Startcode}
  157.   for i:=1 to 4 do
  158.     result := result + tabelle_EAN_A[tmp[i]] ;
  159.   result := result + '05050';   {Center Guard Pattern}
  160.   for i:=5 to 8 do
  161.     result := result + tabelle_EAN_C[tmp[i]] ;
  162.   result := result + '505';   {Stopcode}
  163. end;
  164. { Pattern for Barcode EAN 13 }
  165. const tabelle_ParityEAN13:array[0..9, 1..6] of char =
  166.   (
  167.   ('A', 'A', 'A', 'A', 'A', 'A'),    { 0 }
  168.   ('A', 'A', 'B', 'A', 'B', 'B'),    { 1 }
  169.   ('A', 'A', 'B', 'B', 'A', 'B'),    { 2 }
  170.   ('A', 'A', 'B', 'B', 'B', 'A'),    { 3 }
  171.   ('A', 'B', 'A', 'A', 'B', 'B'),    { 4 }
  172.   ('A', 'B', 'B', 'A', 'A', 'B'),    { 5 }
  173.   ('A', 'B', 'B', 'B', 'A', 'A'),    { 6 }
  174.   ('A', 'B', 'A', 'B', 'A', 'B'),    { 7 }
  175.   ('A', 'B', 'A', 'B', 'B', 'A'),    { 8 }
  176.   ('A', 'B', 'B', 'A', 'B', 'A')     { 9 }
  177.   );
  178. { Get EAN13 data}
  179. function  Code_EAN13(const H_BarCode:string; const H_CheckSum:TCheckSum):string;
  180. var
  181.   i, LK: integer;
  182.   tmp : String;
  183. begin
  184.   if H_CheckSum <> csNone then
  185.   begin
  186.     tmp := SetLen(12,H_BarCode);
  187.     tmp := DoCheckSumming(H_CheckSum, tmp);
  188.   end
  189.   else
  190.     tmp := SetLen(13,H_BarCode);
  191.   Assert(Length(tmp) = 13, 'EAN13 : ' + ErrorLength);
  192.   LK := StrToInt(tmp[1]);
  193.   tmp := copy(tmp,2,12);
  194.   result := '505';   {Startcode}
  195.   for i:=1 to 6 do
  196.   begin
  197.     case tabelle_ParityEAN13[LK,i] of
  198.       'A' : result := result + tabelle_EAN_A[tmp[i]];
  199.       'B' : result := result + tabelle_EAN_B[tmp[i]] ;
  200.       'C' : result := result + tabelle_EAN_C[tmp[i]] ;
  201.   end;
  202.   end;
  203.   result := result + '05050';   {Center Guard Pattern}
  204.   for i:=7 to 12 do
  205.     result := result + tabelle_EAN_C[tmp[i]] ;
  206.     result := result + '505';   {Stopcode}
  207. end;
  208. {********************}
  209. {  For Code 25       }
  210. {********************}
  211. {Pattern for Barcode 2 of 5}
  212. const tabelle_2_5:array['0'..'9', 1..5] of char =
  213.   (
  214.   ('0', '0', '1', '1', '0'),    {'0'}
  215.   ('1', '0', '0', '0', '1'),    {'1'}
  216.   ('0', '1', '0', '0', '1'),    {'2'}
  217.   ('1', '1', '0', '0', '0'),    {'3'}
  218.   ('0', '0', '1', '0', '1'),    {'4'}
  219.   ('1', '0', '1', '0', '0'),    {'5'}
  220.   ('0', '1', '1', '0', '0'),    {'6'}
  221.   ('0', '0', '0', '1', '1'),    {'7'}
  222.   ('1', '0', '0', '1', '0'),    {'8'}
  223.   ('0', '1', '0', '1', '0')     {'9'}
  224.   );
  225. { Get Code25 interleaved data }
  226. function  Code_2_5_interleaved(const H_BarCode:string):string;
  227. var
  228.   i, j: integer;
  229.   c : char;
  230. begin
  231.   result := '5050';   {Startcode}
  232.   for i:=1 to Length(H_BarCode) div 2 do
  233.   begin
  234.     for j:= 1 to 5 do
  235.     begin
  236.       if tabelle_2_5[H_BarCode[i*2-1], j] = '1' then
  237.         c := '6'
  238.       else
  239.         c := '5';
  240.       result := result + c;
  241.       if tabelle_2_5[H_BarCode[i*2], j] = '1' then
  242.         c := '1'
  243.       else
  244.         c := '0';
  245.       result := result + c;
  246.     end;
  247.   end;
  248.   result := result + '605';    {Stopcode}
  249. end;
  250. { Get Code25 industrial data }
  251. function  Code_2_5_industrial(const H_BarCode:string):string;
  252. var
  253.   i, j: integer;
  254. begin
  255.   result := '606050';   {Startcode}
  256.   for i:=1 to Length(H_BarCode) do
  257.   begin
  258.     for j:= 1 to 5 do
  259.     begin
  260.     if tabelle_2_5[H_BarCode[i], j] = '1' then
  261.       result := result + '60'
  262.     else
  263.       result := result + '50';
  264.     end;
  265.   end;
  266.   result := result + '605060';   {Stopcode}
  267. end;
  268. { Get Code25 matrix data }
  269. function  Code_2_5_matrix(const H_BarCode:string):string;
  270. var
  271.   i, j: integer;
  272.   c :char;
  273. begin
  274.   result := '705050';   {Startcode}
  275.   for i:=1 to Length(H_BarCode) do
  276.   begin
  277.     for j:= 1 to 5 do
  278.     begin
  279.       if tabelle_2_5[H_BarCode[i], j] = '1' then
  280.         c := '1'
  281.       else
  282.         c := '0';
  283.       if odd(j) then
  284.         c := chr(ord(c)+5);
  285.       result := result + c;
  286.     end;
  287.    result := result + '0';
  288.   end;
  289.   result := result + '70505';   {Stopcode}
  290. end;
  291. {********************}
  292. {  For Code 39       }
  293. {********************}
  294. { Get Code39  data }
  295. function  Code_39(const H_BarCode:string; const H_CheckSum:TCheckSum):string;
  296. type TCode39 =
  297.   record
  298.     c : char;
  299.     data : array[0..9] of char;
  300.     chk: shortint;
  301.   end;
  302. const tabelle_39: array[0..43] of TCode39 = (
  303.   ( c:'0'; data:'505160605'; chk:0 ),
  304.   ( c:'1'; data:'605150506'; chk:1 ),
  305.   ( c:'2'; data:'506150506'; chk:2 ),
  306.   ( c:'3'; data:'606150505'; chk:3 ),
  307.   ( c:'4'; data:'505160506'; chk:4 ),
  308.   ( c:'5'; data:'605160505'; chk:5 ),
  309.   ( c:'6'; data:'506160505'; chk:6 ),
  310.   ( c:'7'; data:'505150606'; chk:7 ),
  311.   ( c:'8'; data:'605150605'; chk:8 ),
  312.   ( c:'9'; data:'506150605'; chk:9 ),
  313.   ( c:'A'; data:'605051506'; chk:10),
  314.   ( c:'B'; data:'506051506'; chk:11),
  315.   ( c:'C'; data:'606051505'; chk:12),
  316.   ( c:'D'; data:'505061506'; chk:13),
  317.   ( c:'E'; data:'605061505'; chk:14),
  318.   ( c:'F'; data:'506061505'; chk:15),
  319.   ( c:'G'; data:'505051606'; chk:16),
  320.   ( c:'H'; data:'605051605'; chk:17),
  321.   ( c:'I'; data:'506051605'; chk:18),
  322.   ( c:'J'; data:'505061605'; chk:19),
  323.   ( c:'K'; data:'605050516'; chk:20),
  324.   ( c:'L'; data:'506050516'; chk:21),
  325.   ( c:'M'; data:'606050515'; chk:22),
  326.   ( c:'N'; data:'505060516'; chk:23),
  327.   ( c:'O'; data:'605060515'; chk:24),
  328.   ( c:'P'; data:'506060515'; chk:25),
  329.   ( c:'Q'; data:'505050616'; chk:26),
  330.   ( c:'R'; data:'605050615'; chk:27),
  331.   ( c:'S'; data:'506050615'; chk:28),
  332.   ( c:'T'; data:'505060615'; chk:29),
  333.   ( c:'U'; data:'615050506'; chk:30),
  334.   ( c:'V'; data:'516050506'; chk:31),
  335.   ( c:'W'; data:'616050505'; chk:32),
  336.   ( c:'X'; data:'515060506'; chk:33),
  337.   ( c:'Y'; data:'615060505'; chk:34),
  338.   ( c:'Z'; data:'516060505'; chk:35),
  339.   ( c:'-'; data:'515050606'; chk:36),
  340.   ( c:'.'; data:'615050605'; chk:37),
  341.   ( c:' '; data:'516050605'; chk:38),
  342.   ( c:'*'; data:'515060605'; chk:0 ),
  343.   ( c:'$'; data:'515151505'; chk:39),
  344.   ( c:'/'; data:'515150515'; chk:40),
  345.   ( c:'+'; data:'515051515'; chk:41),
  346.   ( c:'%'; data:'505151515'; chk:42)
  347.   );
  348. function FindIdx(z:char):integer;
  349. var
  350.   i:integer;
  351. begin
  352.   for i:=0 to High(tabelle_39) do
  353.   begin
  354.     if z = tabelle_39[i].c then
  355.     begin
  356.       result := i;
  357.       exit;
  358.     end;
  359.   end;
  360.   result := -1;
  361. end;
  362. var
  363.   i, idx : integer;
  364.   checksum:integer;
  365. begin
  366.   checksum := 0;
  367.   {Startcode}
  368.   result := tabelle_39[FindIdx('*')].data + '0';
  369.   for i:=1 to Length(H_BarCode) do
  370.   begin
  371.     idx := FindIdx(H_BarCode[i]);
  372.     if idx < 0 then
  373.       continue;
  374.     result := result + tabelle_39[idx].data + '0';
  375.     Inc(checksum, tabelle_39[idx].chk);
  376.   end;
  377.   {Calculate Checksum Data}
  378.   if H_CheckSum <> csNone then
  379.     begin
  380.     checksum := checksum mod 43;
  381.     for i:=0 to High(tabelle_39) do
  382.       if checksum = tabelle_39[i].chk then
  383.       begin
  384.         result := result + tabelle_39[i].data + '0';
  385.         break;
  386.       end;
  387.     end;
  388.   {Stopcode}
  389.   result := result + tabelle_39[FindIdx('*')].data;
  390. end;
  391. { Get Code39 extended data }
  392. function  Code_39Extended(const H_BarCode:string;
  393.   const H_CheckSum:TCheckSum):string;
  394. const code39x : array[0..127] of string[2] =
  395.   (
  396.   ('%U'), ('$A'), ('$B'), ('$C'), ('$D'), ('$E'), ('$F'), ('$G'),
  397.   ('$H'), ('$I'), ('$J'), ('$K'), ('$L'), ('$M'), ('$N'), ('$O'),
  398.   ('$P'), ('$Q'), ('$R'), ('$S'), ('$T'), ('$U'), ('$V'), ('$W'),
  399.   ('$X'), ('$Y'), ('$Z'), ('%A'), ('%B'), ('%C'), ('%D'), ('%E'),
  400.    (' '), ('/A'), ('/B'), ('/C'), ('/D'), ('/E'), ('/F'), ('/G'),
  401.   ('/H'), ('/I'), ('/J'), ('/K'), ('/L'), ('/M'), ('/N'), ('/O'),
  402.   ( '0'),  ('1'),  ('2'),  ('3'),  ('4'),  ('5'),  ('6'),  ('7'),
  403.    ('8'),  ('9'), ('/Z'), ('%F'), ('%G'), ('%H'), ('%I'), ('%J'),
  404.   ('%V'),  ('A'),  ('B'),  ('C'),  ('D'),  ('E'),  ('F'),  ('G'),
  405.    ('H'),  ('I'),  ('J'),  ('K'),  ('L'),  ('M'),  ('N'),  ('O'),
  406.    ('P'),  ('Q'),  ('R'),  ('S'),  ('T'),  ('U'),  ('V'),  ('W'),
  407.    ('X'),  ('Y'),  ('Z'), ('%K'), ('%L'), ('%M'), ('%N'), ('%O'),
  408.   ('%W'), ('+A'), ('+B'), ('+C'), ('+D'), ('+E'), ('+F'), ('+G'),
  409.   ('+H'), ('+I'), ('+J'), ('+K'), ('+L'), ('+M'), ('+N'), ('+O'),
  410.   ('+P'), ('+Q'), ('+R'), ('+S'), ('+T'), ('+U'), ('+V'), ('+W'),
  411.   ('+X'), ('+Y'), ('+Z'), ('%P'), ('%Q'), ('%R'), ('%S'), ('%T')
  412.   );
  413. var
  414.   tmp:string;
  415.   i : integer;
  416. begin
  417.   tmp := '';
  418.   for i:=1 to Length(H_BarCode) do
  419.   begin
  420.     if ord(H_BarCode[i]) <= 127 then
  421.       tmp := tmp + code39x[ord(H_BarCode[i])];
  422.   end;
  423.   result := Code_39(tmp,H_CheckSum);
  424. end;
  425. {********************}
  426. {  For Code 128      }
  427. {********************}
  428. { Get Code128 data }
  429. function  Code_128(const H_BarType:TBarType; const H_BarCode:string;
  430.   const H_CheckSum:TCheckSum; var H_CheckNum:string):string;
  431.   type TCode128 =
  432.   record
  433.     a, b : char;
  434.     c : string[2];
  435.     data : string[6];
  436.   end;
  437. const tabelle_128: array[0..102] of TCode128 = (
  438.   ( a:' '; b:' '; c:'00'; data:'212222' ),
  439.   ( a:'!'; b:'!'; c:'01'; data:'222122' ),
  440.   ( a:'"'; b:'"'; c:'02'; data:'222221' ),
  441.   ( a:'#'; b:'#'; c:'03'; data:'121223' ),
  442.   ( a:'$'; b:'$'; c:'04'; data:'121322' ),
  443.   ( a:'%'; b:'%'; c:'05'; data:'131222' ),
  444.   ( a:'&'; b:'&'; c:'06'; data:'122213' ),
  445.   ( a:''''; b:''''; c:'07'; data:'122312'),
  446.   ( a:'('; b:'('; c:'08'; data:'132212' ),
  447.   ( a:')'; b:')'; c:'09'; data:'221213' ),
  448.   ( a:'*'; b:'*'; c:'10'; data:'221312' ),
  449.   ( a:'+'; b:'+'; c:'11'; data:'231212' ),
  450.   ( a:','; b:','; c:'12'; data:'112232' ),
  451.   ( a:'-'; b:'-'; c:'13'; data:'122132' ),
  452.   ( a:'.'; b:'.'; c:'14'; data:'122231' ),
  453.   ( a:'/'; b:'/'; c:'15'; data:'113222' ),
  454.   ( a:'0'; b:'0'; c:'16'; data:'123122' ),
  455.   ( a:'1'; b:'1'; c:'17'; data:'123221' ),
  456.   ( a:'2'; b:'2'; c:'18'; data:'223211' ),
  457.   ( a:'3'; b:'3'; c:'19'; data:'221132' ),
  458.   ( a:'4'; b:'4'; c:'20'; data:'221231' ),
  459.   ( a:'5'; b:'5'; c:'21'; data:'213212' ),
  460.   ( a:'6'; b:'6'; c:'22'; data:'223112' ),
  461.   ( a:'7'; b:'7'; c:'23'; data:'312131' ),
  462.   ( a:'8'; b:'8'; c:'24'; data:'311222' ),
  463.   ( a:'9'; b:'9'; c:'25'; data:'321122' ),
  464.   ( a:':'; b:':'; c:'26'; data:'321221' ),
  465.   ( a:';'; b:';'; c:'27'; data:'312212' ),
  466.   ( a:'<'; b:'<'; c:'28'; data:'322112' ),
  467.   ( a:'='; b:'='; c:'29'; data:'322211' ),
  468.   ( a:'>'; b:'>'; c:'30'; data:'212123' ),
  469.   ( a:'?'; b:'?'; c:'31'; data:'212321' ),
  470.   ( a:'@'; b:'@'; c:'32'; data:'232121' ),
  471.   ( a:'A'; b:'A'; c:'33'; data:'111323' ),
  472.   ( a:'B'; b:'B'; c:'34'; data:'131123' ),
  473.   ( a:'C'; b:'C'; c:'35'; data:'131321' ),
  474.   ( a:'D'; b:'D'; c:'36'; data:'112313' ),
  475.   ( a:'E'; b:'E'; c:'37'; data:'132113' ),
  476.   ( a:'F'; b:'F'; c:'38'; data:'132311' ),
  477.   ( a:'G'; b:'G'; c:'39'; data:'211313' ),
  478.   ( a:'H'; b:'H'; c:'40'; data:'231113' ),
  479.   ( a:'I'; b:'I'; c:'41'; data:'231311' ),
  480.   ( a:'J'; b:'J'; c:'42'; data:'112133' ),
  481.   ( a:'K'; b:'K'; c:'43'; data:'112331' ),
  482.   ( a:'L'; b:'L'; c:'44'; data:'132131' ),
  483.   ( a:'M'; b:'M'; c:'45'; data:'113123' ),
  484.   ( a:'N'; b:'N'; c:'46'; data:'113321' ),
  485.   ( a:'O'; b:'O'; c:'47'; data:'133121' ),
  486.   ( a:'P'; b:'P'; c:'48'; data:'313121' ),
  487.   ( a:'Q'; b:'Q'; c:'49'; data:'211331' ),
  488.   ( a:'R'; b:'R'; c:'50'; data:'231131' ),
  489.   ( a:'S'; b:'S'; c:'51'; data:'213113' ),
  490.   ( a:'T'; b:'T'; c:'52'; data:'213311' ),
  491.   ( a:'U'; b:'U'; c:'53'; data:'213131' ),
  492.   ( a:'V'; b:'V'; c:'54'; data:'311123' ),
  493.   ( a:'W'; b:'W'; c:'55'; data:'311321' ),
  494.   ( a:'X'; b:'X'; c:'56'; data:'331121' ),
  495.   ( a:'Y'; b:'Y'; c:'57'; data:'312113' ),
  496.   ( a:'Z'; b:'Z'; c:'58'; data:'312311' ),
  497.   ( a:'['; b:'['; c:'59'; data:'332111' ),
  498.   ( a:''; b:''; c:'60'; data:'314111' ),
  499.   ( a:']'; b:']'; c:'61'; data:'221411' ),
  500.   ( a:'^'; b:'^'; c:'62'; data:'431111' ),
  501.   ( a:'_'; b:'_'; c:'63'; data:'111224' ),
  502.   ( a:' '; b:'`'; c:'64'; data:'111422' ),
  503.   ( a:' '; b:'a'; c:'65'; data:'121124' ),
  504.   ( a:' '; b:'b'; c:'66'; data:'121421' ),
  505.   ( a:' '; b:'c'; c:'67'; data:'141122' ),
  506.   ( a:' '; b:'d'; c:'68'; data:'141221' ),
  507.   ( a:' '; b:'e'; c:'69'; data:'112214' ),
  508.   ( a:' '; b:'f'; c:'70'; data:'112412' ),
  509.   ( a:' '; b:'g'; c:'71'; data:'122114' ),
  510.   ( a:' '; b:'h'; c:'72'; data:'122411' ),
  511.   ( a:' '; b:'i'; c:'73'; data:'142112' ),
  512.   ( a:' '; b:'j'; c:'74'; data:'142211' ),
  513.   ( a:' '; b:'k'; c:'75'; data:'241211' ),
  514.   ( a:' '; b:'l'; c:'76'; data:'221114' ),
  515.   ( a:' '; b:'m'; c:'77'; data:'413111' ),
  516.   ( a:' '; b:'n'; c:'78'; data:'241112' ),
  517.   ( a:' '; b:'o'; c:'79'; data:'134111' ),
  518.   ( a:' '; b:'p'; c:'80'; data:'111242' ),
  519.   ( a:' '; b:'q'; c:'81'; data:'121142' ),
  520.   ( a:' '; b:'r'; c:'82'; data:'121241' ),
  521.   ( a:' '; b:'s'; c:'83'; data:'114212' ),
  522.   ( a:' '; b:'t'; c:'84'; data:'124112' ),
  523.   ( a:' '; b:'u'; c:'85'; data:'124211' ),
  524.   ( a:' '; b:'v'; c:'86'; data:'411212' ),
  525.   ( a:' '; b:'w'; c:'87'; data:'421112' ),
  526.   ( a:' '; b:'x'; c:'88'; data:'421211' ),
  527.   ( a:' '; b:'y'; c:'89'; data:'212141' ),
  528.   ( a:' '; b:'z'; c:'90'; data:'214121' ),
  529.   ( a:' '; b:'{'; c:'91'; data:'412121' ),
  530.   ( a:' '; b:'|'; c:'92'; data:'111143' ),
  531.   ( a:' '; b:'}'; c:'93'; data:'111341' ),
  532.   ( a:' '; b:'~'; c:'94'; data:'131141' ),
  533.   ( a:' '; b:' '; c:'95'; data:'114113' ),     { US,DEL,95 }
  534.   ( a:' '; b:' '; c:'96'; data:'114311' ),     { FNC3,FNC3,96 }
  535.   ( a:' '; b:' '; c:'97'; data:'411113' ),     { FNC2,FNC2,97 }
  536.   ( a:' '; b:' '; c:'98'; data:'411311' ),     { Shift,Shift,98 }
  537.   ( a:' '; b:' '; c:'99'; data:'113141' ),     { CodeC,CodeC,99 }
  538.   ( a:' '; b:' '; c:'CB'; data:'114131' ),     { CodeB,FNC4,CodeB }
  539.   ( a:' '; b:' '; c:'CA'; data:'311141' ),     { FNC4,CodeA,CodeA }
  540.   ( a:' '; b:' '; c:'F1'; data:'411131' )      { FNC1 }
  541.   );
  542. StartA = '211412';
  543. StartB = '211214';
  544. StartC = '211232';
  545. Stop   = '2331112';
  546. { Find Code 128 Codeset A or B }
  547. function Find_Code128AB(c:char; const H1_BarType:TBarType):integer;
  548. var
  549.   i:integer;
  550.   v:char;
  551. begin
  552.   for i:=0 to High(tabelle_128) do
  553.   begin
  554.     if H1_BarType = bcCode128A then
  555.       v := tabelle_128[i].a
  556.     else
  557.       v := tabelle_128[i].b;
  558.     if c = v then
  559.     begin
  560.       result := i;
  561.       exit;
  562.     end;
  563.     {Upgrade to 1.7.3 ->}
  564.     if Ord(c) >= 195 then
  565.     begin
  566.       result := Ord(c) - 100;
  567.       exit
  568.     end;
  569.     {Upgrade to 1.7.3 <-}
  570.   end;
  571.   result := -1;
  572. end;
  573. { Find Code 128 Codeset C }
  574. function Find_Code128C(c:string):integer;
  575. var
  576.   i:integer;
  577. begin
  578.   for i:=0 to High(tabelle_128) do begin
  579.     if tabelle_128[i].c = c then begin
  580.      result := i;
  581.      exit;
  582.     end;
  583.   end;
  584.   result := -1;
  585. end;
  586. var
  587.   i, j, idx: integer;
  588.   startcode:string;
  589.   checksum : integer;
  590.   codeword_pos : integer;
  591.   bar: string;
  592. begin
  593.   bar := H_BarCode;
  594.   case H_BarType of
  595.     bcCode128A, bcCodeEAN128A:
  596.       begin checksum := 103; startcode:= StartA; end;
  597.     bcCode128B, bcCodeEAN128B:
  598.       begin checksum := 104; startcode:= StartB; end;
  599.     bcCode128C, bcCodeEAN128C:
  600.       begin checksum := 105; startcode:= StartC; end;
  601.     else
  602.       raise Exception.CreateFmt('%s : %s', ['Code_128 : ',ErrorBarType]);
  603.   end;
  604.   result := startcode;
  605.   codeword_pos := 1;
  606.   case H_BarType of
  607.     bcCodeEAN128A,
  608.     bcCodeEAN128B,
  609.     bcCodeEAN128C:
  610.     begin
  611.       result := result + tabelle_128[102].data;
  612.       Inc(checksum, 102*codeword_pos);
  613.       Inc(codeword_pos);
  614.       if H_CheckSum <> csNone then bar:=DoCheckSumming(H_CheckSum, bar);
  615.     end;
  616.   end;
  617.   if (H_BarType = bcCode128C) or (H_BarType = bccodeEAN128C) then
  618.   begin
  619.     if (Length(bar) mod 2<>0) then bar :='0' + bar;
  620.     for i:=1 to (Length(bar) div 2) do
  621.     begin
  622.       j:=(i-1)*2+1;
  623.       idx:=Find_Code128C(copy(bar,j,2));
  624.       if idx < 0 then idx := Find_Code128C('00');
  625.       result := result + tabelle_128[idx].data;
  626.       Inc(checksum, idx*codeword_pos);
  627.       Inc(codeword_pos);
  628.     end;
  629.   end
  630.   else
  631.     for i:=1 to Length(bar) do
  632.     begin
  633.       idx := Find_Code128AB(bar[i],H_BarType);
  634.       if idx < 0 then
  635.         idx := Find_Code128AB(' ',H_BarType);
  636.       result := result + tabelle_128[idx].data;
  637.       Inc(checksum, idx*codeword_pos);
  638.       Inc(codeword_pos);
  639.     end;
  640.   checksum := checksum mod 103;
  641.   result := result + tabelle_128[checksum].data;
  642.   result := result + Stop;
  643.   Result := Convert(Result);
  644.   H_CheckNum := bar;
  645. end;
  646. {********************}
  647. {  For Code 93       }
  648. {********************}
  649. { Get Code93 data }
  650. function  Code_93(const H_BarCode:string):string;
  651. type TCode93 =
  652.   record
  653.     c : char;
  654.     data : array[0..5] of char;
  655.   end;
  656. const tabelle_93: array[0..46] of TCode93 = (
  657.   ( c:'0'; data:'131112'  ),
  658.   ( c:'1'; data:'111213'  ),
  659.   ( c:'2'; data:'111312'  ),
  660.   ( c:'3'; data:'111411'  ),
  661.   ( c:'4'; data:'121113'  ),
  662.   ( c:'5'; data:'121212'  ),
  663.   ( c:'6'; data:'121311'  ),
  664.   ( c:'7'; data:'111114'  ),
  665.   ( c:'8'; data:'131211'  ),
  666.   ( c:'9'; data:'141111'  ),
  667.   ( c:'A'; data:'211113'  ),
  668.   ( c:'B'; data:'211212'  ),
  669.   ( c:'C'; data:'211311'  ),
  670.   ( c:'D'; data:'221112'  ),
  671.   ( c:'E'; data:'221211'  ),
  672.   ( c:'F'; data:'231111'  ),
  673.   ( c:'G'; data:'112113'  ),
  674.   ( c:'H'; data:'112212'  ),
  675.   ( c:'I'; data:'112311'  ),
  676.   ( c:'J'; data:'122112'  ),
  677.   ( c:'K'; data:'132111'  ),
  678.   ( c:'L'; data:'111123'  ),
  679.   ( c:'M'; data:'111222'  ),
  680.   ( c:'N'; data:'111321'  ),
  681.   ( c:'O'; data:'121122'  ),
  682.   ( c:'P'; data:'131121'  ),
  683.   ( c:'Q'; data:'212112'  ),
  684.   ( c:'R'; data:'212211'  ),
  685.   ( c:'S'; data:'211122'  ),
  686.   ( c:'T'; data:'211221'  ),
  687.   ( c:'U'; data:'221121'  ),
  688.   ( c:'V'; data:'222111'  ),
  689.   ( c:'W'; data:'112122'  ),
  690.   ( c:'X'; data:'112221'  ),
  691.   ( c:'Y'; data:'122121'  ),
  692.   ( c:'Z'; data:'123111'  ),
  693.   ( c:'-'; data:'121131'  ),
  694.   ( c:'.'; data:'311112'  ),
  695.   ( c:' '; data:'311211'  ),
  696.   ( c:'$'; data:'321111'  ),
  697.   ( c:'/'; data:'112131'  ),
  698.   ( c:'+'; data:'113121'  ),
  699.   ( c:'%'; data:'211131'  ),
  700.   ( c:'['; data:'121221'  ),   {only used for Extended Code 93}
  701.   ( c:']'; data:'312111'  ),   {only used for Extended Code 93}
  702.   ( c:'{'; data:'311121'  ),   {only used for Extended Code 93}
  703.   ( c:'}'; data:'122211'  )    {only used for Extended Code 93}
  704.   );
  705. {Find Code 93}
  706. function Find_Code93(c:char):integer;
  707. var
  708.   i:integer;
  709. begin
  710.   for i:=0 to High(tabelle_93) do
  711.   begin
  712.     if c = tabelle_93[i].c then
  713.     begin
  714.       result := i;
  715.       exit;
  716.     end;
  717.   end;
  718.   result := -1;
  719. end;
  720. var
  721.   i, idx : integer;
  722.   checkC, checkK,   {Checksums}
  723.   weightC, weightK : integer;
  724. begin
  725.   result := '111141';   {Startcode}
  726.   for i:=1 to Length(H_BarCode) do
  727.   begin
  728.     idx := Find_Code93(H_BarCode[i]);
  729.     if idx < 0 then
  730.       raise Exception.CreateFmt('%s : %s', [H_BarCode, ErrorCode93]);
  731.     result := result + tabelle_93[idx].data;
  732.   end;
  733.   checkC := 0;
  734.   checkK := 0;
  735.   weightC := 1;
  736.   weightK := 2;
  737.   for i:=Length(H_BarCode) downto 1 do
  738.   begin
  739.     idx := Find_Code93(H_BarCode[i]);
  740.     Inc(checkC, idx*weightC);
  741.     Inc(checkK, idx*weightK);
  742.     Inc(weightC);
  743.     if weightC > 20 then weightC := 1;
  744.     Inc(weightK);
  745.     if weightK > 15 then weightC := 1;
  746.   end;
  747.   Inc(checkK, checkC);
  748.   checkC := checkC mod 47;
  749.   checkK := checkK mod 47;
  750.   result := result + tabelle_93[checkC].data +
  751.     tabelle_93[checkK].data;
  752.   result := result + '1111411';   {Stopcode}
  753.   Result := Convert(Result);
  754. end;
  755. { Get Code93 extended data }
  756. function  Code_93Extended(const H_BarCode:string):string;
  757. const code93x : array[0..127] of string[2] =
  758.   (
  759.   (']U'), ('[A'), ('[B'), ('[C'), ('[D'), ('[E'), ('[F'), ('[G'),
  760.   ('[H'), ('[I'), ('[J'), ('[K'), ('[L'), ('[M'), ('[N'), ('[O'),
  761.   ('[P'), ('[Q'), ('[R'), ('[S'), ('[T'), ('[U'), ('[V'), ('[W'),
  762.   ('[X'), ('[Y'), ('[Z'), (']A'), (']B'), (']C'), (']D'), (']E'),
  763.    (' '), ('{A'), ('{B'), ('{C'), ('{D'), ('{E'), ('{F'), ('{G'),
  764.   ('{H'), ('{I'), ('{J'), ('{K'), ('{L'), ('{M'), ('{N'), ('{O'),
  765.   ( '0'),  ('1'),  ('2'),  ('3'),  ('4'),  ('5'),  ('6'),  ('7'),
  766.    ('8'),  ('9'), ('{Z'), (']F'), (']G'), (']H'), (']I'), (']J'),
  767.   (']V'),  ('A'),  ('B'),  ('C'),  ('D'),  ('E'),  ('F'),  ('G'),
  768.    ('H'),  ('I'),  ('J'),  ('K'),  ('L'),  ('M'),  ('N'),  ('O'),
  769.    ('P'),  ('Q'),  ('R'),  ('S'),  ('T'),  ('U'),  ('V'),  ('W'),
  770.    ('X'),  ('Y'),  ('Z'), (']K'), (']L'), (']M'), (']N'), (']O'),
  771.   (']W'), ('}A'), ('}B'), ('}C'), ('}D'), ('}E'), ('}F'), ('}G'),
  772.   ('}H'), ('}I'), ('}J'), ('}K'), ('}L'), ('}M'), ('}N'), ('}O'),
  773.   ('}P'), ('}Q'), ('}R'), ('}S'), ('}T'), ('}U'), ('}V'), ('}W'),
  774.   ('}X'), ('}Y'), ('}Z'), (']P'), (']Q'), (']R'), (']S'), (']T')
  775.   );
  776. var
  777.   tmp : string;
  778.   i : integer;
  779. begin
  780.   tmp := '';
  781.   for i:=0 to Length(H_BarCode)-1 do
  782.   begin
  783.     if ord(H_BarCode[i]) <= 127 then
  784.       tmp := tmp + code93x[ord(H_BarCode[i])];
  785.   end;
  786.   result := Code_93(tmp);
  787. end;
  788. {********************}
  789. {  For Code MSI      }
  790. {********************}
  791. { Get Code MSI data }
  792. function  Code_MSI(const H_BarCode:string):string;
  793. const tabelle_MSI:array['0'..'9'] of string[8] =
  794.   (
  795.   ( '51515151' ),    {'0'}
  796.   ( '51515160' ),    {'1'}
  797.   ( '51516051' ),    {'2'}
  798.   ( '51516060' ),    {'3'}
  799.   ( '51605151' ),    {'4'}
  800.   ( '51605160' ),    {'5'}
  801.   ( '51606051' ),    {'6'}
  802.   ( '51606060' ),    {'7'}
  803.   ( '60515151' ),    {'8'}
  804.   ( '60515160' )     {'9'}
  805.   );
  806. var
  807.   i:integer;
  808.   check_even, check_odd, checksum:integer;
  809. begin
  810.   result := '60';    {Startcode}
  811.   check_even := 0;
  812.   check_odd  := 0;
  813.   for i:=1 to Length(H_BarCode) do
  814.   begin
  815.     if odd(i-1) then
  816.       check_odd := check_odd*10+ord(H_BarCode[i])
  817.     else
  818.       check_even := check_even+ord(H_BarCode[i]);
  819.     result := result + tabelle_MSI[H_BarCode[i]];
  820.   end;
  821.   checksum := quersumme(check_odd*2) + check_even;
  822.   checksum := checksum mod 10;
  823.   if checksum > 0 then
  824.     checksum := 10-checksum;
  825.   result := result + tabelle_MSI[chr(ord('0')+checksum)];
  826.   result := result + '515'; {Stopcode}
  827. end;
  828. {********************}
  829. {  For Post Net      }
  830. {********************}
  831. { Get Post Net data }
  832. function  Code_PostNet(const H_BarCode:string):string;
  833. const tabelle_PostNet:array['0'..'9'] of string[10] =
  834.   (
  835.   ( '5151A1A1A1' ),    {'0'}
  836.   ( 'A1A1A15151' ),    {'1'}
  837.   ( 'A1A151A151' ),    {'2'}
  838.   ( 'A1A15151A1' ),    {'3'}
  839.   ( 'A151A1A151' ),    {'4'}
  840.   ( 'A151A151A1' ),    {'5'}
  841.   ( 'A15151A1A1' ),    {'6'}
  842.   ( '51A1A1A151' ),    {'7'}
  843.   ( '51A1A151A1' ),    {'8'}
  844.   ( '51A151A1A1' )     {'9'}
  845.   );
  846. var
  847.   i:integer;
  848. begin
  849.   result := '51';
  850.   for i:=1 to Length(H_BarCode) do
  851.   begin
  852.     result := result + tabelle_PostNet[H_BarCode[i]];
  853.   end;
  854.   result := result + '5';
  855. end;
  856. {********************}
  857. {  For Codabar       }
  858. {********************}
  859. { Get Codabar data }
  860. function  Code_Codabar(const H_BarCode:string):string;
  861. type TCodabar =
  862.   record
  863.     c : char;
  864.     data : array[0..6] of char;
  865.   end;
  866. const tabelle_cb: array[0..19] of TCodabar = (
  867.   ( c:'1'; data:'5050615'  ),
  868.   ( c:'2'; data:'5051506'  ),
  869.   ( c:'3'; data:'6150505'  ),
  870.   ( c:'4'; data:'5060515'  ),
  871.   ( c:'5'; data:'6050515'  ),
  872.   ( c:'6'; data:'5150506'  ),
  873.   ( c:'7'; data:'5150605'  ),
  874.   ( c:'8'; data:'5160505'  ),
  875.   ( c:'9'; data:'6051505'  ),
  876.   ( c:'0'; data:'5050516'  ),
  877.   ( c:'-'; data:'5051605'  ),
  878.   ( c:'$'; data:'5061505'  ),
  879.   ( c:':'; data:'6050606'  ),
  880.   ( c:'/'; data:'6060506'  ),
  881.   ( c:'.'; data:'6060605'  ),
  882.   ( c:'+'; data:'5060606'  ),
  883.   ( c:'A'; data:'5061515'  ),
  884.   ( c:'B'; data:'5151506'  ),
  885.   ( c:'C'; data:'5051516'  ),
  886.   ( c:'D'; data:'5051615'  )
  887.   );
  888. {find Codabar}
  889. function Find_Codabar(c:char):integer;
  890. var
  891.   i:integer;
  892. begin
  893.   for i:=0 to High(tabelle_cb) do
  894.   begin
  895.     if c = tabelle_cb[i].c then
  896.     begin
  897.       result := i;
  898.       exit;
  899.     end;
  900.   end;
  901.   result := -1;
  902. end;
  903. var
  904.   i, idx : integer;
  905. begin
  906.   result := tabelle_cb[Find_Codabar('A')].data + '0';
  907.   for i:=1 to Length(H_BarCode) do
  908.   begin
  909.     idx := Find_Codabar(H_BarCode[i]);
  910.     result := result + tabelle_cb[idx].data + '0';
  911.   end;
  912.   result := result + tabelle_cb[Find_Codabar('B')].data;
  913. end;
  914. {********************}
  915. {  For Code UPC      }
  916. {********************}
  917. { Get Code UPC A data }
  918. function  Code_UPC_A(const H_BarCode:string; const H_CheckSum:TCheckSum;
  919.   var H_CheckNum:string):string;
  920. var
  921.   i : Integer;
  922.   tmp, bar : string;
  923. begin
  924.   bar := SetLen(12,H_BarCode);
  925.   if H_CheckSum<>csNone then
  926.     tmp:=DoCheckSumming(H_CheckSum, copy(bar,1,11))
  927.   else
  928.     tmp:=bar;
  929.   if H_CheckSum<>csNone then H_CheckNum := tmp;
  930.   result := '505';
  931.   for i:=1 to 6 do
  932.     result := result + tabelle_EAN_A[tmp[i]];
  933.   result := result + '05050';
  934.   for i:=7 to 12 do
  935.     result := result + tabelle_EAN_C[tmp[i]];
  936.   result := result + '505';
  937. end;
  938. {UPC E Parity Pattern Table , Number System 0}
  939. const tabelle_UPC_E0:array['0'..'9', 1..6] of char =
  940.   (
  941.   ('E', 'E', 'E', 'o', 'o', 'o' ),    { 0 }
  942.   ('E', 'E', 'o', 'E', 'o', 'o' ),    { 1 }
  943.   ('E', 'E', 'o', 'o', 'E', 'o' ),    { 2 }
  944.   ('E', 'E', 'o', 'o', 'o', 'E' ),    { 3 }
  945.   ('E', 'o', 'E', 'E', 'o', 'o' ),    { 4 }
  946.   ('E', 'o', 'o', 'E', 'E', 'o' ),    { 5 }
  947.   ('E', 'o', 'o', 'o', 'E', 'E' ),    { 6 }
  948.   ('E', 'o', 'E', 'o', 'E', 'o' ),    { 7 }
  949.   ('E', 'o', 'E', 'o', 'o', 'E' ),    { 8 }
  950.   ('E', 'o', 'o', 'E', 'o', 'E' )     { 9 }
  951.   );
  952. { Get Code UPC E0 data }
  953. function  Code_UPC_E0(const H_BarCode:string; const H_CheckSum:TCheckSum;
  954.   var H_CheckNum:string):string;
  955. var
  956.   i,j : integer;
  957.   tmp, bar : string;
  958.   c   : char;
  959. begin
  960.   bar := SetLen(7,H_BarCode);
  961.   tmp:=DoCheckSumming(H_CheckSum, Copy(bar,1,6));
  962.   c:=tmp[7];
  963.   if H_CheckSum<>csNone then H_CheckNum:=tmp else tmp := bar;
  964.   result := '505';
  965.   for i:=1 to 6 do
  966.   begin
  967.     if tabelle_UPC_E0[c,i]='E' then
  968.     begin
  969.       for j:= 1 to 4 do result := result + tabelle_EAN_C[tmp[i],5-j];
  970.     end
  971.     else
  972.     begin
  973.       result := result + tabelle_EAN_A[tmp[i]];
  974.     end;
  975.   end;
  976.   result := result + '050505';
  977. end;
  978. { Get Code UPC E1 data }
  979. function  Code_UPC_E1(const H_BarCode:string; const H_CheckSum:TCheckSum;
  980.   var H_CheckNum:string):string;
  981. var
  982.   i,j : integer;
  983.   tmp,bar : string;
  984.   c   : char;
  985. begin
  986.   bar := SetLen(7,H_BarCode);
  987.   tmp :=DoCheckSumming(H_CheckSum, copy(bar,1,6));
  988.   c:=tmp[7];
  989.   if H_CheckSum<>csNone then H_CheckNum:=tmp else tmp := bar;
  990.   result := '505';
  991.   for i:=1 to 6 do
  992.   begin
  993.     if tabelle_UPC_E0[c,i]='E' then
  994.     begin
  995.       result := result + tabelle_EAN_A[tmp[i]];
  996.     end
  997.     else
  998.     begin
  999.       for j:= 1 to 4 do result := result + tabelle_EAN_C[tmp[i],5-j];
  1000.     end;
  1001.   end;
  1002.   result := result + '050505';
  1003. end;
  1004. { Get Code UPC Supp5 data }
  1005. function  Code_Supp5(const H_BarCode:string; const H_CheckSum:TCheckSum;
  1006.   var H_CheckNum:string):string;
  1007. var
  1008.   i,j : Integer;
  1009.   tmp, bar : string;
  1010.   c   : Char;
  1011. begin
  1012.   bar := SetLen(5,H_BarCode);
  1013.   tmp:=getSupp(copy(bar,1,5)+'0');
  1014.   c:=tmp[6];
  1015.   if H_CheckSum<>csNone then H_CheckNum:=tmp else tmp := bar;
  1016.   result := '506';   {Startcode}
  1017.   for i:=1 to 5 do
  1018.   begin
  1019.     if tabelle_UPC_E0[c,(6-5)+i]='E' then
  1020.     begin
  1021.       for j:= 1 to 4 do result := result + tabelle_EAN_C[tmp[i],5-j];
  1022.     end
  1023.     else
  1024.     begin
  1025.       result := result + tabelle_EAN_A[tmp[i]];
  1026.     end;
  1027.     if i<5 then result:=result+'05'; { character delineator }
  1028.   end;
  1029. end;
  1030. { Get Code UPC Supp2 data }
  1031. function  Code_Supp2(const H_BarCode:string; const H_CheckSum:TCheckSum;
  1032.   var H_CheckNum:string):string;
  1033. var
  1034.   i,j : integer;
  1035.   tmp, mS, bar: string;
  1036. begin
  1037.   bar := SetLen(2,H_BarCode);
  1038.   i:=StrToInt(bar);
  1039.   case i mod 4 of
  1040.     3: mS:='EE';
  1041.     2: mS:='Eo';
  1042.     1: mS:='oE';
  1043.     0: mS:='oo';
  1044.   end;
  1045.   tmp:=getSupp(copy(bar,1,5)+'0');
  1046.   if H_CheckSum<>csNone then H_CheckNum:=tmp else tmp := bar;
  1047.   result := '506';
  1048.   for i:=1 to 2 do
  1049.   begin
  1050.     if mS[i]='E' then
  1051.     begin
  1052.       for j:= 1 to 4 do result := result + tabelle_EAN_C[tmp[i],5-j];
  1053.     end
  1054.     else
  1055.     begin
  1056.       result := result + tabelle_EAN_A[tmp[i]];
  1057.     end;
  1058.     if i<2 then result:=result+'05';
  1059.   end;
  1060. end;