![]() |
Kassenlade öffnen
Hallo ich möchte eine Kassenlade öffnen. habe mir dazu ein paar Codezeilen zusammengebastelt.
Die Kassenlade ist mit dem Thermodrucker verbunden und sollte mit dem Steuerbefehl Esc-P geöffnet werden können. Der drucker ist im BS nicht installiert. Er nennt sich TPG-Color-POS. Nunmehr komme ich nicht weiter. wollte die lade hiermit öffnen
Delphi-Quellcode:
1. Hier sagt er mir AnsiStrAlloc undeclared identifier
Var
FH:THandle; Buff: array[0..5] of char; RetW:DWORD; port:string; cmd:string; acmd:ansistring; p:pansichar; begin acmd:=#27#112#49#250#250; p:=AnsiStrAlloc(length(acmd)); p:=StrPCopy(p,acmd); switchprinter(''); //Druckername, so wie er in Windows angezeigt wird rawdatatoprinter(pwidechar(''),pbyte(p),length(acmd)); end; 2. Dann ist mir auf gefallen das der Drucker nicht im BS zusehen ist. Wie bekomme ich das gelöst? |
AW: Kassenlade öffnen
zu 1.) Hast Du SysUtils eingebunden?
zu 2.) Treiber installieren, bzw. DummyPrinter auf den Port einrichten |
AW: Kassenlade öffnen
sysutils ist eingebunden.
Ich instaliere mir jetzt den dummy treiber. |
AW: Kassenlade öffnen
dummy printer auf den port einrichten wie geht das den thermodrucker habe ich leider nicht hier. kann ich dafür einen anderen drucker nehmen?
|
AW: Kassenlade öffnen
Wie/wo wird der Drucker angeschlossen?
|
AW: Kassenlade öffnen
also habe jetzt den TPG Drucker in windows installiert auf anschluss com1 gelegt. jedoch bekomme ich den undeclared identifier nicht weg :(
|
AW: Kassenlade öffnen
Warum nicht einfach
Delphi-Quellcode:
?
p := PAnsiChar( acmd);
|
AW: Kassenlade öffnen
Okay das funcktioniert schonmal jetzt meckert er hier
Delphi-Quellcode:
invalid typcast
rawdatatoprinter(pwidechar('CognitiveTPG Receipt'),pbyte(p),length(acmd));
|
AW: Kassenlade öffnen
Bei welchem Parameter?
Ein Zeiger auf eine Konstante ist schlecht |
AW: Kassenlade öffnen
ich denke mal pbyte
|
AW: Kassenlade öffnen
Das sollte der Compiler aber Anzeigen.
|
AW: Kassenlade öffnen
ja er setzt den cursor vor pbyte(p)
|
AW: Kassenlade öffnen
Versuch mal nur p oder
Delphi-Quellcode:
PByte(acmd)
|
AW: Kassenlade öffnen
der fehler kommt immer noch
|
AW: Kassenlade öffnen
Es ist schon ein paar Jahrzehnte her, aber damans brauchte man einfach nur ein "BELL" Steuerzeichen auf den Kassendrucker "drucken" und dieser hat dann die Schublade geöffnet.
![]() Das war sehr einfach und klappt vielleicht heute auch noch? |
AW: Kassenlade öffnen
Nimm den OPOS-Treiber und mach das darüber. Ist nicht so ganz trivial... aber eigentlich schon.:stupid:
|
AW: Kassenlade öffnen
so habe jetzt ne lösung jedoch druckt er einen schnippsel mit aus
Delphi-Quellcode:
Das druckt er aus wie bekomme ich es weg.
SendEscapeToPrinter('CognitiveTPG Receipt','ESC p m t1 t2')
'ESC p m t1 t2' |
AW: Kassenlade öffnen
Hi,
schau mal im Forum genau nach, dies war erst dieses Jahr hier ein Thema und dort ist auch ein komplettes Beispiel vorhanden! |
AW: Kassenlade öffnen
habe ich schon also die lade wird geöffnet aber er druckt den Steuerbefehl mit aus
|
AW: Kassenlade öffnen
Zitat:
Sonst keinerlei Probleme! |
AW: Kassenlade öffnen
ja aber ist doof weil er E p 1t 2t als string mit ausdruckt was kann ich dagegen machen. brauchst du vielleicht den code schnippsel?
|
AW: Kassenlade öffnen
Das Escape-Zeichen bekommst du mit #27, und dann hängst du das p hinterher:
Delphi-Quellcode:
Sollte den gewünschten Effekt von dem haben, was im Handbuch deiner Kassenlade als "ESC p" beschrieben wird.
#27'p'
|
AW: Kassenlade öffnen
Danke werde es morgen gleich versuchen
|
AW: Kassenlade öffnen
Hi,
nachdem ich dann auch schon viele hilfreiche Tricks hier aus dem Forum bekommen habe möchte ich auch endlich gerne mal helfen ;-)) SO mache ich es:
Delphi-Quellcode:
Hope it helps!
procedure OpenCashDrawer;
var hPrinter, hDeviceMode: THandle; N: DWORD; DocInfo1: TDocInfo1; Device, Driver, Port: array [0 .. 255] of Char; PrinterName, ThePrinter: string; Code: AnsiString; begin begin Code := AnsiChar(27) + AnsiChar(112) + AnsiChar(0) + AnsiChar(64) + AnsiChar(240); Printer.PrinterIndex := Printer.Printers.IndexOf('Name deines druckers'); Printer.GetPrinter(Device, Driver, Port, hDeviceMode); PrinterName := Format('%s', [Device]); if not WinSpool.OpenPrinter(PChar(PrinterName), hPrinter, nil) then begin ShowMessage('Error : ' + IntToStr(GetLastError)); Exit; end; with DocInfo1 do begin pDocName := 'Test'; pOutputFile := nil; pDataType := 'RAW'; end; WinSpool.StartDocPrinter(hPrinter, 1, @DocInfo1); WinSpool.StartPagePrinter(hPrinter); WinSpool.WritePrinter(hPrinter, PAnsiChar(Code), Length(Code), N); WinSpool.EndPagePrinter(hPrinter); WinSpool.EndDocPrinter(hPrinter); WinSpool.ClosePrinter(hPrinter); end; end; P.S.: geht bestimmt eleganter, aber.... |
AW: Kassenlade öffnen
Falls das lpszDatatype auch '' sein kann, dann vielleicht so: :gruebel:
Delphi-Quellcode:
Code := AnsiChar(27) + AnsiChar(112) + AnsiChar(0) + AnsiChar(64) + AnsiChar(240);
Printer.PrinterIndex := Printer.Printers.IndexOf('Name deines druckers'); Printer.BeginDoc; //Printer.NewPage; WritePrinter(Printer.Handle, PAnsiChar(Code), Length(Code), N); Printer.EndDoc; |
AW: Kassenlade öffnen
leider passiert nichts mit deinem code
|
AW: Kassenlade öffnen
Blöde Frage:
hast du auch 'Name deines Druckers' in den richtigen Namen(so wie er in Windows angezeigt wird) geändert? Gruß Dirk |
AW: Kassenlade öffnen
ja habe ich :(
|
AW: Kassenlade öffnen
Meintest du jetzt "meinen" oder seinen Code?
|
AW: Kassenlade öffnen
seinen code nicht deinen
|
AW: Kassenlade öffnen
Und so? (nicht über TPrinter, sondern direkt an den Drucker-Port)
Delphi-Quellcode:
bzw.
var
myFile: TextFile; AssignFile(myFile, 'LPT1'); // Port 1 (nummeriert, so wie z.B. das bekannte COM1) Rewrite(myFile); Write(myFile, AnsiString(AnsiChar(27) + AnsiChar(112) + AnsiChar(0) + AnsiChar(64) + AnsiChar(240))); //Write(myFile, AnsiString(#27#112#0#64#240)); CloseFile(myFile);
Delphi-Quellcode:
with TFileStream.Create('LPT1', fmOpenWrite) do
try WriteBuffer(PAnsiChar(AnsiString(#27#112#0#64#240))^, 5); finally Free; end; |
AW: Kassenlade öffnen
wo muss ich deinen code pasten?
|
AW: Kassenlade öffnen
Der Code in #25 ist "nur" eine Kopie des Codes aus der #24, wobei dort einige APIs durch die entsprechenden Aufrufe des TPrinter ersetzt wurden.
(nur halt das WritePrinter blieb als API und das pDataType ist verloren gegangen, da es im TPrinter nicht gesetzt wird) Und die Codes aus #31 offnen den Drucker-Port halt über den alten "DOS"-Weg, anstatt über TPrinter. Die meisten Drucker sollen das immernoch über ihren Treiber anbieten. Statt dem PrinerIndex/PrinterNamen muß man hier erstmal rausfinden, an welchem Port "LPT1" der Drucker hängt. |
AW: Kassenlade öffnen
also habe jetzt diesen code
Delphi-Quellcode:
zeigt mir fehler 1801 an. und die lade bleibt zu
procedure OpenCashDrawer;
var hPrinter, hDeviceMode: THandle; N: DWORD; DocInfo1: TDocInfo1; Device, Driver, Port: array [0 .. 255] of Char; PrinterName, ThePrinter: string; Code: AnsiString; begin begin Code := AnsiChar(27) + AnsiChar(112) + AnsiChar(0) + AnsiChar(64) + AnsiChar(240); Printer.PrinterIndex := Printer.Printers.IndexOf('CognitiveTPG Receipt'); Printer.BeginDoc; //Printer.NewPage; WritePrinter(Printer.Handle, PAnsiChar(Code), Length(Code), N); Printer.EndDoc; if not WinSpool.OpenPrinter(PChar(PrinterName), hPrinter, nil) then begin ShowMessage('Error : ' + IntToStr(GetLastError)); Exit; end; with DocInfo1 do begin pDocName := 'Test'; pOutputFile := nil; pDataType := 'RAW'; end; WinSpool.StartDocPrinter(hPrinter, 1, @DocInfo1); WinSpool.StartPagePrinter(hPrinter); WinSpool.WritePrinter(hPrinter, PAnsiChar(Code), Length(Code), N); WinSpool.EndPagePrinter(hPrinter); WinSpool.EndDocPrinter(hPrinter); WinSpool.ClosePrinter(hPrinter); end; end; procedure TForm1.Button1Click(Sender: TObject); begin opencashdrawer; end; |
AW: Kassenlade öffnen
Und nun hast Du beide Vorschläge nacheinander reinkopiert. Wäre es nicht günstiger, sich für einen von beiden zu entscheiden?
|
AW: Kassenlade öffnen
also ich hatte die #24 code versuch ist nichts passiert. auch mit den vorherigen codes '27'p'....... ich weiss nicht mehr weiter.
|
AW: Kassenlade öffnen
Statt einem
Delphi-Quellcode:
kann man sich den Fehler natürlich auch übersetzen lassen.
ShowMessage(IntToStr(GetLastError));
z.B.
Delphi-Quellcode:
RaiseLastOSError;
Und ansonsten muß man eben im MSDN selber nachsehn, was der Fehlercode bedeutet. ![]() Zitat:
|
AW: Kassenlade öffnen
aber dieser drucker ist installiert und heisst
|
AW: Kassenlade öffnen
Delphi-Quellcode:
mit diesem code passiert nichts er öffnet die lade nicht
procedure OpenCashDrawer;
var hPrinter, hDeviceMode: THandle; N: DWORD; DocInfo1: TDocInfo1; Device, Driver, Port: array [0 .. 255] of Char; PrinterName, ThePrinter: string; Code: AnsiString; begin begin Code := AnsiChar(27) + AnsiChar(112) + AnsiChar(0) + AnsiChar(64) + AnsiChar(240); Printer.PrinterIndex := Printer.Printers.IndexOf('Name deines druckers'); Printer.GetPrinter(Device, Driver, Port, hDeviceMode); PrinterName := Format('%s', [Device]); if not WinSpool.OpenPrinter(PChar(PrinterName), hPrinter, nil) then begin ShowMessage('Error : ' + IntToStr(GetLastError)); Exit; end; with DocInfo1 do begin pDocName := 'Test'; pOutputFile := nil; pDataType := 'RAW'; end; WinSpool.StartDocPrinter(hPrinter, 1, @DocInfo1); WinSpool.StartPagePrinter(hPrinter); WinSpool.WritePrinter(hPrinter, PAnsiChar(Code), Length(Code), N); WinSpool.EndPagePrinter(hPrinter); WinSpool.EndDocPrinter(hPrinter); WinSpool.ClosePrinter(hPrinter); end; end; |
AW: Kassenlade öffnen
Zitat:
wie bzw. an welchem Anschluss ist er denn angeschlossen?..Diese Antwort fehlt von Anfang an!!!:roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz