Nadesłany przez Tomasz Lubiński, 27 grudnia 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
Kody Kreskowe - Delphi/Unit1.pas:
//--------------------------------------------------------------------------- // Generowanie kodow kreskowych EAN2 // www.algorytm.org // (c)2005 Tomasz Lubinski unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Button1: TButton; Kod: TEdit; procedure Button1Click(Sender: TObject); private procedure DrawBars; { Private declarations } public { Public declarations } end; var Form1: TForm1; EAN2 : array [0..1] of Byte; bars : array [0..19] of Byte; parityTable : array [0..9] of array [0..5] of Byte = ( (0, 0, 0, 0, 0, 0), (0, 0, 1, 0, 1, 1), (0, 0, 1, 1, 0, 1), (0, 0, 1, 1, 1, 0), (0, 1, 0, 0, 1, 1), (0, 1, 1, 0, 0, 1), (0, 1, 1, 1, 0, 0), (0, 1, 0, 1, 0, 1), (0, 1, 0, 1, 1, 0), (0, 1, 1, 0, 1, 0) ); rightValues : array [0..9] of array [0..6] of Byte = ( (1, 1, 1, 0, 0, 1, 0), (1, 1, 0, 0, 1, 1, 0), (1, 1, 0, 1, 1, 0, 0), (1, 0, 0, 0, 0, 1, 0), (1, 0, 1, 1, 1, 0, 0), (1, 0, 0, 1, 1, 1, 0), (1, 0, 1, 0, 0, 0, 0), (1, 0, 0, 0, 1, 0, 0), (1, 0, 0, 1, 0, 0, 0), (1, 1, 1, 0, 1, 0, 0) ); leftValues : array [0..1] of array [0..9] of array [0..6] of Byte = ( ( (0, 0, 0, 1, 1, 0, 1), (0, 0, 1, 1, 0, 0, 1), (0, 0, 1, 0, 0, 1, 1), (0, 1, 1, 1, 1, 0, 1), (0, 1, 0, 0, 0, 1, 1), (0, 1, 1, 0, 0, 0, 1), (0, 1, 0, 1, 1, 1, 1), (0, 1, 1, 1, 0, 1, 1), (0, 1, 1, 0, 1, 1, 1), (0, 0, 0, 1, 0, 1, 1) ), ( (0, 1, 0, 0, 1, 1, 1), (0, 1, 1, 0, 0, 1, 1), (0, 0, 1, 1, 0, 1, 1), (0, 1, 0, 0, 0, 0, 1), (0, 0, 1, 1, 1, 0, 1), (0, 1, 1, 1, 0, 0 ,1), (0, 0, 0, 0, 1, 0, 1), (0, 0, 1, 0, 0, 0 ,1), (0, 0, 0, 1, 0, 0, 1), (0, 0, 1, 0, 1, 1, 1) ) ); checksumTable: array [0..3] of array [0..1] of Byte = ( (0, 0), (0, 1), (1, 0), (1, 1) ); implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var i, j,addCheckSum : Integer; begin if Length(Kod.Text) <> 2 then begin ShowMessage('Incorrect EAN2 number'); exit; end; for i:=0 to 1 do EAN2[i] := StrToInt(Kod.Text[i+1]); for i:=0 to 19 do bars[i] := 0; addCheckSum := EAN2[0]*10 + EAN2[1]; addCheckSum := (addCheckSum mod 4); bars[0] := 1; bars[1] := 0; bars[2] := 1; bars[3] := 1; for i:=0 to 1 do begin for j:=0 to 7 do bars[i*9 + 4 + j] := leftValues[checksumTable[addCheckSum, i], EAN2[i], j]; if i<1 then begin bars[i*9 + 11] := 0; bars[i*9 + 12] := 1; end; end; DrawBars; end; procedure TForm1.DrawBars; var i: Integer; begin Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.Rectangle(0, 0, 121, 121); Image1.Canvas.Brush.Color := clBlack; Image1.Canvas.Font.Size := 10; Image1.Canvas.Brush.Color := clWhite; Image1.Canvas.Font.Color := clBlack; for i:=0 to 19 do if bars[i] = 1 then Image1.Canvas.Rectangle(i*2 + 20, 40, i*2 + 22, 100); for i:=0 to 1 do Image1.Canvas.TextOut(i*16 + 26, 20, IntToStr(EAN2[i])); end; end.