Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

Печать на матричном принтере.   Найти похожие ветки 

 
иван8511   (2006-09-03 22:37) [0]

Для печати на матричном принтере 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, и другие тоже. Подскажите как можно послать управляющий символ.


 
Ketmar ©   (2006-09-03 22:43) [1]

громко. можно матом. а можно по коду, который #27. а потом остальные. ибо тут не "управляющий символ", а "управляющая последовательность".


 
иван8511   (2006-09-03 22:46) [2]

Спасибо, а можно маленький примерчик? Пожалуйста.


 
Ketmar ©   (2006-09-03 23:11) [3]

как тяжео-то сегодня... #27"M"


 
иван8511   (2006-09-04 01:10) [4]

Извините, но не работает... Может еще чего подскажите


 
Ketmar ©   (2006-09-04 01:12) [5]

подскажу пользоваться поиском, потому что подобная тема была совсем недавно.


 
Slym ©   (2006-09-04 04:24) [6]

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.


 
isasa ©   (2006-09-04 15:25) [7]

Я думаю этого будет мало. На LX 300 сзади есть рычаг переключения типа подачи трактор-листовая. Если не переключать, то отсчитав, где-то 66 линий, будет автовыброс страницы при страничной подаче. Рычаг на трактор, и выключить-включить(это обязательно). Далее Руководство пользователя в руки, раз эскейп-последовательностями пользуешься.


 
isasa ©   (2006-09-04 15:38) [8]

Да, забыл добавить, как всегда.
Для простоты(чтобы не морочить голову третьими компонентами), в системных настройках принтера -Advanced (Дополнительно(?), сорри у меня на работе анг. винда) включить флаг Print directly to the printer Spool print documents .... По идее, это выключит спулер печати (spoolsv.exe) и все пойдет напрямую в принтер, правда приложение будет ждать конца печати.


 
isasa ©   (2006-09-04 15:40) [9]

включить флаг Print directly to the printer Spool print documents ....

читать как

включить флаг Print directly to the printer и выключить Spool print documents ....



Страницы: 1 вся ветка

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
2-1167378004
boleg
2006-12-29 10:40
2007.01.21
Непонимаю почему не работает


15-1167428268
Джо
2006-12-30 00:37
2007.01.21
I hate it!


2-1168017555
XfroSt
2007-01-05 20:19
2007.01.21
Tmemo и видимые строки


6-1156069986
kernel
2006-08-20 14:33
2007.01.21
Передача файлов по сети


2-1167757954
zol
2007-01-02 20:12
2007.01.21
заблокировать(запретить) ввод в TEdit