Проблема с принтер диалогом

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

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

Re: Проблема с принтер диалогом

Сообщение 0beron » 28.09.2016 13:47:57

Что не так?
Печатает все одной строкой (конец текста)
Как сделать чтобы выводилось также как в Memo ?

txtWork: TMemo

Код: Выделить всё
procedure TfrmMain.aPrintExecute(Sender: TObject)
var
  i: integer;
begin
  if PrintDialog.Execute then
  begin
    Printer.BeginDoc;
    for i := 0 to txtWork.Lines.Count - 1 do begin
      Printer.Canvas.TextOut(100,100, txtWork.Lines.Strings[i]);
    end;
    Printer.EndDoc;
  end;
end;


Lazarus 1.6; Linux Rosa; FPC 3.0
0beron
новенький
 
Сообщения: 23
Зарегистрирован: 18.08.2012 19:32:10

Re: Проблема с принтер диалогом

Сообщение Лекс Айрин » 28.09.2016 13:56:19

0beron, вручную отправлять построчно, проверяя на размер строки
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Проблема с принтер диалогом

Сообщение 0beron » 28.09.2016 18:58:52

0beron, вручную отправлять построчно, проверяя на размер строки

Что-то не въехал, я первый раз работаю с Printer, можно примерчик?
0beron
новенький
 
Сообщения: 23
Зарегистрирован: 18.08.2012 19:32:10

Re: Проблема с принтер диалогом

Сообщение Лекс Айрин » 28.09.2016 19:01:02

0beron, на предыдущей странице в самом низу. Ну или распотрошить LazReport.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Проблема с принтер диалогом

Сообщение 0beron » 28.09.2016 19:09:26

0beron, на предыдущей странице в самом низу

Не помогает...
Попробую поковырять LazReport

Добавлено спустя 16 часов 12 минут 48 секунд:
Короче фишка в том, что Printer.GetTextHeight возвращает
высоту в экранных пикселах, а TextOut нужны x, y в
точках на дюйм принтера. Не знаю это наверное костыль,
но вот так - работает (txtWork - TSynEdit):

Код: Выделить всё
procedure TfrmMain.aPrintExecute(Sender: TObject);
var
  i, x, y, h, p: integer;
begin
  if PrintDialog.Execute then
  begin
    with Printer do begin
      BeginDoc;
      p := trunc(YDPI / Screen.PixelsPerInch); //Отношение разрешений принтер-экран
      x := 10 * p; y := 10 * p; //Начальные координаты
      for i := 0 to txtWork.Lines.Count - 1 do begin
        h := Canvas.GetTextHeight(txtWork.Lines.Strings[i]) * p;
        if y >= PageHeight then begin
          y := 10 * p;
          NewPage;
        end
        else y := y + h;
        Canvas.TextOut(x, y, txtWork.Lines.Strings[i]);
      end;
      EndDoc;
    end ;
  end;
end;
0beron
новенький
 
Сообщения: 23
Зарегистрирован: 18.08.2012 19:32:10

Re: Проблема с принтер диалогом

Сообщение Лекс Айрин » 29.09.2016 11:37:47

Код: Выделить всё
dy:= printer.Canvas.TextHeight('1');// масштабирование
dx:= printer.Canvas.TextWidth('1')*6;
y:=3*dy;
....     

ну и можно поиграть коэффициентами
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru