Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi .prn dateien ausdrucken (https://www.delphipraxis.net/79267-prn-dateien-ausdrucken.html)

skyquaker 19. Okt 2006 11:50


.prn dateien ausdrucken
 
Ich weiß, dass es diese Frage schon mehrmals hier gab, ich konnte jedoch mit allen Beispielen und Ideen nichts anfangen. Sie haben einfach nicht funktioniert !

Ich zeig euch mal meinen letzten Vesuch :

Delphi-Quellcode:
uses
  Printers, Winspool;

function SpoolFile(const FileName, PrinterName: string): Integer;
var
  Buffer: record
    JobInfo: record // ADDJOB_INFO_1
      Path: PChar;
      JobID: DWORD;
    end;
    PathBuffer: array[0..255] of Char;
  end;
  SizeNeeded: DWORD;
  Handle: THandle;
  PrtName: string;
  ok: Boolean;
begin
  // Flush job to printer
  PrtName := PrinterName;
  if PrtName = '' then
    PrtName := Printer.Printers[Printer.PrinterIndex]; // Default printer name
  ok := False;
  if OpenPrinter(PChar(PrtName), Handle, nil) then
    if AddJob(Handle, 1, @Buffer, SizeOf(Buffer), SizeNeeded) then
      if CopyFile(PChar(FileName), Buffer.JobInfo.Path, True) then
        if ScheduleJob(Handle, Buffer.JobInfo.JobID) then
          ok := True;
  if not ok then Result := GetLastError
  else
    Result := 0;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if SpoolFile('c:\test.prn', Printer.Printers[0]) = 0 then
    ShowMessage('No error...');
end;


Das geht auch nicht !!!! Ich werd verrückt :(

Kann mir jemand helfen ?

Flocke 19. Okt 2006 13:36

Re: .prn dateien ausdrucken
 
In meiner PrintToFile-Unit hab ich's so gelöst, das sollte funktionieren:
Delphi-Quellcode:
{ This function sends the given file to the currently selected printer
  (Delphi's "Printer" object).
}
procedure SendFileToPrinter(const Filename: string; const Docname: string = '');
var
  hPrinter, hFile: THandle;
  Info: TDocInfo1;
  Buffer: array [0 .. 4095] of char;
  NumBytes: cardinal;

  { This function returns the device name of the currently selected printer
    (Delphi's "Printer" object).
  }
  function GetPrinterDeviceName: string;
  var
    szDevice, szDriver, szPort: array [0 .. 1023] of char;
    hDevMode: THandle;
  begin
    Printer.GetPrinter(szDevice, szDriver, szPort, hDevMode);
    Result := StrPas(szDevice);
  end;

begin
  if not OpenPrinter(PChar(GetPrinterDeviceName), hPrinter, nil) then
    RaiseLastOsError;

  try
    if Docname <> '' then
      Info.pDocName := PChar(Docname)
    else
      Info.pDocName := PChar(Filename);
    Info.pOutputFile := nil;
    Info.pDatatype := nil;
    if StartDocPrinter(hPrinter, 1, @Info) = 0 then
      RaiseLastOsError;

    try
      if not StartPagePrinter(hPrinter) then
        RaiseLastOsError;

      try
        hFile := CreateFile(PChar(Filename), GENERIC_READ, FILE_SHARE_READ, nil,
                   OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
        if hFile = INVALID_HANDLE_VALUE then
          RaiseLastOsError;

        try
          repeat
            if not ReadFile(hFile, Buffer, SizeOf(Buffer), NumBytes, nil) then
              RaiseLastOsError;

            if NumBytes > 0 then
              if not WritePrinter(hPrinter, @Buffer[0], NumBytes, NumBytes) then
                RaiseLastOsError;
          until NumBytes = 0;
        finally
          CloseHandle(hFile);
        end;
      finally
        EndPagePrinter(hPrinter);
      end;
    finally
      EndDocPrinter(hPrinter);
    end;
  finally
    ClosePrinter(hPrinter);
  end;
end;
Benutzt den gerade eingestellten Drucker aus "Printers.pas". Alternativ musst du nur die Zeile mit OpenPrinter ändern.

// Edit: Eben schnell noch aus der Funktion eine Prozedur gemacht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 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