AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kassenlade öffnen

Ein Thema von Natcree · begonnen am 21. Jun 2014 · letzter Beitrag vom 26. Jun 2014
Antwort Antwort
Seite 8 von 9   « Erste     678 9      
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#71

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 10:04
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
rawdatatoprinter(pwidechar('CognitiveTPG Receipt'),pbyte(p),length(acmd)); invalid typcast pbyte(p)
  Mit Zitat antworten Zitat
Zoot

Registriert seit: 30. Jan 2006
Ort: Hessen
110 Beiträge
 
Delphi 11 Alexandria
 
#72

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 10:43

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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#73

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 10:55

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

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 )
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (26. Jun 2014 um 11:15 Uhr)
  Mit Zitat antworten Zitat
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#74

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 11:17
und wie kann ich den befehl jetzt an den Printer schicken?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#75

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 11:31
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?
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#76

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 11:54
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?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#77

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 12:25
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 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} 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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#78

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 12:44
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
RawDataToPrinter( 'CognitiveTPG Receipt',GetDefaultGeneratePulseSequence, length(GetDefaultGeneratePulseSequence) );//hier sagt er mir incompatible type string und pbyte
end;
  Mit Zitat antworten Zitat
arnof

Registriert seit: 25. Apr 2013
1.252 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#79

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 12:57
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
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#80

AW: Kassenlade öffnen

  Alt 26. Jun 2014, 13:30
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.

Geändert von Blup (26. Jun 2014 um 13:40 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 8 von 9   « Erste     678 9      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:30 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