Cách tạo ra mã vạch EAN-13

Một phần của tài liệu hệ thống quản lý siêu thị mini bằng mã vạch (Trang 25)

IV. TÌM HIỂU VỀ MÃ VẠCH

5. Cách tạo ra mã vạch EAN-13

Bắt đầu

Nhập mã quốc gia Nhập mã nhà sản xuất

Nhập mã hàng hóa

Kiểm tra Báo lỗi

Tính tổng tạo ra số thứ 13

Kiểm tra Xác định số đầu tiên

trong dãy số Dựa mã quốc gia xác định tính chẳn, lẻ

Hàm chuyển mã hàng hóa thành chuổi đồ họa

H th ng qu n lý siêu th mini b ng mã v ch

GVHD: Nguyễn Thái Nghe 18

- Các hàm s dng trong quy trình

False

True

True False

True

- Đầu tiên tạo Class EAN-13 bao gồm:

+ To mt s biến quan trng cn s dng trong Class:

Begin Input CountryCode Input ManufacturerCode Check Error CalculateChecksumDigit Check ConvertLeftPattern CountryCode ConvertToDigitPatterns DrawEan13Barcode Finish

H th ng qu n lý siêu th mini b ng mã v ch

GVHD: Nguyễn Thái Nghe 19

Các _fWidth, _fHeight, _fFontSize,_fSacle làbiến được khởi tạo với kích thước chiều cao, chiều rộng, kiểu chữ, kích cỡ mã vạch.

Các biến _aOddLeft, _aEvenLeft, _aRight, _sQuiteZone là tất cả các cơ quan đại diện của chuỗi đồ họa / không gian, đại diện cho các phần khác nhau của một mã vạch EAN-13. Về cơ bản, "1" đại diện cho một đường đen và một '0' đại diện cho một không gian. Một phương pháp thay thếđể sử dụng một chuỗi có thểđược sử dụng một biểu diễn nhị phân, nơi một bit 0 sẽ là một không gian và một bít 1 là một vạch đen. _sLeadTail đại diện cho vạch biên và _sSeparator đại diện cho vạch giữa.

// Khởi tạo một số biến cần dùng

privatefloat _fWidth = 29.29f;

privatefloat _fHeight = 8.93f;

privatefloat _fFontSize = 6.0f;

privatefloat _fScale = 1.0f;

privatestring[] _aOddLeft = { "0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011","0110111", "0001011" };

privatestring[] _aEvenLeft = { "0100111", "0110011", "0011011", "0100001", "0011101", "0111001", "0000101", "0010001","0001001", "0010111" };

privatestring[] _aRight = { "1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100","1001000", "1110100" };

privatestring _sQuiteZone = "000000000";

privatestring _sLeadTail = "101";

privatestring _sSeparator = "01010";

privatestring _sCountryCode = "00";

privatestring _sManufacturerCode;

privatestring _sProductCode;

privatestring _sChecksumDigit;

+ Viết hàm v mã vch EAN-13 lên trên picturebox trong winform:

Bước đầu tiên cho chức năng DrawEan13 là tạo ra một thể hiện của lớp Ean13, và sau đó thiết lập các mã quốc gia, mã nhà sản xuất, mã sản phẩm, và mã kiểm tra (được tính ở hàm CalculateChecksumDigit). Một khi các thuộc tính được thiết lập, khi thao tác được thực hiện thì tác động chức năng DrawEan13Barcode được thực hiện, thông qua một đối tượng đồ họa và một điểm, mà chỉ ra vị trí bắt đầu để vẽ, điều này sẽ tạo ra các mã vạch được rút ra trong hộp hình ảnh bắt đầu từđiểm (0, 0).

privatevoid DrawEan13( ) {

System.Drawing.Graphics g = this.picBarcode.CreateGraphics( );

g.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.SystemColors.Control), new Rectangle(0, 0, picBarcode.Width, picBarcode.Height));

