Delphi-PRAXiS
Seite 1 von 3  1 23      

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 21. Jun 2014 11:16

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:
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;
1. Hier sagt er mir AnsiStrAlloc undeclared identifier

2. Dann ist mir auf gefallen das der Drucker nicht im BS zusehen ist.
Wie bekomme ich das gelöst?

mkinzler 21. Jun 2014 11:20

AW: Kassenlade öffnen
 
zu 1.) Hast Du SysUtils eingebunden?

zu 2.) Treiber installieren, bzw. DummyPrinter auf den Port einrichten

Natcree 21. Jun 2014 11:28

AW: Kassenlade öffnen
 
sysutils ist eingebunden.

Ich instaliere mir jetzt den dummy treiber.

Natcree 21. Jun 2014 11:29

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?

mkinzler 21. Jun 2014 11:36

AW: Kassenlade öffnen
 
Wie/wo wird der Drucker angeschlossen?

Natcree 21. Jun 2014 11:41

AW: Kassenlade öffnen
 
also habe jetzt den TPG Drucker in windows installiert auf anschluss com1 gelegt. jedoch bekomme ich den undeclared identifier nicht weg :(

mkinzler 21. Jun 2014 11:44

AW: Kassenlade öffnen
 
Warum nicht einfach
Delphi-Quellcode:
p := PAnsiChar( acmd);
?

Natcree 21. Jun 2014 11:49

AW: Kassenlade öffnen
 
Okay das funcktioniert schonmal jetzt meckert er hier

Delphi-Quellcode:
rawdatatoprinter(pwidechar('CognitiveTPG Receipt'),pbyte(p),length(acmd));
invalid typcast

mkinzler 21. Jun 2014 11:52

AW: Kassenlade öffnen
 
Bei welchem Parameter?
Ein Zeiger auf eine Konstante ist schlecht

Natcree 21. Jun 2014 11:54

AW: Kassenlade öffnen
 
ich denke mal pbyte

mkinzler 21. Jun 2014 11:55

AW: Kassenlade öffnen
 
Das sollte der Compiler aber Anzeigen.

Natcree 21. Jun 2014 12:08

AW: Kassenlade öffnen
 
ja er setzt den cursor vor pbyte(p)

mkinzler 21. Jun 2014 12:44

AW: Kassenlade öffnen
 
Versuch mal nur p oder
Delphi-Quellcode:
PByte(acmd)

Natcree 21. Jun 2014 13:02

AW: Kassenlade öffnen
 
der fehler kommt immer noch

jensw_2000 21. Jun 2014 16:17

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.
http://de.wikipedia.org/wiki/Bell_(Steuerzeichen)
Das war sehr einfach und klappt vielleicht heute auch noch?

Dejan Vu 22. Jun 2014 10:08

AW: Kassenlade öffnen
 
Nimm den OPOS-Treiber und mach das darüber. Ist nicht so ganz trivial... aber eigentlich schon.:stupid:

Natcree 23. Jun 2014 13:03

AW: Kassenlade öffnen
 
so habe jetzt ne lösung jedoch druckt er einen schnippsel mit aus

Delphi-Quellcode:
SendEscapeToPrinter('CognitiveTPG Receipt','ESC p m t1 t2')
Das druckt er aus wie bekomme ich es weg.
'ESC p m t1 t2'

arnof 23. Jun 2014 13:16

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!

Natcree 23. Jun 2014 13:44

AW: Kassenlade öffnen
 
habe ich schon also die lade wird geöffnet aber er druckt den Steuerbefehl mit aus

arnof 23. Jun 2014 15:21

AW: Kassenlade öffnen
 
Zitat:

Zitat von Natcree (Beitrag 1263255)
habe ich schon also die lade wird geöffnet aber er druckt den Steuerbefehl mit aus

Echt ? ich habe das schon auf vielen verschiedenen Geräten getestet, ich hatte nur einen Kunden bei dem das nicht ging, das war ein älterer EPSON TM88III oder 88IV Drucker.

Sonst keinerlei Probleme!

Natcree 23. Jun 2014 17:11

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?

implementation 23. Jun 2014 20:13

AW: Kassenlade öffnen
 
Das Escape-Zeichen bekommst du mit #27, und dann hängst du das p hinterher:
Delphi-Quellcode:
#27'p'
Sollte den gewünschten Effekt von dem haben, was im Handbuch deiner Kassenlade als "ESC p" beschrieben wird.

Natcree 23. Jun 2014 21:24

AW: Kassenlade öffnen
 
Danke werde es morgen gleich versuchen

noisy_master 24. Jun 2014 11:20

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:
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;
Hope it helps!

P.S.: geht bestimmt eleganter, aber....

himitsu 24. Jun 2014 12:09

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;

Natcree 24. Jun 2014 12:19

AW: Kassenlade öffnen
 
leider passiert nichts mit deinem code

noisy_master 24. Jun 2014 14:05

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

Natcree 24. Jun 2014 14:16

AW: Kassenlade öffnen
 
ja habe ich :(

himitsu 24. Jun 2014 14:27

AW: Kassenlade öffnen
 
Meintest du jetzt "meinen" oder seinen Code?

Natcree 24. Jun 2014 14:29

AW: Kassenlade öffnen
 
seinen code nicht deinen

himitsu 24. Jun 2014 14:50

AW: Kassenlade öffnen
 
Und so? (nicht über TPrinter, sondern direkt an den Drucker-Port)
Delphi-Quellcode:
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);
bzw.
Delphi-Quellcode:
with TFileStream.Create('LPT1', fmOpenWrite) do
  try
    WriteBuffer(PAnsiChar(AnsiString(#27#112#0#64#240))^, 5);
  finally
    Free;
  end;

Natcree 24. Jun 2014 14:55

AW: Kassenlade öffnen
 
wo muss ich deinen code pasten?

himitsu 24. Jun 2014 15:13

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.

Natcree 24. Jun 2014 15:17

AW: Kassenlade öffnen
 
also habe jetzt diesen code

Delphi-Quellcode:
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;
zeigt mir fehler 1801 an. und die lade bleibt zu

DeddyH 24. Jun 2014 15:23

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?

Natcree 24. Jun 2014 15:32

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.

himitsu 24. Jun 2014 15:41

AW: Kassenlade öffnen
 
Statt einem
Delphi-Quellcode:
ShowMessage(IntToStr(GetLastError));
kann man sich den Fehler natürlich auch übersetzen lassen.
z.B.
Delphi-Quellcode:
RaiseLastOSError;


Und ansonsten muß man eben im MSDN selber nachsehn, was der Fehlercode bedeutet.
http://msdn.microsoft.com/en-us/libr.../ms681386.aspx
Zitat:

ERROR_INVALID_PRINTER_NAME

1801 (0x709)

The printer name is invalid.

Natcree 24. Jun 2014 15:50

AW: Kassenlade öffnen
 
aber dieser drucker ist installiert und heisst

Natcree 24. Jun 2014 15:52

AW: Kassenlade öffnen
 
Delphi-Quellcode:
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;
mit diesem code passiert nichts er öffnet die lade nicht

Der.Kaktus 24. Jun 2014 16:11

AW: Kassenlade öffnen
 
Zitat:

Zitat von Natcree (Beitrag 1263087)
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:
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;
1. Hier sagt er mir AnsiStrAlloc undeclared identifier

2. Dann ist mir auf gefallen das der Drucker nicht im BS zusehen ist.
Wie bekomme ich das gelöst?



wie bzw. an welchem Anschluss ist er denn angeschlossen?..Diese Antwort fehlt von Anfang an!!!:roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr.
Seite 1 von 3  1 23      

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