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

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

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

0beron
новенький
Сообщения: 23
Зарегистрирован: 18.08.2012 19:32:10

Сообщение 0beron »

Что не так?
Печатает все одной строкой (конец текста)
Как сделать чтобы выводилось также как в 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
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

0beron, вручную отправлять построчно, проверяя на размер строки
0beron
новенький
Сообщения: 23
Зарегистрирован: 18.08.2012 19:32:10

Сообщение 0beron »

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

Что-то не въехал, я первый раз работаю с Printer, можно примерчик?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

0beron, на предыдущей странице в самом низу. Ну или распотрошить LazReport.
0beron
новенький
Сообщения: 23
Зарегистрирован: 18.08.2012 19:32:10

Сообщение 0beron »

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;
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Код: Выделить всё

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

ну и можно поиграть коэффициентами
Ответить