線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2122
推到 Plurk!
推到 Facebook!

請問一下條碼 code 128 這種解法哪裡出錯了呢?

 
easonhuang
一般會員


發表:3
回覆:4
積分:1
註冊:2005-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-10-12 20:36:42 IP:61.217.xxx.xxx 訂閱
以下是網站上找到的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.

附加檔案:2006-10-12_203555.tif
系統時間:2024-05-05 7:26:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!