4

プリンタードライバーを使用せずに、esc/p コマンド (EPSON TM-T70) を使用してプリンターに直接印刷しようとしています。コードはこちらにあります

ただし、文字列を印刷しようとすると、切り捨てられます。例えば:

MyPrinter := TRawPrint.Create(nil);
try
  MyPrinter.DeviceName := 'EPSON TM-T70 Receipt';
  MyPrinter.JobName := 'MyJob';
  if MyPrinter.OpenDevice then
  begin
    MyPrinter.WriteString('This is page 1');
    MyPrinter.NewPage;
    MyPrinter.WriteString('This is page 2');
    MyPrinter.CloseDevice;
  end;
finally
  MyPrinter.Free;
end;

「This isThis is」のみを出力します。通常MyPrinter.NewPage、改行コマンドを送信するために使用することはありませんが、それにもかかわらず、なぜ文字列が切り捨てられるのでしょうか?

また、RawPrint ユニットWriteString関数にも注意してください。

Result := False;
if IsOpenDevice then begin
  Result := True;
  if not WritePrinter(hPrinter, PChar(Text), Length(Text), WrittenChars) then begin
    RaiseError(GetLastErrMsg);
    Result := False;
  end;
end;

そこにブレークポイントを置いてコードをステップ実行すると、WrittenChars正しい 14 に設定されます。なぜそのように振る舞うのですか?

4

2 に答える 2

4

おそらく、文字列の長さをバイト単位で与える ByteLength 関数を使用できます。

于 2011-05-09T07:57:04.263 に答える
4

Delphi の Unicode 対応バージョンを使用しています。文字の長さは 2 バイトです。関数を呼び出すとLength(s)、文字数が送信されますが、関数はおそらくバッファーのサイズを想定しています。SizeOf(s) に置き換えますLength(s)*SizeOf(Char)

1 つの Unicode 文字のサイズは正確に 2 バイトでLengthあるため、バッファー サイズが必要なときに送信する場合、基本的に API にバッファーの半分のみを使用するように指示します。したがって、すべての文字列はほぼ半分に分割されます。

于 2011-05-09T07:33:55.643 に答える