Советы по Delphi

       

Построчная печать


В Delphi 1 (а затем и в Delphi 2) я попытался написать программу, печатающую построчно на принтере (любого типа), после выхода из которой принтер НЕ выплевывает лист, а продолжает на нем печатать в случае повторного использования программы, то есть программа позволяет печатать строчку за строчкой, не удаляя при этом лист в случае завершения задачи.

Это противоречит неписанным законам Microsoft, поскольку нарушает режим многозадачности, и все же именно для моей задачи мне необходимо именно такое решение.

Я создал клон объекта TPrinter, назначение которого вы поймете ниже. Это работает со всеми матричными принтерами.

Вот пример объекта:

var Myprinter : TRawPrinter;
oldprinter : TPrinter;begin
MyPrinter:=TRawPrinter.Create;oldprinter:=setprinter(MyPrinter);tryif Printdialog1.execute thenbeginmyprinter.startraw;myprinter.write('khsdhskhkshdksd');myprinter.writeln;myprinter.endraw;endfinallysetprinter(oldprinyter);myprinter.free;endend;

Вот пример использования объекта:

unit Rawprinter;

interface
uses
printers,windows;

type TRawprinter =class(TPrinter)
publicdc2 : HDC;procedure startraw;procedure endraw;procedure write(const s : string);procedure writeln;end;
implementation
uses
sysutils,forms;

function AbortProc(Prn: HDC; Error: Integer): Bool; stdcall;
begin
Application.ProcessMessages;Result := not Printer.Aborted;end;

type
TPrinterDevice = classDriver, Device, Port: String;constructor Create(ADriver, ADevice, APort: PChar);function IsEqual(ADriver, ADevice, APort: PChar): Boolean;end;
constructor TPrinterDevice.Create(ADriver, ADevice, APort: PChar);
begin
inherited
Create;Driver := ADriver;Device := ADevice;Port := APort;end;

function TPrinterDevice.IsEqual(ADriver, ADevice, APort: PChar): Boolean;
begin
Result := (Device = ADevice) and (Port = APort);end;

procedure TRawprinter.startraw;
var
CTitle: array[0..31] of Char;CMode : Array[0..4] of char;DocInfo: TDocInfo;r : integer;begin
StrPLCopy(CTitle, Title, SizeOf(CTitle) - 1);StrPCopy(CMode, 'RAW');FillChar(DocInfo, SizeOf(DocInfo), 0);with DocInfo dobegincbSize := SizeOf(DocInfo);lpszDocName := CTitle;lpszOutput := nil;lpszDatatype :=CMode;end;with TPrinterDevice(Printers.Objects[PrinterIndex]) dobeginDC2 := CreateDC(PChar(Driver), PChar(Device), PChar(Port), nil);end;SetAbortProc(dc2, AbortProc);r:=StartDoc(dc2, DocInfo);end;

procedure TRawprinter.endraw;
var r : integer;
begin
r:=windows.enddoc(dc2);end;

type passrec = packed record
l : word;s : Array[0..255] of char;end;var pass : Passrec;
procedure TRawprinter.write(const s : string);
begin
pass.l:=length(s);strpcopy(pass.s,s);escape(dc2,PASSTHROUGH,0,@pass,nil);end;

procedure TRawprinter.writeln;
begin
pass.l:=2;strpcopy(pass.s,#13#10);escape(dc2,PASSTHROUGH,0,@pass,nil);end;

end.

[000211]



Содержание раздела