H th ng qu n lý siêu th mini b ng mã v ch

GVHD: Nguyễn Thái Nghe 20

upc = new Ean13( ); upc.CountryCode = " "; upc.ManufacturerCode = " "; upc.ProductCode = " ";

upc.Scale = (float)Convert.ToDecimal(cboScale.Items [cboScale.SelectedIndex]); upc.DrawEan13Barcode( g, new System.Drawing.Point( 0, 0 ) ;

g.Dispose( ); }

+ Viết hàm to ta s kim tra s cui cùng (ChecksumDigit)

Chức năng đầu tiên DrawEan13Barcode gi hàm CalculateChecksumDigit,

trong đó sử dụng mã quốc gia, mã nhà sản xuất, và mã sản phẩm để tính toán kiểm tra tổng hợp của mã vạch.

publicvoid CalculateChecksumDigit( ) {

// cộng các mã số của mã quốc gia, nhà sản xuất, mã sản phẩm

string sTemp = this.CountryCode + this.ManufacturerCode + this.ProductCode; int iSum = 0;

int iDigit = 0

for( int i = sTemp.Length; i >= 1; i-- ) {

iDigit = Convert.ToInt32( sTemp.Substring( i - 1, 1 ) )

// chuyển sang kiểu số if( i % 2 == 0 ) // nếu là số chẳn nhân cho 3 { iSum += iDigit * 3; } else { iSum += iDigit * 1; } }

int iCheckSum = ( 10 - ( iSum % 10 ) ) % 10; this.ChecksumDigit = iCheckSum.ToString( ); }

+ Viết hàm chuyn các s cá nhân ca nhà sn xut, mã sn phm thành chui đại din ca đồ ha mã vch.

Tiếp đến ta sử dụng hàm ConvertToDigitPattern chức năng này có số cá nhân của mã quốc gia, mã nhà sản xuất, và mã sản phẩm, chuyển đổi chúng thành các chuỗi mã nhị phân đại diện của đồ họa mã vạch (được xác định trong bảng Chuyển đổi giá

trị số sang mã nhị phân).

privatestring ConvertToDigitPatterns(string inputNumber, string [] patterns) {

H th ng qu n lý siêu th mini b ng mã v ch

GVHD: Nguyễn Thái Nghe 21

int iIndex = 0;

for( int i = 0; i < inputNumber.Length; i++ ) {

iIndex = Convert.ToInt32( inputNumber.Substring( i, 1 ) ); sbTemp.Append( patterns[iIndex] );

}

return sbTemp.ToString( ); }

+ Hàm ConvertToDigitPatterns chc năng yêu cu hai thông s:

inputNumber

patterns

Các inputNumber sẽ là một trong hai số nhà sản xuất, hoặc mã sản phẩm, và các mô hình sẽ là_aOddLeft, _aEvenLeft, hoặc mảng _aRight tùy thuộc vào việc inputNumber là số nhà sản xuất hoặc mã sản phẩm.

Các ConvertLeftPatterns được sử dụng để tạo ra các mô hình được xem xét trong bảng xác định số chẵn lẻ. Các ConvertLeftPatterns xác định mã quốc gia, và dựa và mã quốc gia để xác định tính chẳn lẻ của sáu số tiếp theo các thao tác chuyển

đổi mã quốc gia thích hợp.

privatestring ConvertLeftPattern( string sLeft ) {

switch( sLeft.Substring( 0, 1 ) ) {

case "0":

return CountryCode0( sLeft.Substring( 1 ) );

case "1":

return CountryCode1( sLeft.Substring( 1 ) ); case "2":

return CountryCode2( sLeft.Substring( 1 ) ); case "3":

return CountryCode3( sLeft.Substring( 1 ) ); case "4":

return CountryCode4( sLeft.Substring( 1 ) ); case "5":

return CountryCode5( sLeft.Substring( 1 ) ); case "6":

H th ng qu n lý siêu th mini b ng mã v ch

GVHD: Nguyễn Thái Nghe 22

case "7":

return CountryCode7( sLeft.Substring( 1 ) ); case "8":

return CountryCode8( sLeft.Substring( 1 ) ); case "9":

return CountryCode9( sLeft.Substring( 1 ) ); default:

return ""; }

}

Mỗi mã quốc gia có chức năng chuyển đổi riêng biệt của nó. CountryCode0 là một mã vạch UPC-A do đó, nó sẽ chỉ sử dụng các mô hình lẻ chẵn lẻ trong bảng xác

định số chẳn lẻ. CountryCode1 qua CountryCode9 từng sử dụng các mô hình cân bằng thích hợp được xét trong phần xác định số chẵn lẻ.

privatestring CountryCode1( string sLeft ) {

System.Text.StringBuilder sReturn = new StringBuilder( );

sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 0, 1 ), this._aOddLeft ) ); sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 1, 1 ), this._aOddLeft ) );

sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 2, 1 ), this._aEvenLeft ) ) sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 3, 1 ), this._aOddLeft ) ); sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 4, 1 ), this._aEvenLeft ) ); sReturn.Append( ConvertToDigitPatterns( sLeft.Substring( 5, 1 ), this._aEvenLeft ) ); return sReturn.ToString( );

}

+ Cui cùng viết hàm DrawEan13Barcode to mã vch kèm theo mã sn phm, tên sn phm, đơn giá.

Các chức năng sử dụng các chức năng CalculateChecksumDigit để tính toán số

kiểm tra tổng hợp chính xác, hàm ConvertLeftPatterns được thực hiện, và sau đó là chức năng ConvertToDigitPatterns được sử dụng để chuyển đổi mã sản phẩm và kiểm tra số tổng của các số mã vạch EAN-13 thành một chuỗi.

Khi mã hàng hóa đã được chuyển đổi sang một chuỗi đại diện, các mã sử dụng chuỗi đại diện để làm cho mã vạch, 1 sẽ tạo ra những vạch mà đen, và 0 sẽ tạo ra các không gian trống của hình. Nếu mã vẽ một hình chữ nhật, nó cũng sẽđưa vào xem xét

để điều chỉnh hình chữ nhật để cho phép không gian cho số của nhà sản xuất và mã sản phẩm. Một khi mã vạch đầu tiên được tạo ra, các mã sau đó xác định vị trí và tiếp tục tạo ra.

