печать в тесктовом режиме.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: печать в тесктовом режиме.

Сообщение v-t-l » 30.03.2010 13:13:35

А чему равна переменная prn при вызове AssignFile()?

Добавлено спустя 2 часа 9 минут 39 секунд:
Более современный вариант:
Код: Выделить всё
uses lconvencoding, Printers, OSPrinters;
...
var
  written: Integer;

  procedure Print(s: String);
  begin
    s := UTF8ToCP866(s);
    Printer.Write(s,Length(s),written); \\здесь ошибка - см. пост ниже.
  end;

begin
  if not PrintDialog1.Execute then Exit;
  Printer.RawMode:=True;
  Printer.BeginDoc;
  Print(Memo1.Text);
  Printer.EndDoc;
end;

и надо пропатчить в \lazarus\components\printers\win32\winprinters.inc
Код: Выделить всё
function TWinPrinter.Write(const Buffer; Count: Integer;
  var Written: Integer): Boolean;
begin
  CheckRawMode(True);
//  result := WritePrinter(FPrinterHandle,@Buffer, Count, pdword(@Written));
  result := WritePrinter(FPrinterHandle, Pointer(Buffer), Count, pdword(@Written)); - мой баг - не надо патчить!
end;
и перекомпилировать пакет Printer4Lazarus.
Последний раз редактировалось v-t-l 30.03.2010 18:02:35, всего редактировалось 2 раз(а).
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: печать в тесктовом режиме.

Сообщение alaken » 30.03.2010 15:42:44

v-t-l писал(а):А чему равна переменная prn при вызове AssignFile()?

prn='LPT1:'
сетевой принтер именно с LPT1 ассоциирован

v-t-l писал(а):не работает по крайней мере с FPC 2.4.0

у меня FPC 2.4.1 буду пробовать оба варианта

Добавлено спустя 33 минуты 37 секунд:
вот результат тестирования кода
Код: Выделить всё
uses lconvencoding, Printers, OSPrinters;
...
var
  written: Integer;

  procedure Print(s: String);
  begin
    s := UTF8ToCP866(s);
    Printer.Write(s,Length(s),written);
  end;

begin
  if not PrintDialog1.Execute then Exit;
  Printer.RawMode:=True;
  Printer.BeginDoc;
  Print(Memo1.Text);
  Printer.EndDoc;
end;


содержание Memo1.Text напечаталось, но перед ним половина строки кракозябров...
хотя после нескольких тестов кракозябры больше не появились это скорее всего от прошлых неудачных попыток мусор в порту остался...

думаю этот код самый правильный, только сомневаюсь на счет подключенного модуля OSPrinters, у меня без него все нормально работает.

еще один момент, у меня 2 принтера сетевых, и оба на LPT1 настроены, второй перенастроил на LPT2, буду пробовать тестировать...
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: печать в тесктовом режиме.

Сообщение v-t-l » 30.03.2010 17:35:32

v-t-l писал(а):и надо пропатчить в \lazarus\components\printers\win32\winprinters.inc

Извиняюсь, погорячился, баг у меня самого :oops: !
Код: Выделить всё
  procedure Print(s: String);
  begin
    if Length(s)=0 then Exit;
    s := UTF8ToCP866(s);
    Printer.Write(s[1],Length(s),written); //здесь накосячил - передавал s вместо s[1] - вот принтер и печатал бред
  end;
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: печать в тесктовом режиме.

Сообщение alaken » 31.03.2010 08:09:42

спасибо за уточнение.

Код работает и печатает как надо, теперь для корректного отображения в диспетчере заданий принтера
устанавливал параметр Printer.FileName и тогда печать не производилась. Думаю что нужно использовать какую-то кодировку.
И параметр Printer.Copies тоже никак не отображается в диспетчере заданий принтера.
Или я не так использую эти параметры?
Код: Выделить всё
  Printer.Copies := SECopyCount.Value;
  Printer.FileName := ChLBoxFiles.Items[idx];   


Добавлено спустя 27 минут 21 секунду:
всетаки Printer.FileName я использовал не по назначению
решение для винды
Код: Выделить всё
  Printer.Title := UTF8ToCP1251(ChLBoxFiles.Items[idx]);

хочу чтобы было кросплатформенно, какую кодировку нужно для Linux?

Добавлено спустя 11 минут 28 секунд:
сделал пока так:
Код: Выделить всё
  {$IFDEF WINDOWS}
    Printer.Title := UTF8ToCP1251(ChLBoxFiles.Items[idx]);
  {$ELSE}
    Printer.Title := ChLBoxFiles.Items[idx];
  {$ENDIF}


посмотрел исходники модуля Printer, помоему параметр Printer.Copies никак не относится к печати в режиме Printer.RawMode=True.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: печать в тесктовом режиме.

Сообщение v-t-l » 31.03.2010 09:56:14

alaken писал(а):хочу чтобы было кросплатформенно, какую кодировку нужно для Linux?

Utf8ToSys() - преобразует в системную кодировку (кроссплатформенно).
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: печать в тесктовом режиме.

Сообщение alaken » 31.03.2010 10:47:56

Спасибо, учту.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: печать в тесктовом режиме.

Сообщение Timid » 31.03.2010 22:27:31

На самом деле, драйвера не управляют выводом текстового потока. Поэтому кодировка определяется исключительно кодовой таблицей загруженного шрифта. Найдите справочник по управляющим кодам Epson. Вполне возможно, что вначале принтер включается с кодировкой DOS (866).
Вам нужно внимательно изучить раздел про ESC-последовательности #27что-то там...
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: печать в тесктовом режиме.

Сообщение VirtUX » 24.05.2011 18:08:47

Пытаюсь печатать на виртуальный принтер Bullzip PDF Printer. Но выскакивает ошибка: "Printer is in Raw Mode". Что бы это значило и как это побороть?
Мой пример:
Код: Выделить всё
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  i: integer;
  s: string;
begin
  IF PrintDialog1.Execute then begin
    Printer.RawMode:=false;
    Printer.BeginDoc;

      s := UTF8ToSys(CheckListBox1.Items.Text);
      Printer.Write(s, Length(s), i);
    Printer.EndDoc;
  end;
end;


Добавлено спустя 4 минуты 26 секунд:
Хм... Переделал так:
Код: Выделить всё
...
IF PrintDialog1.Execute then begin
    Printer.RawMode:=true;
    Printer.BeginDoc;
...

Ошибка исчезла. Но появилась другая. Ругается Ghostscript.
Может какой другой виртуальный принтер есть, чтоб не ругался на старт Ghostscript?

Добавлено спустя 9 минут 55 секунд:
попробовал другой doPDF v7. Не ругается, а просто повисает задание в очереди.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: печать в тесктовом режиме.

Сообщение v-t-l » 25.05.2011 11:40:19

В RawMode данные пихаются в принтер напрямую без обработки драйвером, то есть принтер должен сам уметь печатать плоский текст.
PDF - это уже графика, поэтому текст в "сыром" виде в него наврядли удастся вывести. Тут уже надо что-то типа lazreport, или самому рисовать текст на канве принтера.
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: печать в тесктовом режиме.

Сообщение VirtUX » 25.05.2011 16:08:51

Облазил кучу сайтов, но не могу найти где скачать этот LazReport. Проект еще жив? На офсайте тока документация на FastReport.
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: печать в тесктовом режиме.

Сообщение Mr.Smart » 25.05.2011 16:16:10

он лежит в каталоге components в стандартной поставке lazarus.
или можно отсюда http://lazreport.sourceforge.net/
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

Рейтинг@Mail.ru