algorytm.org

Implementacja w Delphi/Pascal



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

UPC-E - Implementacja w Delphi/Pascal
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 29 sierpnia 2007 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 UPC-E
// www.algorytm.org
// (c)2007 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;
    function Check: Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  UPCE : array [0..7] of Byte;
  bars : array [0..50] of Byte;

  parityTable : array [0..1] of array [0..9] of array [0..5] of Byte = (
        (
                (1, 1, 1, 0, 0, 0),
                (1, 1, 0, 1, 0, 0),
                (1, 1, 0, 0, 1, 0),
                (1, 1, 0, 0, 0, 1),
                (1, 0, 1, 1, 0, 0),
                (1, 0, 0, 1, 1, 0),
                (1, 0, 0, 0, 1, 1),
                (1, 0, 1, 0, 1, 0),
                (1, 0, 1, 0, 0, 1),
                (1, 0, 0, 1, 0, 1)
        ),
        (
                (0, 0, 0, 1, 1, 1),
                (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)
        )
  );

  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)
                )
        );

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
        i, j : Integer;
begin


        if Length(Kod.Text) <> 8 then
            begin
                ShowMessage('Incorrect UPC-E number');
                exit;
            end;

        for i:=0 to 7 do
                UPCE[i] := StrToInt(Kod.Text[i+1]);

        for i:=0 to 50 do
                bars[i] := 0;

        if Check() = false then
            begin
                ShowMessage('Incorrect UPCE number');
                exit;
            end;

        bars[0] := 1;
        bars[1] := 0;
        bars[2] := 1;

        for i:=1 to 6 do
                for j:=0 to 6 do
                        bars[(i-1)*7 + 3 + j] := leftValues[parityTable[UPCE[0], UPCE[7], i-1], UPCE[i], j];

        bars[45] := 0;
        bars[46] := 1;
        bars[47] := 0;
        bars[48] := 1;
        bars[49] := 0;
        bars[50] := 1;

        DrawBars;

end;

procedure TForm1.DrawBars;
var
        i, length : Integer;
begin


        Image1.Canvas.Brush.Color := clWhite;
        Image1.Canvas.Rectangle(0, 0, 225, 121);
        Image1.Canvas.Brush.Color := clBlack;
        for i:=0 to 94 do
           begin
                if (((i >= 0) and (i<= 2)) or
                    ((i >= 45) and (i<= 50))) then
                    length := 110
                else
                    length := 100;
                if bars[i] = 1 then
                        Image1.Canvas.Rectangle(i*2 + 20, 10, i*2 + 22, length);
           end;

        Image1.Canvas.Font.Size := 10;
        Image1.Canvas.Brush.Color := clWhite;
        Image1.Canvas.Font.Color := clBlack;
        for i:=1 to 6 do
                Image1.Canvas.TextOut(i*14 + 16, 100, IntToStr(UPCE[i]));

        Image1.Canvas.TextOut(7, 90, IntToStr(UPCE[0]));
        Image1.Canvas.TextOut(125, 90, IntToStr(UPCE[7]));
end;


function TForm1.Check: Boolean;
var
        sum: Integer;
        upca: array [1..12] of Integer;
begin

   //check system number
   if ((upce[0] <> 0) and (upce[0] <> 1)) then
   begin
      Result := False;
      exit;
   end;

   //convert UPC-E to UPC-A
   if ((upce[6] >= 0) and (upce[6] <= 2)) then
   begin
      upca[4] := upce[7];
      upca[5] := 0;
      upca[6] := 0;
      upca[7] := 0;
      upca[8] := 0;
      upca[9] := upce[4];
      upca[10] := upce[5];
      upca[11] := upce[6];
   end
   else if ((upce[6] = 3) and (upce[3] >= 3) and (upce[3] <= 9)) then
   begin
      upca[4] := upce[4];
      upca[5] := 0;
      upca[6] := 0;
      upca[7] := 0;
      upca[8] := 0;
      upca[9] := 0;
      upca[10] := upce[5];
      upca[11] := upce[6];
   end
   else if (upce[6] = 4) then
   begin
      upca[4] := upce[4];
      upca[5] := upce[5];
      upca[6] := 0;
      upca[7] := 0;
      upca[8] := 0;
      upca[9] := 0;
      upca[10] := 0;
      upca[11] := upce[6];
   end
   else if ((upce[6] >= 5) and (upce[6] <= 9)) then
   begin
      upca[4] := upce[4];
      upca[5] := upce[5];
      upca[6] := upce[6];
      upca[7] := 0;
      upca[8] := 0;
      upca[9] := 0;
      upca[10] := 0;
      upca[11] := upce[7];
   end
   else
   begin
      Result := false;
      exit;
   end;

   //copy two first digits of producer code
   upca[2] := upce[1];
   upca[3] := upce[2];

   //copy system numer and chec digit
   upca[1] := upce[0];
   upca[12] := upce[7];
   
   //control check digit
      sum := 3 * upca[1] +
             1 * upca[2] +
             3 * upca[3] +
             1 * upca[4] +
             3 * upca[5] +
             1 * upca[6] +
             3 * upca[7] +
             1 * upca[8] +
             3 * upca[9] +
             1 * upca[10] +
             3 * upca[11];
   sum := sum mod 10;
   sum := 10 - sum;
   sum := sum mod 10;
   if (sum <> upca[12]) then
      Result := false
   else
      Result := true;


end;

end.
Dodaj komentarz