Delphi 如何打印代码128C?
我试图打印一个代码128C(仅数字),但我相信发送数据的方式是不正确的。。。在读取代码时,转换不会导致最初通知的数据 在code128A中,我提交一个ASCCI代码,打印机将其转换为十六进制并打印…读取器将其转换回ASCII。 在code128C中,如果我提交ASCCI,在读取时,读取器将转换为十进制,这不会产生初始值 例:Delphi 如何打印代码128C?,delphi,Delphi,我试图打印一个代码128C(仅数字),但我相信发送数据的方式是不正确的。。。在读取代码时,转换不会导致最初通知的数据 在code128A中,我提交一个ASCCI代码,打印机将其转换为十六进制并打印…读取器将其转换回ASCII。 在code128C中,如果我提交ASCCI,在读取时,读取器将转换为十进制,这不会产生初始值 例: 128A输入:“1”打印机:31读取:1 128C输入:“1”打印机:31读数:49 我想我应该提交整数格式的输入代码。。。。但由于该命令由其他信息组成,我不知道如何以
- 128A输入:“1”打印机:31读取:1
- 128C输入:“1”打印机:31读数:49
ComandoAnsiString := tp.cod128A('12'); //Data entry
function TTP650.cod128A(cod: AnsiString): AnsiString;
begin
// Fill out the CODE 128 printing protocol
Result := #29+#107+#73 + chr(length(cod)+2) + #123+#65 + cod;
end;
WritePrinter( HandleImp, PAnsiChar(ComandoAnsiString), Length(ComandoAnsiString),
CaracteresImpressos); //send to printer
这是我一直在尝试使用code128C的代码:
ComandoAnsiString := tp.cod128C('12');
function TTP650.cod128C(cod: AnsiString): AnsiString;
begin
Result := #29+#107+#73 + chr(length(cod)+2) + #123+#67 + cod;
end;
WritePrinter( HandleImp, PAnsiChar(ComandoAnsiString), Length(ComandoAnsiString),
CaracteresImpressos);
我正在处理一个热敏打印机和一个简单的代码条阅读器,默认设置。
发送代码(WritePrint)来自库WinSpool
。。。其余的都是我写的代码
重要代码信息见本指南第47至50页
假设用户将输入想要的条形码作为一个数字字符串,该数字字符串可以作为字符串存储在某处,并在打印时作为人类可读的字符串传递给打印功能 然后,打印功能将转换为字节数组,根据代码C(每对两个十进制数字,形成一个值00..99,存储在一个字节中)对数字进行打包。注意,如果数字的输入字符串是例如“123456”,那么它由三个字节表示,值为12、34、56
function cod128C(const cod: string): TBytes;
const
GS = 29; // GS - Print bar code
k = 107; // k - -"-
m = 73; // m - CODE128
CS = 123; // { - select code set //}
CC = 67; // C - CODE C
var
i, len, n, x: integer;
s: string;
begin
len := Length(cod);
if len = 0 then exit;
// raise for odd number of digits in cod, ...
// if Odd(len) then
// raise Exception.Create('cod must have even number of digits');
s := cod;
// ... alternatively assume a preceeding zero digit before the first digit
// in cod
if Odd(len) then
begin
s := '0'+s;
inc(len);
end;
len := len div 2; // we pack 2 digits into one byte
SetLength(result, 6 + len);
result[0] := GS;
result[1] := k;
result[2] := m;
result[3] := 2 + len; // length of cod, + 2 for following code set selector
result[4] := CS;
result[5] := CC;
n := length(s);
i := 1; // index to S
x := 6; // index to result
while i < n do
begin
result[x] := StrToInt(MidStr(s, i, 2));
inc(i, 2);
inc(x, 1);
end;
end;
您可能只想在输入字符串中添加十进制数字的检查,但我将其留给您。
“打印机”
…什么打印机<代码>“阅读器”…什么阅读器?请记住,我们不知道您在做什么,不知道您桌上有什么打印机,也不知道他们可能提供给您使用的软件库,也不知道您向我们展示的代码属于该库以及您自己编写的代码。这需要更多的细节来回答。话虽如此,字符1
(数字1的符号)的十进制ascii值为49
,十六进制表示为0x31
。您似乎混淆了字符本身、十进制的ascii值和十六进制的ascii值。如果没有更多的信息,很难说在哪里。我正在使用热敏打印机(点阵)
它要么是热敏打印机,要么是点阵打印机,而不是两者都有。对于条形码,我们可以期待它是某种热敏打印机。重要的是要知道打印机的品牌和型号-如果您使用的是WritePrinter
,则需要知道打印机希望接收的格式。如果你不告诉我们你用的是什么打印机,我们就不知道那是什么。。。现在是2019年。我们现在有打印机驱动程序。如果在WinAPI中拖网让您感到悲伤,那么只需使用Code128C字体,并使用高级函数打印即可。生活并不需要如此艰难…@J…打印机接收到的数据格式是我在CommandAnsiString中指定的格式。。。“#29+#107+#73+chr(长度(codigo)+2)+#123+#67+codigo”但这并不影响提问。。。我对此毫不怀疑。问题是代码和其他信息一起以AnsiString格式(字符)发送,我认为应该发送一个整数。怎么办?
procedure TForm1.Button1Click(Sender: TObject);
var
cmnd: TBytes;
i: integer;
s: string;
begin
cmnd := cod128C(Edit1.Text);
for i := 0 to Length(cmnd)-1 do
s := s+IntToStr(cmnd[i])+', ';
Memo1.Lines.Add(s);
WritePrinter( HandleImp, @cmnd[0], Length(cmnd), CaracteresImpressos);
end;