Impressao - imprimindo usando o RAW |
Top Previous Next |
// Is very common the needed to print raw text. // Here is a complete class for do it. // *** There is a requirement: to install the Generic/Only text printer of Windows. ***
// Here an example:
var xPrn: TRawPrint; begin xPrn:=TRawPrint.Create; // create an instance xPrn.PrinterName:='Name of the Generic printer'; if xPrn.Open then begin // if I can open the printer xPrn.Condensed:=True; // print to 16 cpi xPrn.InitPrinter; xPrn.Print(2,10,'My Text'); // I set the row, column and text to print xPrn.LaserPrinter:=True; // I can do it with laser printers; xPrn.Write ('Another Text'); // I dont need to specify the row and column xPrn.NewPage; // Form Feed xPrn.Close: // I close the printer end; xPrn.Free; // release the instance end;
/////////////////////////// UNIT RAW ////////////////////////////////
unit Uraw;
{ Unit to print raw text Author: Alejandro Castro Date 16/Jul/2000 }
interface
uses SysUtils, Windows, WinSpool;
type TRawPrint = class(TObject) private xIsOpen : Boolean; xHandle : THandle; xBytesWritten: DWord; xDocInfo : TDocInfo1; xIsMatrix : Boolean; // is a matrix printer ? function ReadLasPrt: Boolean; function ReadMatPrt: Boolean; procedure WriteLasPrt(const Value: Boolean); procedure WriteMatPrt(const Value: Boolean);
public Row : Integer; // current row Column : Integer; // current column RowsPage : Integer; // no. of rows per page Document : string; // name of the document for winspool PrinterName : string; // name of the raw printer Condensed : Boolean; // print on condensed mode SeqCondensed: string; // sequence of chars for print to 16 cpi SeqNormal : string; // sequence of chars for print to 10 cpi
constructor Create; function Open: Boolean; // open the printer function Close: Boolean; // close the printer Function InitPrinter: Boolean; Function Write(const xText: string): Boolean; Procedure SetPos(const xRow, xCol: Integer); Procedure Go(const xRow, xCol: Integer); // force to move the head of the printer Procedure GoTop; // go to the begining of the next page or form Procedure NewPage; // form feed Procedure Print(const xRow, xCol: Integer; const xText: string); // print xText on the row, col property MatrixPrinter: Boolean read ReadMatPrt write WriteMatPrt; property LaserPrinter : Boolean read ReadLasPrt write WriteLasPrt; end;
implementation
constructor TRawPrint.Create; begin Row := 0; Column := 0; RowsPage := 66; xIsOpen := False; Condensed := False; Document := 'Alfra'; PrinterName := ''; MatrixPrinter:= True; end;
function TRawPrint.ReadMatPrt : Boolean; begin Result:= xIsMatrix; end;
procedure TRawPrint.WriteMatPrt(const Value: Boolean); begin xIsMatrix := Value; SeqNormal := #18; SeqCondensed := #15; end;
procedure TRawPrint.WriteLasPrt(const Value: Boolean); begin xIsMatrix := not Value; SeqNormal := #27 + '&l6D' + #27 + '(s0p10H'; SeqCondensed := #27 + '&l6D' + #27 + '(s0p16.66H'; end;
function TRawPrint.ReadLasPrt : Boolean; begin Result:=not xIsMatrix; end;
function TRawPrint.Open: Boolean; begin Result := False; if not xIsOpen then begin if PrinterName <> '' then begin if Document = '' then Document := 'Alfra';
with xDocInfo do begin pDocName := PChar(Document); pOutputFile := nil; pDatatype := 'RAW'; end;
Result := OpenPrinter(PChar(PrinterName), xHandle, nil);
if Result then begin Row := 0; Column := 0; if StartDocPrinter(xHandle, 1, @xDocInfo) = 0 then begin Result := False; ClosePrinter(xHandle); end; end; end; xIsOpen := Result; end; end;
function TRawPrint.Close: Boolean; begin Result := False; if xIsOpen then Result := ClosePrinter(xHandle); end;
procedure TRawPrint.SetPos(const xRow, xCol: Integer); begin Column := xCol; Row := xRow; end;
function TRawPrint.InitPrinter: Boolean; begin Column := 0; Row := 0;
if Condensed then Write(SeqCondensed + #13) else Write(SeqNormal + #13);
Result := True; end;
procedure TRawPrint.Go(const xRow, xCol: Integer); var i: Integer; begin if Row > xRow then GoTop;
i:=Row; while i < xRow do begin Write(#10); inc(i); Row := i; end;
if Column > xCol then begin Write(#13); Column := 0; end;
i := Column; if i <> xCol then Write( Format('%-*s',[xCol-Column,'']) );
Column := xCol; end;
procedure TRawPrint.GoTop; begin Go(RowsPage,0); Column := 0; Row := 0; end;
procedure TRawPrint.Print(const xRow, xCol: Integer; const xText: string); begin Go(xRow, xCol); if Write(xText) then Column := Column + Integer(xBytesWritten); end;
procedure TRawPrint.NewPage; begin Write( #12#13 ); Column := 0; Row := 0; end;
function TRawPrint.Write(const xText: string): Boolean; var xBuffer: string; begin Result := False; xBuffer := xText;
if xIsOpen then Result := WritePrinter(xHandle, @xBuffer[1], Length(xBuffer), xBytesWritten); end;
end. |