請問一下條碼 code 128 這種解法哪裡出錯了呢? |
|
easonhuang
一般會員 發表:3 回覆:4 積分:1 註冊:2005-10-11 發送簡訊給我 |
以下是網站上找到的CODE 128解法,但是我在RUN報表時條碼的第一個數字會呈現亂碼。
附件檔案為條碼跑出來的圖案, 有沒有高手知道要怎麼改這支程式才不會出現亂碼呢? unit Encoder; interface uses SysUtils; type TEncoder = class private I: Integer; StrLen: Integer; Sum: Integer; CurrSet: Integer; CurrChar: Integer; NextChar: Integer; EncodedMessage: AnsiString; Weight: Integer; Buf: array[0..255] of Char; procedure GeneralEncode(); public constructor Create; overload; function Code128Auto( Src: string): string; function Code128A( Src: string): string; function Code128B( Src: string): string; function Code128C( Src: string): string; function UCCEAN128( Src: string): string; end; implementation constructor TEncoder.Create; begin inherited; end; procedure TEncoder.GeneralEncode(); var tmp: Integer; CurrDone: boolean; begin I := 1; while (I <= StrLen) do begin CurrChar := Ord(Buf[I - 1]); CurrDone := false; if ((I 1) <= StrLen) then begin NextChar := Ord(Buf[I]); If (CurrChar >= Ord('0')) And (CurrChar <= Ord('9')) And (NextChar >= Ord('0')) And (NextChar <= Ord('9')) Then begin tmp := (CurrChar - Ord('0')) * 10 (NextChar - Ord('0')); // 2 digits if (CurrSet <> 3) Then begin // the previous set is not Set C EncodedMessage := EncodedMessage Chr(99 98); Sum := Sum Weight * 99; Weight := Weight 1; CurrSet := 3; end; If (tmp = 0) then EncodedMessage := EncodedMessage Chr(192) else if (tmp > 0) And (tmp < 95) Then EncodedMessage := EncodedMessage Chr(tmp 32) else EncodedMessage := EncodedMessage Chr(tmp 98); Sum := Sum Weight * tmp; I := I 2; CurrDone := True; end; end; If (Not CurrDone) Then begin if (CurrChar >= 0) And (CurrChar <= 31) Then begin // choose Set A if (CurrSet <> 1) Then begin // the previous set is not Set A EncodedMessage := EncodedMessage Chr(101 98); Sum := Sum Weight * 101; Weight := Weight 1; CurrSet := 1; end; if (CurrChar = 31) Then begin EncodedMessage := EncodedMessage Chr(193); Sum := Sum Weight * 95; end else begin EncodedMessage := EncodedMessage Chr(CurrChar 96); Sum := Sum Weight * (CurrChar 64); end; end else begin // choose Set B if (CurrSet <> 2) Then begin // the previous set is not Set B EncodedMessage := EncodedMessage Chr(100 98); Sum := Sum Weight * 100; Weight := Weight 1; CurrSet := 2; end; if (CurrChar = 32) Then EncodedMessage := EncodedMessage Chr(192) else if (CurrChar = 127) Then begin EncodedMessage := EncodedMessage Chr(193); Sum := Sum Weight * 95; end else if (CurrChar < 127) And (CurrChar > 32) Then begin EncodedMessage := EncodedMessage Chr(CurrChar); Sum := Sum Weight * (CurrChar - 32); end; end; I := I 1; end; Weight := Weight 1; end; // add CheckDigit Sum := Sum Mod 103; If (Sum = 0) Then EncodedMessage := EncodedMessage Chr(192) else if (Sum <= 94) Then EncodedMessage := EncodedMessage Chr(Sum 32) else EncodedMessage := EncodedMessage Chr(Sum 98); // add stop character (204) EncodedMessage := EncodedMessage Chr(204); end; function TEncoder.Code128Auto( Src: string): string; begin StrLen := Length(Src); Sum := 104; // 2 indicates Set B CurrSet := 2; // start character with value 202 for Set B EncodedMessage := '' Chr(202); StrPCopy(Buf, Src); CurrChar := Ord(Buf[0]); If (CurrChar <= 31) and (CurrChar >= 0) then begin // switch to Set A // 1 indicates Set A CurrSet := 1; // start character with value 201 for Set A EncodedMessage := '' Chr(201); Sum := 103; end; Weight := 1; GeneralEncode(); Result := EncodedMessage; end; function TEncoder.UCCEAN128( Src: string): string; begin StrLen := Length(Src); Sum := 105; // 3 indicates Set C CurrSet := 3; // start character (203) FNC1 (200) EncodedMessage := '' Chr(203) Chr(200); Sum := Sum 102; Weight := 2; StrPCopy(Buf, Src); GeneralEncode(); Result := EncodedMessage; end; function TEncoder.Code128A( Src: string): string; var m: Integer; begin StrLen := Length(Src); Sum := 103; // start character (201) for Set A EncodedMessage := '' Chr(201); Weight := 1; StrPCopy(Buf, Src); For m := 1 To StrLen do begin CurrChar := Ord(Buf[m - 1]); If (CurrChar = 32) Then EncodedMessage := EncodedMessage Chr(192) else If (CurrChar = 31) Then begin EncodedMessage := EncodedMessage Chr(193); Sum := Sum Weight * 95; end else if (CurrChar <= 95) And (CurrChar > 32) Then begin EncodedMessage := EncodedMessage Chr(CurrChar); Sum := Sum Weight * (CurrChar - 32); end else if (CurrChar >= 0) And (CurrChar <= 31) Then begin EncodedMessage := EncodedMessage Chr(CurrChar 96); Sum := Sum Weight * (CurrChar 64); end else begin Result := Code128Auto(Src); Exit; end; Weight := Weight 1; end; // add CheckDigit Sum := Sum Mod 103; If (Sum = 0) Then EncodedMessage := EncodedMessage Chr(192) else if (Sum <= 94) Then EncodedMessage := EncodedMessage Chr(Sum 32) else EncodedMessage := EncodedMessage Chr(Sum 98); // add stop character (204) EncodedMessage := EncodedMessage Chr(204); Result := EncodedMessage; end; function TEncoder.Code128B( Src: string): string; var m: Integer; begin StrLen := Length(Src); Sum := 104; // start character (202) for Set B EncodedMessage := '' Chr(202); Weight := 1; StrPCopy(Buf, Src); For m := 1 To StrLen do begin CurrChar := Ord(Buf[m - 1]); if (CurrChar = 32) Then EncodedMessage := EncodedMessage Chr(192) else if (CurrChar = 127) Then begin EncodedMessage := EncodedMessage Chr(193); Sum := Sum Weight * 95; end else if (CurrChar < 127) And (CurrChar > 32) Then begin EncodedMessage := EncodedMessage Chr(CurrChar); Sum := Sum Weight * (CurrChar - 32); end else begin Result := Code128Auto(Src); Exit; end; Weight := Weight 1; end; // add CheckDigit Sum := Sum Mod 103; If (Sum = 0) Then EncodedMessage := EncodedMessage Chr(192) else if (Sum <= 94) Then EncodedMessage := EncodedMessage Chr(Sum 32) else EncodedMessage := EncodedMessage Chr(Sum 98); // add stop character (204) EncodedMessage := EncodedMessage Chr(204); Result := EncodedMessage; end; function TEncoder.Code128C( Src: string): string; var tmp: Integer; begin StrLen := Length(Src); Sum := 105; // start character (203) for Set C EncodedMessage := '' Chr(203); Weight := 1; I := 1; StrPCopy(Buf, Src); While (I <= StrLen) do begin CurrChar := Ord(Buf[I - 1]); if ((I 1) <= StrLen) then begin NextChar := Ord(Buf[I]); If (CurrChar >= Ord('0')) And (CurrChar <= Ord('9')) And (NextChar >= Ord('0')) And (NextChar <= Ord('9')) then begin // 2 digits tmp := (CurrChar - Ord('0')) * 10 (NextChar - Ord('0')); If (tmp = 0) Then EncodedMessage := EncodedMessage Chr(192) else if (tmp > 0) And (tmp < 95) Then EncodedMessage := EncodedMessage Chr(tmp 32) else EncodedMessage := EncodedMessage Chr(tmp 98); Sum := Sum Weight * tmp; I := I 2; end else begin Result := Code128Auto(Src); Exit; end; end else begin EncodedMessage := EncodedMessage Chr(198); Sum := Sum Weight * 100; Weight := Weight 1; if (CurrChar = 32) then EncodedMessage := EncodedMessage Chr(192) else if (CurrChar = 127) then begin EncodedMessage := EncodedMessage Chr(193); Sum := Sum Weight * 95; end else if (CurrChar < 127) And (CurrChar > 32) then begin EncodedMessage := EncodedMessage Chr(CurrChar); Sum := Sum Weight * (CurrChar - 32); end else begin Result := Code128Auto(Src); Exit; end; I := I 1; end; Weight := Weight 1; end; // add CheckDigit Sum := Sum Mod 103; If (Sum = 0) Then EncodedMessage := EncodedMessage Chr(192) else if (Sum <= 94) Then EncodedMessage := EncodedMessage Chr(Sum 32) else EncodedMessage := EncodedMessage Chr(Sum 98); // add stop character (204) EncodedMessage := EncodedMessage Chr(204); Result := EncodedMessage; end; end. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |