Ïîä Win16 Âû ìîæåòå èñïîëüçîâàòü ôóíêöèþ SpoolFile, èëè Passthrough escape, åñëè ïðèíòåð ïîääåðæèâàåò ïîñëåäíåå.
Ïîä Win32 Âû ìîæåòå èñïîëüçîâàòü WritePrinter.
Íèæå ïðèìåð îòêðûòèÿ ïðèíòåðà è çàïèñè ÷èñòîãî ïîòîêà äàííûõ â ïðèíòåð.
Ó÷òèòå, ÷òî Âû äîëæíû ïåðåäàòü êîððåêòíîå èìÿ ïðèíòåðà, òàêîå, êàê "HP LaserJet 5MP", ÷òîáû ôóíêöèÿ ñðàáîòàëà óñïåøíî.
Êîíå÷íî, Âû ìîæåòå âêëþ÷àòü â ïîòîê äàííûõ ëþáûå íåîáõîäèìûå óïðàâëÿþùèå êîäû, êîòîðûå ìîãóò ïîòðåáîâàòüñÿ.
uses WinSpool;
procedure WriteRawStringToPrinter(PrinterName:String; S:String);
var
Handle: THandle;
N: DWORD;
DocInfo1: TDocInfo1;
begin
if not OpenPrinter(PChar(PrinterName), Handle, nil) then
begin
ShowMessage('error ' + IntToStr(GetLastError));
Exit;
end;
with DocInfo1 do
begin
pDocName := PChar('test doc');
pOutputFile := nil;
pDataType := 'RAW';
end;
StartDocPrinter(Handle, 1, @DocInfo1);
StartPagePrinter(Handle);
WritePrinter(Handle, PChar(S), Length(S), N);
EndPagePrinter(Handle);
EndDocPrinter(Handle);
ClosePrinter(Handle);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WriteRawStringToPrinter('HP', 'Test This');
end;
(Borland/Inprise FAQ N714, ïåðåâåäåí Àêæàíîì Àáäóëèíûì)
Ïîñìîòðè è äîäåëàé êàê òåáå íàäî.
unit TextPrinter;
interface
uses
Windows, Controls, Forms, Dialogs;
type
TTextPrinter = class(TObject)
private
FNumberOfBytesWritten: Integer;
FHandle: THandle;
FPrinterOpen: Boolean;
FErrorString: PChar;
procedure SetErrorString;
public
constructor Create;
procedure Write(const Str: string);
procedure WriteLn(const Str: string);
destructor Destroy; override;
published
property NumberOfBytesWritten: Integer read
FNumberOfBytesWritten;
end;
implementation
{TTextPrinter}
constructor TTextPrinter.Create;
begin
FHandle := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ
or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if FHandle = INVALID_HANDLE_VALUE then
begin
SetErrorString;
raise Exception.Create(FErrorString);
end
else
FPrinterOpen := True;
end;
procedure TTextPrinter.SetErrorString;
begin
if FErrorString <> nil then
LocalFree(Integer(FErrorString));
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or
FORMAT_MESSAGE_FROM_SYSTEM,
nil,
GetLastError(),
LANG_USER_DEFAULT,
@FErrorString,
0,
nil
);
end;
procedure TTextPrinter.Write(const Str: string);
var
OEMStr: PChar;
NumberOfBytesToWrite: Integer;
begin
if not FPrinterOpen then
Exit;
NumberOfBytesToWrite := Length(Str);
OEMStr := PChar(LocalAlloc(LMEM_FIXED, NumberOfBytesToWrite +
1));
try
CharToOem(PChar(Str), OEMStr);
if not WriteFile(FHandle, OEMStr^, NumberOfBytesToWrite,
FNumberOfBytesWritten, nil) then
begin
SetErrorString;
raise Exception.Create(FErrorString);
end;
finally
LocalFree(Integer(OEMStr));
end;
end;
procedure TTextPrinter.WriteLn(const Str: string);
begin
Self.Write(Str);
Self.Write(#10);
end;
destructor TTextPrinter.Destroy;
begin
CloseHandle(FHandle);
if FErrorString <> nil then
LocalFree(Integer(FErrorString));
end;
end.
P.S.  ïðèíöèïå, âìåñòî LPT1 ìîæåò ñòîÿòü ÷òî óãîäíî, äàæå ñåòåâîé ñåðâåð ïå÷àòè (\\server\prn) - âñå ðàâíî ïå÷àòàåò. Ìîæíî è ïàðàìåòð â êîíñòðóêòîð âñòàâèòü è ò.ä.
Oleg Yunets
(2:451/300.24)