publicvoid DrawEan13Barcode(System.Drawing.Graphics g, System.Drawing.Point pt) {

H th ng qu n lý siêu th mini b ng mã v ch

GVHD: Nguyễn Thái Nghe 23

float width = this.Width * this.Scale; float height = this.Height * this.Scale; float lineWidth = width / 113f;

System.Drawing.Drawing2D.GraphicsState gs = g.Save(); g.PageUnit = System.Drawing.GraphicsUnit.Millimeter; g.PageScale = 1;

System.Drawing.SolidBrush brush = new

System.Drawing.SolidBrush(System.Drawing.Color.Black); float xPosition = 0;

System.Text.StringBuilder strbEAN13 = new System.Text.StringBuilder(); System.Text.StringBuilder sbTemp = new System.Text.StringBuilder(); float xStart = pt.X;

float yStart = pt.Y; float xEnd = 0;

System.Drawing.Font font = new System.Drawing.Font("Arial", this._fFontSize *

this.Scale); // Tính chữ số thứ 13 this.CalculateChecksumDigit(); sbTemp.AppendFormat("{0}{1}{2}{3}", this.CountryCode, this.ManufacturerCode, this.ProductCode, this.ChecksumDigit);

string sTemp = sbTemp.ToString(); string sLeftPattern = " "

sLeftPattern = ConvertLeftPattern(sTemp.Substring(0, 7)); strbEAN13.AppendFormat("{0}{1}{2}{3}{4}{1}{0}",

this._sQuiteZone, this._sLeadTail, sLeftPattern, this._sSeparator, ConvertToDigitPatterns(sTemp.Substring(7), this._aRight)); string sTempUPC = strbEAN13.ToString();

float fTextHeight = g.MeasureString(sTempUPC, font).Height;

// vẽ các đường của mã vạch

for (int i = 0; i < strbEAN13.Length; i++) { if (sTempUPC.Substring(i, 1) == "1") { if (xStart == pt.X) xStart = xPosition+15; // Lưu các mã sản phẩm dưới mã vạch

if ((i > 12 && i < 55) || (i > 57 && i < 101))

g.FillRectangle(brush, xPosition+15, yStart, lineWidth, height ,fTextHeight) els

H th ng qu n lý siêu th mini b ng mã v ch

GVHD: Nguyễn Thái Nghe 24

g.FillRectangle(brush, xPosition+15, yStart, lineWidth, height); }

xPosition += lineWidth; xEnd = xPosition;

//Vẽđầy đủ các số dưới mã vạch

xPosition = xStart- g.MeasureString(this.CountryCode.Substring(0, 1), font).Width; float yPosition = yStart +(height - fTextHeight);

// Vẽ chữ số của mã quốc gia

g.DrawString(sTemp.Substring(0, 1), font, brush, new

System.Drawing.PointF(xPosition, yPosition));

xPosition += (g.MeasureString(sTemp.Substring(0, 1), font).Width + 43 * lineWidth) (g.MeasureString(sTemp.Substring(1, 6), font).Width);

g.DrawString(sTemp.Substring(1, 6), font, brush, new

System.Drawing.PointF(xPosition, yPosition));

xPosition += g.MeasureString(sTemp.Substring(1, 6), font).Width + (11 * lineWidth);

// Vẽ chữ số của mã nhà sản xuất

g.DrawString(sTemp.Substring(7), font, brush, new

System.Drawing.PointF(xPosition, yPosition));

// Vẽ tên của hàng hóa

float xPosition1 = (xStart+3) - g.MeasureString(this.CountryCode.Substring(0, 1), font).Width;

float yPosition1 = yStart - 3;

g.DrawString(bien._tenH.Substring(0), font, brush, new

System.Drawing.PointF(xPosition1, yPosition1));

xPosition1 += (g.MeasureString(bien._tenH.Substring(0), font).Width + 1 * lineWidth) - (g.MeasureString(bien._tenH.Substring(0), font).Width);

// Vẽ giá của mặt hàng

float xPosition2 = xStart +1 + g.MeasureString(this.CountryCode.Substring(0, 1), font).Width;

float yPosition2 = yStart + 10;

g.DrawString(bien._ten.Substring(0), font, brush, new

System.Drawing.PointF(xPosition2, yPosition2));

xPosition2 += g.MeasureString(bien._ten.Substring(0), font).Width + (1 * lineWidth) - (g.MeasureString(bien._ten.Substring(0), font).Width); ;

float xPosition3 = xStart +6 + g.MeasureString(this.CountryCode.Substring(0, 1), font).Width;

float yPosition3 = yStart + 10;

g.DrawString(bien._gia.Substring(0), font, brush, new

System.Drawing.PointF(xPosition3, yPosition3));

xPosition3 += (g.MeasureString(bien._gia.Substring(0), font).Width + 1 * lineWidth) - (g.MeasureString(bien._gia.Substring(0), font).Width);

H th ng qu n lý siêu th mini b ng mã v ch

GVHD: Nguyễn Thái Nghe 25

float yPosition4 = yStart + 10;

g.DrawString(bien._dong.Substring(0), font, brush, new

System.Drawing.PointF(xPosition4, yPosition4)); g.Restore(gs);

}

Một phần của tài liệu hệ thống quản lý siêu thị mini bằng mã vạch (Trang 25)

Tải bản đầy đủ (PDF)

(87 trang)