Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PRN-Dateien an Drucker senden

68 views
Skip to first unread message

Tobias Kolb

unread,
Nov 14, 2000, 3:00:00 AM11/14/00
to
Hi! Ich hab da ein Problem. Ich nutze die Funktion "In Datei Drucken" um das
erzeugte Printerfile (*.prn) dann an einem anderen Rechner, an dem ein
besserer Drucker hängt auszudrucken. Da kann ich ja per Dos-Box mit "copy /b
filename.prn LPT:" wunderbar machen. Nun wollte ich mir ein Delphi-Programm
dafür schreiben, dass genau ein solches binäres Printer-File direkt an den
Drucker sendet.
So weit, so gut! Das Problem liegt aber darin, dass der Drucker nich am LPT1
hängt, sondern an der USB-Schnittstelle. Also einfach in den LPT Port
schreiben scheidet hier als Möglichkeit schon mal aus. Gibt es hier eine
Möglichkeit die Datei nicht an eine Schnittstelle (LPT) zu senden, sondern
dass ich mit einem PrintDialog einen Drucker auswähle und ich dann die Datei
an den unter Windows installierten Drucker sende?
Ich hab mal ein Programm gesehen ("Imprint") das genau das macht. Aber ich
will sowas selber basteln. Für eure Hilfe schon mal ein Dank im Vorraus.

Andreas Schmidt

unread,
Nov 15, 2000, 3:00:00 AM11/15/00
to

"Tobias Kolb" <pacm...@freenet.de> wrote in message
news:8urvvs$2k6sn$1...@ID-60961.news.dfncis.de...

> Ich hab da ein Problem. Ich nutze die Funktion "In Datei Drucken" um das
> erzeugte Printerfile (*.prn) dann an einem anderen Rechner, an dem ein
> besserer Drucker hängt auszudrucken. Da kann ich ja per Dos-Box mit "copy /b
> filename.prn LPT:" wunderbar machen. Nun wollte ich mir ein Delphi-Programm
> dafür schreiben, dass genau ein solches binäres Printer-File direkt an den
> Drucker sendet.
> So weit, so gut! Das Problem liegt aber darin, dass der Drucker nich am LPT1
> hängt, sondern an der USB-Schnittstelle. Also einfach in den LPT Port
> schreiben scheidet hier als Möglichkeit schon mal aus. Gibt es hier eine
> Möglichkeit die Datei nicht an eine Schnittstelle (LPT) zu senden, sondern
> dass ich mit einem PrintDialog einen Drucker auswähle und ich dann die Datei
> an den unter Windows installierten Drucker sende?
>

Da kann dir folgende Unit helfen:

Gruß
Andreas Schmidt

{---------------------------------------------------}
{ Copyright (c)2000 by Przemyslaw Jankowski }
{ e-mail: pj...@pjank.pl }
{---------------------------------------------------}
{ }
{ Thanks to: }
{ - Harald Bender <ben...@nt-newton.fho-emden.de> }
{ for helping me with WinNT support }
{ and German error messages }
{ }
{---------------------------------------------------}
unit RAWPrinting;
{$B-,H+,X+}

interface

uses SysUtils;


type
ERAWPrintError = class(Exception);
ERAWPrintErrorPrinterName = class(ERAWPrintError);


procedure RAWPrint(PrinterName, DocumentTitle, DocumentData: string);
// PrinterName - the name of the printer you want to use
// to use the default printer - leave this blank
// DocumentTitle - the text that is listed in the Print Manager
// DocumentData - the text you want to send to the printer

implementation

uses WinSpool, Windows, Printers, Consts;

const
// English //
// errNoDefaultPrinter = 'No default printer found.';
// errOpenPrinter = 'The printer "%s" is not available.';
// errPrintError = 'Error printing the document "%s".';
// German //
errNoDefaultPrinter = 'Keinen Standarddrucker gefunden.';
errOpenPrinter = 'Der Drucker "%s" ist nicht verfügbar.';
errPrintError = 'Fehler beim Drucken von Dokument "%s".';
// Polish //
// errNoDefaultPrinter = 'Brak domyolnej drukarki.';
// errOpenPrinter = 'Drukarka "%s" jest niedostępna.';
// errPrintError = 'Błšd przy drukowaniu "%s".';


function DefaultPrinter:string;
var str: array[0..79]of Char;
function FetchStr(s:string):string;
var i: Integer;
begin
s:= TrimLeft(s);
i:= Pos(',',s);
if i=0
then Result:= s
else Result:= Copy(s, 1, i-1);
end;
begin
GetProfileString('windows', 'device', '', str, SizeOf(str)-1);
Result:= FetchStr(str);
if Result='' then
// raise ERAWPrintErrorPrinterName.Create(errNoDefaultPrinter);
raise EPrinter.Create(SNoDefaultPrinter);
end;

procedure RAWPrint(PrinterName, DocumentTitle, DocumentData: string);
var hPrinter: DWord;
DocInfo: TDocInfo1;
dwJob: Integer;
dwBytesWritten: DWord;
procedure PrintError;
begin
raise ERAWPrintError.Create(Format(errPrintError, [DocumentTitle]));
end;
begin
if PrinterName='' then PrinterName:= DefaultPrinter;
if not OpenPrinter(PChar(PrinterName), hPrinter, nil) then
raise ERAWPrintErrorPrinterName.Create(Format(errOpenPrinter,
[PrinterName]));
try
DocInfo.pOutputFile:= nil;
DocInfo.pDatatype:= 'RAW';
DocInfo.pDocName:= PChar(DocumentTitle);
dwJob:= StartDocPrinter(hPrinter, 1, @DocInfo);
if (dwJob=0) then PrintError;
try
if not StartPagePrinter(hPrinter) then PrintError;
try
if not WritePrinter(hPrinter, Pointer(DocumentData),
Length(DocumentData), dwBytesWritten)
then PrintError;
if (LongInt(dwBytesWritten)<Length(DocumentData))
then PrintError;
finally
if not EndPagePrinter(hPrinter) then PrintError;
end;
finally
if not EndDocPrinter(hPrinter) then PrintError;
end;
finally
ClosePrinter(hPrinter);
end;
end;


end.


Tobias Kolb

unread,
Nov 15, 2000, 3:00:00 AM11/15/00
to
Genau so was hab ich gesucht. Danke!

Gruß Tobias

0 new messages