Einzelnen Beitrag anzeigen

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, 11: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 12:15 Uhr)
  Mit Zitat antworten Zitat