Delphi-PRAXiS
Seite 8 von 9   « Erste     678 9      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kassenlade öffnen (https://www.delphipraxis.net/180831-kassenlade-oeffnen.html)

Natcree 26. Jun 2014 10:04

AW: Kassenlade öffnen
 
Also habe mal wie am anfang des Threads

Die Function so eingebunden

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, printers, winspool;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure opendrawer();
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
  ESC = #27;
  GS = #29;

  { Commands }

  ESC_em = ESC + #33; { Select print mode }
  ESC_p = ESC+#112; { Generate pulse }
  GS_V = GS + #86; { Select cut mode and cut paper }

  { Parameter }

  Lade1 = #48;
  Lade2 = #49;

  PulsDauer100ms = #050; {* 2ms}
  PulsDauer200ms = #100; {* 2ms}
  PulsDauer300ms = #150; {* 2ms}
  PulsDauer400ms = #200; {* 2ms}
  PulsDauer500ms = #250; {* 2ms}
var
  Form1: TForm1;

implementation

{$R *.dfm}

function RawDataToPrinter(szPrinterName:PChar; lpData:PByte; dwCount:Word) : Boolean;
Var
   hPrinter : THandle;
   DocInfo : DOC_INFO_1;
   dwJob : Word;
   dwBytesWritten : Cardinal;
Begin
   Result:=False;
   if NOT OpenPrinter( szPrinterName, hPrinter, NIL ) then
     Exit;

   DocInfo.pDocName := 'RAWJOB';
   DocInfo.pOutputFile := NIL;
   DocInfo.pDatatype := 'RAW';

   dwJob := StartDocPrinter( hPrinter, 1, @DocInfo );
   if (dwJob = 0 ) Then begin
     ClosePrinter( hPrinter );
     Exit;
   end;


   if not StartPagePrinter( hPrinter ) then begin
     EndDocPrinter( hPrinter );
     ClosePrinter( hPrinter );
     Exit;
   end;


   if not WritePrinter( hPrinter, lpData, dwCount, dwBytesWritten ) then begin
     EndPagePrinter( hPrinter );
     EndDocPrinter( hPrinter );
     ClosePrinter( hPrinter );
     Exit;
   end;

   if not EndPagePrinter( hPrinter ) then begin
     EndDocPrinter( hPrinter );
     ClosePrinter( hPrinter );
     Exit;
   end;

   if not EndDocPrinter( hPrinter ) then begin
     ClosePrinter( hPrinter );
     Exit;
   end;

   ClosePrinter( hPrinter );

   Result:=dwBytesWritten = dwCount;
End;

function SwitchPrinter(const APrtName : string):string;
var
   Device,
     Driver,
     Port: array[0..255] of Char;
   DevMode: THandle;
begin
   with Printer do
   begin
     PrinterIndex := Printers.IndexOf(APrtName);
     GetPrinter(Device, Driver, Port, DevMode);
     SetPrinter(Device, Driver, Port, 0);
     result:=Printers[printerindex];
   end;
end;

function GetGeneratePulseSequence( m, t1, t2:ansistring ): Ansistring;//hier sagt er missing parameter type
begin
  Result := Esc_p + m + t1 + t2;//incompatible typen string und integer
end;

function GetDefaultGeneratePulseSequence : AnsiString;
begin
  Result := GetGeneratePulseSequence( {m} Lade1, {t1} PulsDauer200ms, {t2} PulsDauer200ms );
end;

procedure Tform1.opendrawer();
Var
    FH:THandle;
    Buff: array[0..5] of char;
    RetW:DWORD;
    port:string;
    cmd:string;
    acmd:ansistring;
    p:pansichar;
begin
   acmd:=getDefaultGeneratePulseSequence;// hier der anstring aus der Function
   p := PAnsiChar( acmd);
   p:=StrPCopy(p,acmd);
   switchprinter('CognitiveTPG Receipt'); //Druckername, so wie er in Windows angezeigt wird
   rawdatatoprinter(pwidechar('CognitiveTPG Receipt'),pbyte(p),length(acmd));
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
opendrawer;
end;
jedoch meckert er hier
Delphi-Quellcode:
rawdatatoprinter(pwidechar('CognitiveTPG Receipt'),pbyte(p),length(acmd));
invalid typcast pbyte(p)

Zoot 26. Jun 2014 10:43

AW: Kassenlade öffnen
 
Zitat:

Zitat von Natcree (Beitrag 1263548)

Delphi-Quellcode:
if not EndDocPrinter( hPrinter ) then begin
     ClosePrinter( hPrinter );
     Exit;
   end;

   ClosePrinter( hPrinter );


Also den Sinn der Konstruktion (und der entsprechenden Zeilen davor) verstehe ich nicht.

"Wenn nicht, dann A, Wenn doch, dann auch A"

Das Ganze kann man also um 20 Zeilen kürzen.

Sir Rufo 26. Jun 2014 10:55

AW: Kassenlade öffnen
 
Zitat:

Zitat von Zoot (Beitrag 1263552)
Zitat:

Zitat von Natcree (Beitrag 1263548)

Delphi-Quellcode:
if not EndDocPrinter( hPrinter ) then begin
     ClosePrinter( hPrinter );
     Exit;
   end;

   ClosePrinter( hPrinter );


Also den Sinn der Konstruktion (und der entsprechenden Zeilen davor) verstehe ich nicht.

"Wenn nicht, dann A, Wenn doch, dann auch A"

Das Ganze kann man also um 20 Zeilen kürzen.

Hier wird ja etwas geprüft und im Fehlerfall soll da etwas passieren. Aber wozu sollte man eine Exception werfen? Nacher bekommt noch jemand mit, das da was falsch gelaufen ist :roll:

Delphi-Quellcode:
try
  ...

  if not EndDocPrinter( hPrinter ) then
    raise Exception.Create( 'EndDocPrinter fehlgeschlagen' );

finally
   ClosePrinter( hPrinter );
end;
UPDATE
So müsste da langsam ein Schuh draus werden, denn nun sollte man auch bei einem Fehler auch den Grund dafür bekommen (huch, wo sind die vielen Zeilen hin, Mehrwert mit weniger Zeilen :gruebel:)
Delphi-Quellcode:
unit uRawDataPrint;

interface

uses
  SysUtils,
  printers,
  winspool;

type
  ERawDataToPrinterException = class( Exception );

procedure RawDataToPrinter( szPrinterName : PChar; lpData : PByte; dwCount : Word );

implementation

procedure RawDataToPrinter( szPrinterName : PChar; lpData : PByte; dwCount : Word );
var
  hPrinter : THandle;
  DocInfo : DOC_INFO_1;
  dwJob : Word;
  dwBytesWritten : Cardinal;
begin
  Win32Check( OpenPrinter( szPrinterName, hPrinter, nil ) );
  try
    DocInfo.pDocName := 'RAWJOB';
    DocInfo.pOutputFile := nil;
    DocInfo.pDatatype := 'RAW';

    dwJob := StartDocPrinter( hPrinter, 1, @DocInfo );
    if ( dwJob = 0 )
    then
      RaiseLastWin32Error;
    try

      Win32Check( StartPagePrinter( hPrinter ) );
      try

        Win32Check( WritePrinter( hPrinter, lpData, dwCount, dwBytesWritten ) );

        if not( dwBytesWritten = dwCount )
        then
          raise ERawDataToPrinterException.Create( 'Nicht alle Bytes geschrieben' );

      finally
        Win32Check( EndPagePrinter( hPrinter ) );
      end;
    finally
      Win32Check( EndDocPrinter( hPrinter ) );
    end;
  finally
    Win32Check( ClosePrinter( hPrinter ) );
  end;
end;

end.

Natcree 26. Jun 2014 11:17

AW: Kassenlade öffnen
 
und wie kann ich den befehl jetzt an den Printer schicken?

p80286 26. Jun 2014 11:31

AW: Kassenlade öffnen
 
Sir Rufo hat nur das zusammengefasst was vorher schon genannt wurde.
Win32Check( WritePrinter( hPrinter, lpData, dwCount, dwBytesWritten ) );


Hier mußt Du Deine Daten eintragen (den zu druckenden String übergeben).


Gruß
K-H

Gut, Hardware lebt und ist böse, und Drucker sind zudem noch hinterhältig, aber soooo schlimm?

Natcree 26. Jun 2014 11:54

AW: Kassenlade öffnen
 
steh gerade auf dem schlauch

welche codes soll ich nun verwenden?

die Zusammenfassung von sir rufo in die uses einbinden richtig?
was ist mit den Funktionen?

Delphi-Quellcode:
function GetGeneratePulseSequence( m, t1, t2:ansistring ): Ansistring;//hier sagt er missing parameter type
begin
   Result := Esc_p + m + t1 + t2;//incompatible typen string und integer
end;

function GetDefaultGeneratePulseSequence : AnsiString;
begin
   Result := GetGeneratePulseSequence( {m} Lade1, {t1} PulsDauer200ms, {t2} PulsDauer200ms );
end;
und das aufrufen in der buttonclick procedure

RawDataToPrinter( szPrinterName{1} : PChar;{2} lpData : PByte;{3} dwCount : Word );
{1} muss hier der printername rein?
{2} was muss hier rein?
{3} was muss hier rein?

p80286 26. Jun 2014 12:25

AW: Kassenlade öffnen
 
Ja so kann sie eingebunden werden.

Delphi-Quellcode:
function GetGeneratePulseSequence( m, t1, t2:ansistring ): Ansistring;//hier sagt er missing parameter type
 begin
    Result := Esc_p + m + t1 + t2;//incompatible typen string und integer
 end;
 
function GetDefaultGeneratePulseSequence : AnsiString;
 begin
    Result := GetGeneratePulseSequence( {m} Lade1, {t1} PulsDauer200ms, {t2} PulsDauer200ms );
 end;
Hiermit werden die Daten generiert die an den Drucker gehen.

also
Delphi-Quellcode:
Druckstring:=GetDefaultGeneratePulseSequence;
{1} Ja, hier kommt der Druckername rein
{2} Mit der Zeigerwurschtelei kenn ich mich nicht so gut aus, ich nehme an ein @Druckstring[1] könnte reichen, vllt auch ein pansichar(Druckstring);
{3}
Delphi-Quellcode:
length(Druckstring)
ggf. solltest Du Dir einmal die Daten anzeigen, die ankommen:
aus dem Programming Guide für den t798
Zitat:

Enable or disable data scope mode
The data scope mode test prints a hexadecimal dump of all data sent to the printer: “1” prints as hexadecimal 31, “A” as hexadecimal 41 and so on. This helps troubleshoot communication problems and runs during a normal application (after being enabled through printer configuration).
Note: Data scope mode is usually considered a level 1 diagnostic test.
Data scope mode is enabled and disabled by selecting the “Diagnostic Modes” sub-menu of the configuration menu.
Press the paper feed button as instructed on the “Diagnostic Modes Menu” to enable or disable the data scope mode test.
• Off, normal mode (Data scope mode disabled)
• Data scope mode (enabled)
Note: Press the paper feed button for at least one second to validate the selection.
To run the data scope mode:
1 After you have enabled the data scope mode, exit the configuration menu.
2 Run a transaction from the host computer.
All commands and data sent from the host computer will be printed as hexadecimal characters as shown in the illustration.
To exit the data scope mode:
1 Enter the configuration menu again.
See “Configuring the printer.”
2 Disable the data scope mode.
3 Exit the configuration menu.
The printer is on-line and can communicate normally with the host computer.
For more
Gruß
K-H

Natcree 26. Jun 2014 12:44

AW: Kassenlade öffnen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
RawDataToPrinter( 'CognitiveTPG Receipt',GetDefaultGeneratePulseSequence, length(GetDefaultGeneratePulseSequence) );//hier sagt er mir incompatible type string und pbyte
end;

arnof 26. Jun 2014 12:57

AW: Kassenlade öffnen
 
Zitat:

Zitat von Natcree (Beitrag 1263565)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
RawDataToPrinter( 'CognitiveTPG Receipt',GetDefaultGeneratePulseSequence, length(GetDefaultGeneratePulseSequence) );//hier sagt er mir incompatible type string und pbyte
end;

Sorry,

Du solltest lieber mal einen Programmierer suchen

Außer Copy und Paste wird das wohl nichts.

Das Beispiel auf dem Link war fix und fertig bis auf dem Namen des Druckers, der in einer Struktur stand, dahinter war das aber Kommentiert, so das man nur seinen Namen dort hinschreiben musste :coder2:

Blup 26. Jun 2014 13:30

AW: Kassenlade öffnen
 
Zitat:

Zitat von Natcree (Beitrag 1263565)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
RawDataToPrinter( 'CognitiveTPG Receipt',GetDefaultGeneratePulseSequence, length(GetDefaultGeneratePulseSequence) );//hier sagt er mir incompatible type string und pbyte
end;

Du musst das Ergebnis von GetDefaultGeneratePulseSequence einer Variablen zuweisen.
RawDataToPrinter erwartet als Parameter die Adresse einer Speicherstelle(Variable) und die Größe der Speicherstelle(Anzahl Byte).
Delphi-Quellcode:
var
  lData: AnsiString;
begin
  lData := GetDefaultGeneratePulseSequence;
  RawDataToPrinter('CognitiveTPG Receipt', Pointer(lData), Length(lData));
end;
Edit:
Ob dein Drucker natürlich so heist, kannst nur du wissen...
Edit:
Im Prinzip passiert hier das selbe wie im Beispiel mit PASSTHROUGH.
Ist die von GetDefaultGeneratePulseSequence erzeugte ESC-Sequenz korrekt, funtkionieren vermutlich beide Wege.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 Uhr.
Seite 8 von 9   « Erste     678 9      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz