2009-04-27 6 views
1

Ich versuche, einen POS-Drucker mit den OPOS-Treibern in Delphi (BDS2006) zu öffnen, habe aber keine Ahnung, wie der Druckerstatus überprüft werden kann.Druckermeldungen mit OPOS-Treibern in Delphi prüfen

Wie würde ich vom Drucker aus nach Meldungen wie Check Paper und Paper Jam suchen?

+1

Hilft eine der Antworten auf diese Frage? http://stackoverflow.com/questions/308588/where-can-i-find-a-esc-pos-epson-barcode-test-program –

Antwort

6

Ich habe keine OPOS-Treiber verwendet, aber ich habe mit den POS-Treibern für einen Epson-Belegdrucker gearbeitet, der an eine Kassenschublade angeschlossen ist. Was ich entdeckte war, dass, wenn der Drucker in Windows installiert ist, Sie eine direkte Verbindung zu ihm öffnen können und es machen können, was Sie wollen.

Der Grund, warum der Drucker so langsam ist, ist, dass er die grafischen Schriftfunktionen von Windows verwendet. Wenn Sie den Drucker direkt öffnen, stellen Sie den Modus auf RAW und es wird nur Text wie eine alte Punktmatrix gesendet. Um die Kassenschublade zu öffnen, senden Sie einfach die spezifischen Steuercodes, als würden Sie sie drucken. Der Drucker fängt die Codes ab, bevor er gedruckt wird, und öffnet die Schublade.

BTW, ich habe keine Ahnung, wie das mit Unicode funktionieren würde. Der Drucker hatte ich nur wirklich mit ASCII-Daten gearbeitet. Es könnte Varianten für internationale Märkte geben, die anders funktionieren würden.

Hier ist der Code, den ich verwendet habe, es funktioniert (VxMsgBox ist nur eine Abdeckung 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

+1, sehr nützlich - danke! Für den Fall, dass jemand versucht, diesen Code zum Laufen zu bringen, müssen Sie der uses-Klausel "WinSpool" hinzufügen. – robsoft

+0

Ich habe hier kürzlich einen Zebra-Etikettendrucker, der einen Befehl ('^ CI') zur Auswahl von Zeichensatz und Kodierung unterstützt. Aber obwohl es UTF-16 BE und LE unterstützt, funktioniert es am besten mit der UTF-8-Kodierung bei Verwendung von Delphi 2009+, da alle anderen Befehle ASCII bleiben. Die Erstellung der zu sendenden Daten in einer UTF-8-codierten Zeichenfolge ist bei weitem am einfachsten. Oh, +1 BTW. – mghie

0

Sind Sie das ActiveX-Steuerelement mit von hier: http://monroecs.com/oposccos.htm? Es hat ein Ereignis für den Fehlerstatus.

+0

Hallo, ich implementiere derzeit die Lösung Marshall Fryman verdaut, nur um ein Update auf dieser Website zu geben http://monroecs.com/oposccos.htm?, Alles, was ich heruntergeladen habe, ist korrupt ... Ich habe 1.12.000 CCO Runtime (Wise Installieren) + 1.12.000 CCO Quellcode und Datendateien (ZIP-Datei) scheinen beide beschädigt zu sein ... ami bekommen die falschen Sachen? –

0

Zunächst müssen Sie die richtige Support-Software für Ihr Gerät installieren, die Sie wahrscheinlich von der Website des Herstellers herunterladen müssen. Beachten Sie, dass viele Geräte (z. B. Belegdrucker) manchmal Standardhardware (z. B. EPSON TX-88III) enthalten, obwohl der Markenname abweichen kann.

Die Support-Software enthält normalerweise den Treiber, Konfigurationstools und möglicherweise Programmierbeispiele zur Verwendung des Treibers. Stellen Sie sicher, dass die folgenden Schritte korrekt beendet:

  1. Installation der Treiber, Konfigurationstools wird

    getan
  2. Das Gerät richtig mit den richtigen Kabeln verbunden ist (ich hatte Probleme die richtige serielle Kabel zu finden, da es gibt viele verschiedene Arten von ihnen)

  3. Ihr Gerät (über den Treiber von der Konfigurationssoftware erkannt wird) und kommuniziert gut, zumindest auf einige Funktionen reagiert

  4. Verwenden Sie das ActiveX-Steuerelement, das mit dem Treiber installiert wurde. Es sollte einen ähnlichen Namen mit dem Treiber haben.

Nach den obigen Schritten werden Sie eine Steuerung in der Anwendung, die Sie mit allen verfügbaren Funktionen, Statuseigenschaften und Ereignissen (für Papier, oder irgendetwas anderes) zur Verfügung stellt.