Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Печать на матричном принтере. [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. а потом остальные. ибо тут не "управляющий символ", а "управляющая последовательность".


Наверх

Титульная страница Поиск, карта сайта Написать письмо