AW: Kassenlade öffnen
Also habe mal wie am anfang des Threads
Die Function so eingebunden
Delphi-Quellcode:
jedoch meckert er hier
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;
Delphi-Quellcode:
invalid typcast pbyte(p)
rawdatatoprinter(pwidechar('CognitiveTPG Receipt'),pbyte(p),length(acmd));
|
AW: Kassenlade öffnen
Zitat:
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. |
AW: Kassenlade öffnen
Zitat:
Delphi-Quellcode:
UPDATE
try
... if not EndDocPrinter( hPrinter ) then raise Exception.Create( 'EndDocPrinter fehlgeschlagen' ); finally ClosePrinter( hPrinter ); end; 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. |
AW: Kassenlade öffnen
und wie kann ich den befehl jetzt an den Printer schicken?
|
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? |
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:
und das aufrufen in der buttonclick procedure
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; 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? |
AW: Kassenlade öffnen
Ja so kann sie eingebunden werden.
Delphi-Quellcode:
Hiermit werden die Daten generiert die an den Drucker gehen.
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; also
Delphi-Quellcode:
{1} Ja, hier kommt der Druckername rein
Druckstring:=GetDefaultGeneratePulseSequence;
{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:
ggf. solltest Du Dir einmal die Daten anzeigen, die ankommen:
length(Druckstring)
aus dem Programming Guide für den t798 Zitat:
K-H |
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; |
AW: Kassenlade öffnen
Zitat:
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: |
AW: Kassenlade öffnen
Zitat:
RawDataToPrinter erwartet als Parameter die Adresse einer Speicherstelle(Variable) und die Größe der Speicherstelle(Anzahl Byte).
Delphi-Quellcode:
Edit:
var
lData: AnsiString; begin lData := GetDefaultGeneratePulseSequence; RawDataToPrinter('CognitiveTPG Receipt', Pointer(lData), Length(lData)); end; 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. |
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