Announcement

Collapse
No announcement yet.

Bondrucker: Escapesequenzen über USB

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bondrucker: Escapesequenzen über USB

    Hallo,

    ich muss einen Thermo - Bondrucker (BTP-2002) aus einer Delphi - Anwendung heraus ansteuern.

    Der normale Druck wird mir hoffentlich keine Probleme bereiten, da ein 'ganz normaler' Druckertreiber installiert ist.

    Aber: Wie steuere ich Cutter und Kassenschublade an?

    Man muss dazu bestimmte Escape - Sequenzen direkt an den Drucker senden. Ich stehe da im Moment auf dem Schlauch: Wie schafft man das über USB?

    Hat jemand einen Ansatz für mich (gerne auch in einer anderen Sprache).

    Danke, viele Grüße
    Tino
    Zuletzt editiert von tinof; 18.05.2010, 13:52. Reason: bestimmt --> bestimmte
    Ich habs gleich!
    ... sagte der Programmierer.

  • #2
    Hallo nochmal:

    In den Einstellungen des Druckertreibers -> Druckereinstellungen gibt es ein Register <Operation> in dem man konfigurieren kann, was zu Beginn und zu Ende des Dokuments / jeder Seite 'passieren' soll:

    Bon abschneiden, Piepen, Lade öffnen usw.; sehr komfortabel.

    Diese Möglichkeit entschärft mein Problem wesentlich.

    Falls trotzdem noch jemand eine Idee haben sollte, wie man den Drucker direkt ansteuert, wäre es schön: Es ist ganz komfortabel, wenn z.B. sich die Kassenlade auch unabhängig vom Bondruck öffnen läßt.


    Danke!

    Edit:
    Code:
      Printer.BeginDoc;
      Printer.Canvas.TextOut(0,0,chr(27)+chr(64)+chr(10));
      Printer.EndDoc;
    geht natürlich nicht, hier werden tatsächlich die Ascii - Zeichen gedruckt, also :-) @ :-( oder so ähnlich.


    Tino
    Zuletzt editiert von tinof; 18.05.2010, 10:12.
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Vielleicht hilft das hier weiter ...

      bye,
      Helmut

      Comment


      • #4
        Hallo Helmut,

        herzlichen Dank für den Tipp! Das war die richtige Richtung.

        Die Escape() - Funktion hat den Nachteil, dass sie in BeginDoc() / EndDoc() eingeschlossen werden muss und somit auf dem Drucker eine 'Leerseite' druckt.

        Aber irgendwie bin ich dann über die BDS - Hilfe zu einem API Beispiel "Sending Data Directly to a Printer" gelangt, und nach einigen meiner üblichen API - Schwierigkeiten mit Strings und Shortstrings geht unter D2009 jetzt dies hier:

        Code:
        ...
        uses WinSpool ..;
        ...
        
        // Nach Pascal uebersetzt aus den Windows GDI - Beispielen:
        
        // RawDataToPrinter - sends binary data directly to a printer
              //
              // szPrinterName: NULL-terminated string specifying printer name
              // lpData:        Pointer to raw data bytes
              // dwCount        Length of lpData in bytes
              //
              // Returns: TRUE for success, FALSE for failure.
              //
        function RawDataToPrinter(szPrinterName:PChar; lpData:PByte; dwCount:Word) : Boolean;
        Var
          hPrinter : THandle;
          DocInfo : DOC_INFO_1;
          dwJob : Word;
          dwBytesWritten : Cardinal;
        Begin
          Result:=False;
          // Need a handle to the printer.
          if NOT  OpenPrinter( szPrinterName, hPrinter, NIL ) then
            Exit;
        
          // Fill in the structure with info about this "document."
          DocInfo.pDocName := 'Kassenbon';
          DocInfo.pOutputFile := NIL;
          DocInfo.pDatatype := 'RAW';
          // Inform the spooler the document is beginning.
          dwJob := StartDocPrinter( hPrinter, 1, @DocInfo );
          if (dwJob = 0 ) Then begin
            ClosePrinter( hPrinter );
            Exit;
          end;
        
          // Start a page.
          if not StartPagePrinter( hPrinter ) then begin
            EndDocPrinter( hPrinter );
            ClosePrinter( hPrinter );
            Exit;
          end;
        
          // Send the data to the printer.
          if not WritePrinter( hPrinter, lpData, dwCount, dwBytesWritten ) then begin
            EndPagePrinter( hPrinter );
            EndDocPrinter( hPrinter );
            ClosePrinter( hPrinter );
            Exit;
          end;
          // End the page.
          if not EndPagePrinter( hPrinter ) then begin
            EndDocPrinter( hPrinter );
            ClosePrinter( hPrinter );
            Exit;
          end;
          // Inform the spooler that the document is ending.
          if not EndDocPrinter( hPrinter ) then begin
            ClosePrinter( hPrinter );
            Exit;
          end;
          // Tidy up the printer handle.
          ClosePrinter( hPrinter );
          // Check to see if correct number of bytes were written.
          Result:=dwBytesWritten = dwCount;
        End;
        
        // bissel 'verpackt' für den Delphi - Programmierer
        Function TForm2.Special(code:shortstring):Boolean;
        var P:PAnsiChar;
        begin
          p:=AnsiStrAlloc(length(code));
          try
            p:=StrPCopy(p,code);
            Result:=RawDataToPrinter(PChar(cb_driver.text), pByte(p),StrLen(p));
          finally
            strdispose(p);
          end;
        End;
        
        // here we go
        procedure TForm2.bb_2Click(Sender: TObject);
        begin
        
         // abschneiden
         if not special(Chr(29)+chr(86)+'1') then
            ShowMessage('Bitte den Bon vorsichtig abreissen!');
        
         // kassenlade
         if not special(Chr(27)+chr(112)+'0'+chr(50)+chr(50)) then
            ShowMessage('Bitte passendes Kleingeld bereithalten!');
        
        end;
        Danke, jetzt gehts.

        Und auch wenn möglicherweise ein Stöhnen durch's Forum geht: Den Bon selber drucke ich mit Quickreport - das geht 1A.

        Vielen Dank,
        viele Grüße
        Tino
        Ich habs gleich!
        ... sagte der Programmierer.

        Comment


        • #5
          Finde ich toll, dass du deine Lösung auch für andere hier zur Verfügung stellst
          Es gibt sicher noch einige, die ebenfalls dieses Problem haben (oder kriegen).

          bye,
          Helmut

          Comment


          • #6
            Gehört sich das nicht so?


            Falls es jemand verwenden kann:
            Die Stringumwandlungen Shortstring -> PAnsiChar -> PByte sind sicher ziemlich suboptimal. Aber sorry, trotz täglicher Praxis und einiger Manuals hab' ich mir diese String / Widestring / Pchar / PByte - Geschichte noch nicht verinnerlichen und oft nur über Versuch / Irrtum eine Lösung finden können.

            Danke nochmal, viele Grüße
            Tino
            Ich habs gleich!
            ... sagte der Programmierer.

            Comment


            • #7
              Gehören tut sichs schon aber leider macht es nicht jeder und man freut sich zu sehen, dass es auch anders geht.

              Danke auch von mir

              Comment

              Working...
              X