Проверка сообщений принтера с помощью драйверов OPOS в Delphi - PullRequest
1 голос
/ 27 апреля 2009

Я пытаюсь открыть принтер POS с помощью драйверов OPOS в Delphi (BDS2006), но не знаю, как проверить состояние принтера.

Как мне проверить сообщения типа Check Paper и Paper Jam с принтера?

Ответы [ 3 ]

6 голосов
/ 27 апреля 2009

Я не использовал драйверы OPOS, но я немного поработал с драйверами POS для чекового принтера Epson, подключенного к кассовому ящику. Я обнаружил, что, если принтер установлен в 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;
0 голосов
/ 29 апреля 2009

Прежде всего вам необходимо установить правильное программное обеспечение поддержки для вашего устройства, которое вы, вероятно, должны загрузить с веб-сайта производителя. Помните, что иногда многие устройства (например, чековые принтеры) содержат стандартное оборудование (например, EPSON TX-88III), хотя название бренда может отличаться.

Программное обеспечение поддержки обычно содержит драйвер, средства настройки и, возможно, примеры программирования того, как использовать драйвер. Убедитесь, что следующие шаги выполнены правильно:

  1. Установка драйвера, инструменты настройки выполнены

  2. Устройство правильно подключено с использованием правильных кабелей (у меня были проблемы с поиском правильного последовательного кабеля, так как их было много разных типов)

  3. Ваше устройство распознается программным обеспечением для настройки (через драйвер) и хорошо взаимодействует, по крайней мере, оно реагирует на некоторые функции

  4. Используйте элемент управления ActiveX, который был установлен вместе с драйвером. У него должно быть похожее имя с драйвером.

После выполнения описанных выше шагов в вашем приложении будет элемент управления, который предоставляет вам все доступные функции, свойства состояния и события (для бумаги или чего-либо другого).

0 голосов
/ 27 апреля 2009

Используете ли вы элемент управления ActiveX отсюда: http://monroecs.com/oposccos.htm? У него есть событие для состояния ошибки.

...