Delphi(BDS2006)でOPOSドライバーを使用してPOS(Point of Sale)プリンターを開こうとしていますが、プリンターのステータスを確認する方法がわかりません。
Check Paper
プリンタのようなメッセージやプリンタからのメッセージを確認するにはどうすればよいPaper Jam
ですか?
Delphi(BDS2006)でOPOSドライバーを使用してPOS(Point of Sale)プリンターを開こうとしていますが、プリンターのステータスを確認する方法がわかりません。
Check Paper
プリンタのようなメッセージやプリンタからのメッセージを確認するにはどうすればよいPaper Jam
ですか?
OPOS ドライバーを使用したことはありませんが、キャッシュ ドロアーに接続された Epson レシート プリンター用の POS ドライバーで作業を行いました。私が発見したのは、プリンターが Windows にインストールされている場合、プリンターへの直接接続を開いて、好きなように動作させることができるということでした。
プリンターが非常に遅いのは、Windows のグラフィカル フォント機能を使用しているためです。プリンターを直接開くと、モードが RAW に設定され、古いスタイルのドット マトリックスのようにテキストが送信されます。キャッシュ ドロワーを開くには、印刷するかのように特定の制御コードを送信するだけです。プリンターは、印刷する前にコードを傍受し、引き出しをキックします。
ところで、これが Unicode でどのように機能するかはわかりません。私が使っていたプリンターは、実際には ASCII データしか扱っていませんでした。国際市場向けに設計されたバリアントが異なる動作をする可能性があります。
これを機能させるために使用したコードは次のとおりです (VxMsgBox は MessageBox の単なるカバーです)。
{***************************************************************************}
{** PrintDirect2Printer **}
{***************************************************************************}
procedure PrintDirect2Printer(PrinterName, Data:pchar; dwByteCount:DWORD);
var PrinterHandle : THandle;
DocInfo : TDocInfo1;
dwJob : DWORD;
dwBytesWritten : DWORD;
begin
if not OpenPrinter(PrinterName, PrinterHandle, nil) then exit; //failed to open printer, abort
DocInfo.pDocName := 'Direct 2 Printer';
DocInfo.pOutputFile := nil;
DocInfo.pDataType := 'RAW';
dwJob:=StartDocPrinter(PrinterHandle, 1, @DocInfo);
if dwJob=0 then //failed to start a document
begin
ClosePrinter(PrinterHandle);
exit;
end;
if not StartPagePrinter(PrinterHandle) then
begin
EndDocPrinter(PrinterHandle);
ClosePrinter(PrinterHandle);
exit;
end;
if not WritePrinter(PrinterHandle, Data, dwByteCount, dwBytesWritten) then
begin
EndPagePrinter(PrinterHandle);
EndDocPrinter(PrinterHandle);
ClosePrinter(PrinterHandle);
exit;
end;
if not EndPagePrinter(PrinterHandle) then
begin
EndDocPrinter(PrinterHandle);
ClosePrinter(PrinterHandle);
exit;
end;
if not EndDocPrinter(PrinterHandle) then
begin
ClosePrinter(PrinterHandle);
exit;
end;
ClosePrinter(PrinterHandle);
if dwBytesWritten<>dwByteCount then
VxMsgBox('Print Direct To Printer failed.', 'Printer Error', mb_Ok);
end;
{***************************************************************************}
{** OpenPrintDirect2Printer **}
{***************************************************************************}
function OpenPrintDirect2Printer(PrinterName, DocName:pchar; var PrinterHandle:THandle):boolean;
var DocInfo : TDocInfo1;
dwJob : DWORD;
begin
result:=false;
if not OpenPrinter(PrinterName, PrinterHandle, nil) then exit; //failed to open printer, abort
DocInfo.pDocName := DocName;
DocInfo.pOutputFile := nil;
DocInfo.pDataType := 'RAW';
dwJob:=StartDocPrinter(PrinterHandle, 1, @DocInfo);
if dwJob=0 then //failed to start a document
begin
ClosePrinter(PrinterHandle);
exit;
end;
if not StartPagePrinter(PrinterHandle) then
begin
EndDocPrinter(PrinterHandle);
ClosePrinter(PrinterHandle);
exit;
end;
result:=true;
end;
{***************************************************************************}
{** WritePrintDirect2Printer **}
{***************************************************************************}
function WritePrintDirect2Printer(PrinterHandle:THandle; Data:pchar; dwByteCount:DWORD):boolean;
var dwBytesWritten : DWORD;
begin
result:=true;
if not WritePrinter(PrinterHandle, Data, dwByteCount, dwBytesWritten) then
result:=false;
if dwBytesWritten<>dwByteCount then
VxMsgBox('WritePrintDirect2Printer byte check failed.', 'Printer Error', mb_Ok);
end;
{***************************************************************************}
{** ClosePrintDirect2Printer **}
{***************************************************************************}
procedure ClosePrintDirect2Printer(var PrinterHandle:THandle);
begin
if not EndPagePrinter(PrinterHandle) then
begin
EndDocPrinter(PrinterHandle);
ClosePrinter(PrinterHandle);
PrinterHandle:=0;
exit;
end;
if not EndDocPrinter(PrinterHandle) then
begin
ClosePrinter(PrinterHandle);
PrinterHandle:=0;
exit;
end;
ClosePrinter(PrinterHandle);
PrinterHandle:=0;
end;
ここから ActiveX コントロールを使用していますか: http://monroecs.com/oposccos.htm ? エラーステータスのイベントがあります。
まず、デバイスに適したサポート ソフトウェアをインストールする必要があります。これは、おそらく製造元の Web サイトからダウンロードする必要があります。ブランド名は異なる場合がありますが、多くのデバイス (レシート プリンターなど) には標準ハードウェア (EPSON TX-88III など) が含まれている場合があることに注意してください。
サポート ソフトウェアには通常、ドライバー、構成ツール、および場合によってはドライバーの使用方法のプログラミング例が含まれています。次の手順が正しく完了していることを確認してください。
ドライバ、設定ツールのインストール完了
デバイスは正しいケーブルを使用して正しく接続されています (シリアル ケーブルにはさまざまな種類があるため、正しいシリアル ケーブルを見つけるのに苦労しました)。
お使いのデバイスは、構成ソフトウェアによって (ドライバーを介して) 認識され、適切に通信します。少なくとも、いくつかの機能に応答します。
ドライバーと共にインストールされた ActiveX コントロールを使用します。ドライバーと同様の名前にする必要があります。
上記の手順を実行すると、使用可能なすべての機能、ステータス プロパティ、およびイベント (紙またはその他のもの) を提供するコントロールがアプリケーションに作成されます。