> Hi,
>
> I have a Serial Printer conected to COM1 but I don’t have the NT driver
> for it (it is an EPSON TM-U295), I need to print from my delphi 4
> application with a series of ESC commands, how can I do this.
You can either work dirrectly with the comm port functions,
or install any print driver (TTY/Generic recommended) and
use the following code:
The following unit “PrtRaw.pas” demonstrates a 16/32 bit
raw printing unit for Delphi and Borland C Builder.
Following the unit, is an exmaple on using the
PrtRaw unit.
Notes:
1) You are responsible for embedding all necessary
control codes that the printer may require (including
form feed codes).
2) You must specify a valid printer and port name.
[code lang=”delphi”]unit PrtRaw;
{Copyright (c) 1998 by Joe C. Hecht – All rights Reserved}
{
joehecht@gte.net
You may use and share this unit}
{providing my name and the copyright notice stays intact.}
interface
uses
WinTypes;
{$IFDEF WIN32}
type SpoolInt = DWORD;
{$ELSE}
type SpoolInt = integer;
{$ENDIF}
function StartRawPrintJob(PrinterName : pChar;
Port : pChar;
DocName : pChar) : THandle;
function StartRawPrintPage(hPrn : THandle) : integer;
function PrintRawData(hPrn : THandle;
Buffer : pointer;
NumBytes : SpoolInt) : integer;
function EndRawPrintPage(hPrn : THandle) : integer;
function EndRawPrintJob(hPrn : THandle) : integer;
implementation
uses
WinProcs,
{$IFDEF WIN32}
WinSpool;
{$ELSE}
Print;
{$ENDIF}
function StartRawPrintJob(PrinterName : pChar;
Port : pChar;
DocName : pChar) : THandle;
{$IFDEF WIN32}
var
hPrn : THandle;
DocInfo1 : TDocInfo1;
{$ENDIF}
begin
{$IFDEF WIN32}
if (OpenPrinter(PChar(PrinterName),
hPrn,
nil) = FALSE) then begin
Result := THandle(-1);
Exit;
end;
DocInfo1.pDocName := DocName;
DocInfo1.pOutputFile := Port;
DocInfo1.pDataType := ‘RAW’;
if (StartDocPrinter(hPrn,
1,
@DocInfo1) = 0) then begin
Result := THandle(-1);
exit;
end;
Result := hPrn;
{$ELSE}
result := OpenJob(Port,
DocName,
0);
{$ENDIF}
end;
function StartRawPrintPage(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (StartPagePrinter(hPrn) = FALSE) then begin
Result := -1;
exit;
end;
result := 1;
{$ELSE}
result := StartSpoolPage(hPrn);
{$ENDIF}
end;
function PrintRawData(hPrn : THandle;
Buffer : pointer;
NumBytes : SpoolInt) : integer;
{$IFDEF WIN32}
var
BytesWritten : DWORD;
{$ENDIF}
begin
if (NumBytes = 0) then begin
Result := 1;
exit;
end;
{$IFDEF WIN32}
if (WritePrinter(hPrn,
Buffer,
NumBytes,
BytesWritten) = FALSE) then begin
Result := -1;
exit;
end;
if (NumBytes <> BytesWritten) then begin
Result := -1;
exit;
end;
Result := 1;
{$ELSE}
result := WriteSpool(hPrn,
Buffer,
NumBytes);
{$ENDIF}
end;
function EndRawPrintPage(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (EndPagePrinter(hPrn) = FALSE) then begin
Result := -1;
exit;
end;
Result := 1;
{$ELSE}
result := EndSpoolPage(hPrn);
{$ENDIF}
end;
function EndRawPrintJob(hPrn : THandle) : integer;
begin
{$IFDEF WIN32}
if (EndDocPrinter(hPrn) = FALSE) then begin
Result := -1;
exit;
end;
if (ClosePrinter(hPrn) = FALSE) then begin
Result := -1;
exit;
end;
Result := 1;
{$ELSE}
result := CloseJob(hPrn);
{$ENDIF}
end;
end.
[/code]
Example of use:
[code lang=”delphi”]uses
PrtRaw;
procedure TForm1.Button1Click(Sender: TObject);
var
hPrn : THandle;
Data : array[0..31] of char;
begin
hPrn := StartRawPrintJob(‘Generic / Text Only’,
‘LPT1:’,
‘My Document’);
if (integer(hPrn) < 0) then begin
ShowMessage('StartRawPrintJob Failed');
exit;
end;
if (StartRawPrintPage(hPrn) < 0) then begin
ShowMessage('StartRawPrintPage Failed');
EndRawPrintJob(hPrn);
exit;
end;
Data[0] := 'P';
Data[1] := 'a';
Data[2] := 'g';
Data[3] := 'e';
Data[4] := #32;
Data[5] := '1';
Data[6] := #13;
Data[7] := #10;
if (PrintRawData(hPrn,
@data,
< 0) then begin
ShowMessage('PrintRawData Failed');
EndRawPrintPage(hPrn);
EndRawPrintJob(hPrn);
exit;
end;
if (EndRawPrintPage(hPrn) < 0) then begin
ShowMessage('EndRawPrintPage Failed');
EndRawPrintJob(hPrn);
exit;
end;
if (StartRawPrintPage(hPrn) < 0) then begin
ShowMessage('StartRawPrintPage Failed');
EndRawPrintJob(hPrn);
exit;
end;
Data[0] := 'P';
Data[1] := 'a';
Data[2] := 'g';
Data[3] := 'e';
Data[4] := #32;
Data[5] := '2';
Data[6] := #13;
Data[7] := #10;
if (PrintRawData(hPrn,
@data,
< 0) then begin
ShowMessage('PrintRawData Failed');
EndRawPrintPage(hPrn);
EndRawPrintJob(hPrn);
exit;
end;
if (EndRawPrintPage(hPrn) < 0) then begin
ShowMessage('EndRawPrintPage Failed');
EndRawPrintJob(hPrn);
exit;
end;
if (EndRawPrintJob(hPrn) < 0) then begin
ShowMessage('EndRawPrintJob Failed');
exit;
end;
end;
end.
[/code]
Joe
--
Joe C. Hecht
http://home1.gte.net/joehecht/index.htm
[tags]Delphi, Ports, Printing[/tags]
0 Kommentare zu “Print direct to Port (without driver)”