Delphi 如何打印代码128C?

Delphi 如何打印代码128C?,delphi,Delphi,我试图打印一个代码128C(仅数字),但我相信发送数据的方式是不正确的。。。在读取代码时,转换不会导致最初通知的数据 在code128A中,我提交一个ASCCI代码,打印机将其转换为十六进制并打印…读取器将其转换回ASCII。 在code128C中,如果我提交ASCCI,在读取时,读取器将转换为十进制,这不会产生初始值 例: 128A输入:“1”打印机:31读取:1 128C输入:“1”打印机:31读数:49 我想我应该提交整数格式的输入代码。。。。但由于该命令由其他信息组成,我不知道如何以

我试图打印一个代码128C(仅数字),但我相信发送数据的方式是不正确的。。。在读取代码时,转换不会导致最初通知的数据

在code128A中,我提交一个ASCCI代码,打印机将其转换为十六进制并打印…读取器将其转换回ASCII。 在code128C中,如果我提交ASCCI,在读取时,读取器将转换为十进制,这不会产生初始值

例:

  • 128A输入:“1”打印机:31读取:1
  • 128C输入:“1”打印机:31读数:49
我想我应该提交整数格式的输入代码。。。。但由于该命令由其他信息组成,我不知道如何以整数形式发送它

这是代码128A的代码:

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;