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

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

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

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

Сообщение bloodlines » 16.03.2010 17:56:58

Доброго времени суток. Собственно интересует вопрос. Как в лазарусе организовать печать в тестовом режиме? Просто на предприятии печатаются всякие документы и отчёты на матричном принтере, подключенном к компу через LPT. В принципе так же интересует вопрос - как распечатать txt файл не прибегая к помощи LazReport (и др. генераторов отчётов)? Можно ли средствами lazarus распечатать txt файл напрямую на матричный принтер?
Аватара пользователя
bloodlines
постоялец
 
Сообщения: 100
Зарегистрирован: 05.11.2008 11:26:19

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

Сообщение Mr.Smart » 16.03.2010 18:00:55

Открываете LPT порт как обычный файл и пишете в него данные.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение alaken » 29.03.2010 07:22:46

Mr.Smart писал(а):Открываете LPT порт как обычный файл и пишете в него данные.


можно небольшой крос-платформенный примерчик?
на delphi такое делал через winAPI...
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

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

Сообщение Timid » 29.03.2010 08:12:08

то есть как winapi?
Код: Выделить всё
var
  mylpt:TextFile;
begin
AssignFile(mylpt,'LPT');
writeln(mylpt,'hello');

уже не катит?

В Linux будет что-то вроде
Код: Выделить всё
AssignFile(mylpt,'/prn');

Смотря как принтер подмонтирован
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

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

Сообщение alaken » 29.03.2010 09:12:23

Timid писал(а):то есть как winapi?

это так
Код: Выделить всё
...
    if
      OpenPrinter
      (
        PWideChar(szPrinter),
        ph,
        Nil
      )
    then
    begin

      New(pdi);

      with pdi^ do
      begin
        pDocName := PWideChar(ExtractFileName(FFilePatch));
        pOutputFile := nil;
        pDatatype := PWideChar('RAW');
      end;

      PrJob := StartDocPrinter(ph, 1, pdi);

      StartPagePrinter(ph);

      WritePrinter(ph, Pointer(szValue), Length(szValue), pcWritten);

      EndPagePrinter(ph);
      EndDocPrinter(ph);
      ClosePrinter(ph);

      FreeMem(pdi);
    end;
и так далее...


Добавлено спустя 26 минут 18 секунд:
модуль Printers кросплатформенен?
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

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

Сообщение Mr.Smart » 29.03.2010 10:19:45

alaken
А зачем так извращаться? Если просто нужно вывести текс на принтер?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

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

Сообщение alaken » 29.03.2010 11:24:17

Mr.Smart писал(а):alaken
А зачем так извращаться? Если просто нужно вывести текс на принтер?


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

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

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

Сообщение v-t-l » 29.03.2010 11:53:01

alaken писал(а):если просто вывести файл на принтер нужно использовать более простой код
ага, что-то вроде
Код: Выделить всё
var FPRN:TextFile;

  function OpenLPT(PortN: Integer): Boolean;
  var
    prn: String;
  begin
    if PortN=0 then
  {$IFDEF WINDOWS}
      prn := 'PRN'
    else
      prn := 'LPT'+IntToStr(PortN)+':';
  {$ELSE}
    {$IFDEF UNIX}
      prn := '/dev/lp0'
    else
      prn := '/dev/lp'+IntToStr(PortN-1);
    {$ELSE}
      {$ERROR Unsupported OS}
    {$ENDIF}
  {$ENDIF}
    AssignFile(FPRN,prn);
  {$I-}
    Rewrite(FPRN);
  {$I+}
    Result := (IOResult = 0);
  end;

  procedure Print(s: String);
  begin
{    uses lconvencoding;}
    Write(FPRN, UTF8ToCP866(s));
  end;

  procedure PrintLn(s: String);
  begin
    Print(s + #13#10);
  end;

  procedure CloseLPT;
  begin
    CloseFile(FPRN);
  end;

begin
  if OpenLPT(1) then
  begin
    PrintLn('Проверка печати');
    PrintLn('---------------');
    CloseLPT;
  end;
end;
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение alaken » 29.03.2010 12:19:06

v-t-l
Спасибо за пример.
А как быть с стетевым матричным принтером?
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

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

Сообщение Timid » 29.03.2010 17:47:08

Боюсь что если он сетевой, хоть и матричный, то для вывода нужны драйвера.

Кстати, он должен как-то определяться в сети - подключен к удаленному компьютеру, или есть свой IP - подключен прямо в сеть?
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

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

Сообщение alaken » 30.03.2010 09:00:38

Принтер подключен к серверу (OS win2k), IP сервера известен, в клиентской системе (OS winXP) этот принтер установлен как сетевой, так как на сервере это разрешено.

На Delphi я просто открывал сетевой порт, и писал в него (пример я приводил в топике), все отлично работает. Хочу теперь перевести программу на Lazarus, пример от v-t-l приведенный выше не предназначен для данной задачи...
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

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

Сообщение v-t-l » 30.03.2010 10:12:43

alaken писал(а):пример от v-t-l приведенный выше не предназначен для данной задачи...

Ну почему же. Если выполнить на клиентской машине команду
Код: Выделить всё
net use LPT1: \\win2k\epson
, то даже устанавливать драйверы не понадобится. И пример будет работать :wink:
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение alaken » 30.03.2010 11:26:56

хм, но почему то не работает

Код: Выделить всё
   
    AssignFile(FPRN,prn);
    Rewrite(FPRN);
    Result := (IOResult = 0); всегда выдает false
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

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

Сообщение v-t-l » 30.03.2010 11:43:20

alaken писал(а):хм, но почему то не работает

Код: Выделить всё
   
    AssignFile(FPRN,prn);
    Rewrite(FPRN);
    Result := (IOResult = 0); всегда выдает false
Код: Выделить всё
{$I-} // а где это?
  Rewrite(FPRN);
{$I+} // и это?


Добавлено спустя 11 минут 34 секунды:
http://www.freepascal.org/docs-html/prog/progsu36.html
http://www.freepascal.org/docs-html/rtl/system/ioresult.html
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение alaken » 30.03.2010 11:55:54

в коде все есть я в посте убрал чтоб не громоздится

Добавлено спустя 28 минут 23 секунды:
забавно, IOResult равен 0 (по крайней мере так показывает ShowMessage(IntToStr(IOResult)))
но функция OpenLPT возвращает false
принудительная отправка на печать без проверки выдат File not open...

Код: Выделить всё
    OpenLPT(1)
    PrintLn('Проверка печати');
    PrintLn('---------------');
    CloseLPT;
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru