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

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

Печать на матричном принтере из Delphi [D6, WinXP]


maddognt ©   (2004-11-27 14:19:00) 

Здравствуйте Уважаемые мастера
Я печатаю на матричном принтере (Epson LX 300) из Delphi следующим способом:

  with Printer do
  begin
     BeginDoc;
     Canvas.TextRect(Rect(20,20,PageWidth-10,PageHeight-10),
     20, 20, 'Some text');
     EndDoc;
  end;

Проблема в том, что принтер печатает текст в два прохода каретки.
А я хочу в один. Если на принтере принудительно выставить шрифт Draft, то при посылке на печать он все равно переходит в режим Roman.
Как заставить принтер печатать текст в один проход каретки?
Пробовал способ из FAQ, но он тоже не помог.

Заранее благодарен.


KSergey   (2004-11-29 06:58:00) [1]

Особо чистить было лень

var
   DocInfo : DOC_INFO_1;
   h : Cardinal;
   PrinterOpened,DocStarted,PageStarted : boolean;

   // вывести строку
   procedure OutStr (AStr: String);
   var
     BytesWritten : cardinal;
   begin
     AStr := AStr + #13#10;
     WritePrinter (h, PChar(AStr), Length(AStr), BytesWritten);
   end;

   // выкинуть страницу
   procedure EjectPage;
   const
     EJECT_PAGE_CODE: String = #12;
   var
     BytesWritten : cardinal;
   begin
     WritePrinter (h, PChar(EJECT_PAGE_CODE), Length(EJECT_PAGE_CODE), BytesWritten);
   end;

   procedure InitPrinter;
   begin
     // подготовка
     PrinterOpened:=false;
     DocStarted   :=false;
     PageStarted  :=false;

     if not OpenPrinter(PChar(PrName),h,nil) then
       raise Exception.Create (SysErrorMessage(GetLastError ));
     PrinterOpened := TRUE;
     DocInfo.pDocName   := PChar(Application.MainForm.Caption);
     DocInfo.pOutputFile:=nil;
     DocInfo.pDatatype  :='RAW';
     if StartDocPrinter(h,1,@DocInfo)=0 then
       raise Exception.Create (SysErrorMessage(GetLastError ));
     DocStarted := TRUE;
     PageStarted := StartPagePrinter(h);
     if not PageStarted then
       raise Exception.Create (SysErrorMessage(GetLastError ));
   end;

-------- собственно пример печати ----------

 try
   InitPrinter;

  // здесь пошла печать по строкам
 OutStr('Текст');
 OutStr('Текст 2');
 OutStr('Текст 3');
//  EjectPage;  // если надо выкинуть страницу
 finally
   // завершающие действия
   if PageStarted then EndPagePrinter(h);
   if DocStarted then EndDocPrinter(h);
   if PrinterOpened then ClosePrinter(h);
 end;


KSergey   (2004-11-28 14:15:00) [2]

Хоть что с нимделай - все равно будет печатать в графическом режиме. Т.е. медленно и не в один проход. Вы же, думаю, хотите в текстовом, родными шрифтами принтера.

Посмотрите PReport, там это есть. (ручками - ф-ции, увы, не помню. есть желание - шлите мыло, отпишу краткий примерчик)


maddognt   (2004-11-28 11:20:00) [3]

font.size я менял, это не помогло.
А как поставить черновое качество?
В драйвере для lx 300 под winxp я нашел какие то дополнительные возможности печати и добился чтобы принтер печатал в один проход, а в драйвере под win98 ничего подобного нет. Сделал минимальное качество печати, но он все равно печатает в несколько проходов.


programania   (2004-11-27 23:17:00) [4]

Матричный принтер таким способом
печатает в графическом режиме т.е. по точкам, очень медленно
и за 1 проход, если у него хватит иголок на высоту шрифта,
а шрифт берется из printer.canvas.font и
выставлять что-то на принтере бесполезно,
можно попробовать уменьшить font.size или
поставить черновое качество.
Но быстрее всего печать будет, если писать
символы в LPT как в DOS.
Если NT,XP то смотрите http://www.specosoft.com


Наверх

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