![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Печать на матричном принтере. [D6, WinXP]
иван8511 © (2006-09-03 22:37:00)Для печати на матричном принтере Epson LX-300 (в обход Windows) использую код
procedure TForm1.Button3Click(Sender: TObject);
var
Lst: TextFile;
begin
AssignFile(Lst, 'LPT1');
Rewrite(Lst);
Label1.Caption := WinToDos('Привет мир!!!');
WriteLn(Lst, Label1.Caption);
CloseFile(Lst);
end;
Если использовать другие способы печати, то после напечатанной строки лист бумаги полностью выезжает, а мне нужно печатать на РУЛОННОЙ бумаге талончики.
Но при этом коде не знаю как послать на принтер управляющий символ типа уплотнения печати – ESC M, и другие тоже. Подскажите как можно послать управляющий символ.
isasa (2006-09-04 15:40:00) [1]включить флаг Print directly to the printer Spool print documents ....
читать как
включить флаг Print directly to the printerи выключить Spool print documents ....
isasa (2006-09-04 15:38:00) [2]Да, забыл добавить, как всегда.
Для простоты(чтобы не морочить голову третьими компонентами), в системных настройках принтера -Advanced (Дополнительно(?), сорри у меня на работе анг. винда) включить флаг Print directly to the printer Spool print documents .... По идее, это выключит спулер печати (spoolsv.exe) и все пойдет напрямую в принтер, правда приложение будет ждать конца печати.
isasa (2006-09-04 15:25:00) [3]Я думаю этого будет мало. На LX 300 сзади есть рычаг переключения типа подачи трактор-листовая. Если не переключать, то отсчитав, где-то 66 линий, будет автовыброс страницы при страничной подаче. Рычаг на трактор, и выключить-включить(это обязательно). Далее Руководство пользователя в руки, раз эскейп-последовательностями пользуешься.
Slym (2006-09-04 04:24:00) [4]
unit Unit1;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj,SysUtils, DirectPrintLib_TLB, StdVcl;
type
TDirectPrint = class(TAutoObject, IDirectPrint)
protected
procedure PrintStr(const Str: WideString); safecall;
end;
implementation
uses Windows,WinSpool,ComServ,Consts;
function GetDefaultPrinterName:string;
function FetchStr(var Str: PChar): PChar;
var P: PChar;
begin
Result := Str;
if Str = nil then Exit;
P := Str;
while P^ = ' ' do Inc(P);
Result := P;
while (P^ <> #0) and (P^ <> ',') do Inc(P);
if P^ = ',' then
begin
P^ := #0;
Inc(P);
end;
Str := P;
end;
var
ByteCnt, StructCnt: DWORD;
DefaultPrinter: array[0..1023] of Char;
Cur: PChar;
PrinterInfo: PPrinterInfo5;
begin
result:='';
ByteCnt:=0;
StructCnt:=0;
if not EnumPrinters(PRINTER_ENUM_DEFAULT,nil,5,nil,0,ByteCnt,StructCnt) and (GetLastError<>ERROR_INSUFFICIENT_BUFFER) then
begin
if GetLastError = ERROR_INVALID_NAME then
raise Exception.Create(SNoDefaultPrinter)
else
RaiseLastOSError;
end;
PrinterInfo:=AllocMem(ByteCnt);
try
if not EnumPrinters(PRINTER_ENUM_DEFAULT,nil,5,PrinterInfo,ByteCnt,ByteCnt,StructCnt) then
RaiseLastOSError;
if StructCnt>0 then
result:=PrinterInfo.pPrinterName
else begin
GetProfileString('windows','device','',DefaultPrinter,SizeOf(DefaultPrinter)-1);
Cur:=DefaultPrinter;
result:=FetchStr(Cur);
end;
finally
FreeMem(PrinterInfo);
end;
if result='' then
raise Exception.Create(SNoDefaultPrinter);
end;
procedure TDirectPrint.PrintStr(const Str: WideString);
var
s,PrinterName:string;
hPrinter:THandle;
DocInfo:TDocInfo1;
Len,Writed:DWORD;
begin
s:=Str;
Len:=Length(s);
if Len=0 then exit;
if s[Len]<>#12 then
begin
s:=s+#12;
inc(Len);
end;
PrinterName:=GetDefaultPrinterName;
if not OpenPrinter(PChar(PrinterName),hPrinter, nil) then RaiseLastOSError;
try
DocInfo.pDocName:='DirectPrint';
DocInfo.pOutputFile:=nil;
//DocInfo.pDatatype:='RAW';
DocInfo.pDatatype:='TEXT';
if StartDocPrinter(hPrinter,1,@DocInfo)=0 then RaiseLastOSError;
//if not StartPagePrinter(hPrinter) then RaiseLastOSError;
if not WritePrinter(hPrinter,PChar(s),Len,writed) then RaiseLastOSError;
if writed<>Len then RaiseLastOSError;
//if not EndPagePrinter(hPrinter) then RaiseLastOSError;
if not EndDocPrinter(hPrinter) then RaiseLastOSError;
finally
ClosePrinter(hPrinter);
end;
end;
initialization
TAutoObjectFactory.Create(ComServer, TDirectPrint, Class_DirectPrint,
ciMultiInstance, tmApartment);
end.
Ketmar (2006-09-04 01:12:00) [5]подскажу пользоваться поиском, потому что подобная тема была совсем недавно.
иван8511 (2006-09-04 01:10:00) [6]Извините, но не работает... Может еще чего подскажите
Ketmar (2006-09-03 23:11:00) [7]как тяжео-то сегодня...
#27'M'
иван8511 (2006-09-03 22:46:00) [8]Спасибо, а можно маленький примерчик? Пожалуйста.
Ketmar (2006-09-03 22:43:00) [9]громко. можно матом. а можно по коду, который #27. а потом остальные. ибо тут не "управляющий символ", а "управляющая последовательность".