Особености единиц измерения принтера в Лазарусе

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

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

Особености единиц измерения принтера в Лазарусе

Сообщение AMD » 23.02.2008 02:36:30

Открываю PageSetupDialog (PSD)
Выставляю левую границу 10мм

Печатаю текст выровнен примерно 30мм слева

Код: Выделить всё
procedure TForm1.PrintBClick(Sender: TObject);
var
i,j: integer;
begin
  j:=Memo1.Lines.Count;
  if PD.Execute then
  begin
  Printer.BeginDoc;
  Printer.Canvas.Font:=Memo1.Font;
  for i:=0 to j do
  begin
  Printer.Canvas.TextOut(PSD.Margins.Left, i*100, Memo1.Lines[i]);
  end;
  Printer.EndDoc;
  end;
end;         


Кто может обьяснить в чем секрет? Конечно я предполагаю что у нас разные единицы измерения получаются


Вопрос 2
Как определить высоту и ширину строки с определенным текстом в пикселях если мы знаем шрифт Memo1.Font?

Вопрос 3
Учитывая что разные принтеры имеют разные разрешения(300x300, 600x600, 1200x1200, 1440x720, 2880x720)
Притом некоторые разрешения еще и непропорциональные то как правильно подчитать размер всех обьектов что буду располагать на
Printer.Canvas?
Последний раз редактировалось AMD 23.02.2008 15:35:04, всего редактировалось 1 раз.
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Re: Особености единиц измерения принт диалогов

Сообщение AMD » 23.02.2008 13:14:50

Ответ на Вопрос 2

function TextWidth (const Text: string): Integer;

возвращает длину в пикселях текста Text, который предполагается написать на канве текущим шрифтом. Функция TextHeight:
function TextHeight(const Text: string): Integer;

возвращает высоту в пикселях текста Text. Применение методов TextWidth и TextHeight позволяет перед выводом текста на канву определить размер надписи и расположить ее и другие элементы изображения наилучшим образом.
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Re: Особености единиц измерения принт диалогов

Сообщение AMD » 23.02.2008 14:13:53

Коекакие размышления над Вопросом 3

Для тестирования печати использую pdf принтер
разрешения там можно выбирать разные:
600х600
300х300
150х150
и меньше...

Размер листа получается в пикселях -> чем больше разрешение тем больше размер в пикселях того же A4 листа

При разрешение 600х600 буквы распечатанные на листе примерно одинаковы как на экране но вот при разрешение 150х150 они в четыре раза больше.

Соотвественно буквы не масштабируются автоматом на листе - это уже проблема!!!

Насколько я знаю размер букв(шрифта) указывается в пиках
1 пика = 1/72 дюйма
А при разрешение 600х600 пикселей на дюйм буква при размере 10пик должна иметь высоту 83пикселя
при разрешение 300х300 42пикселя

Лазарус возвращает 92пикселя
Код: Выделить всё
fh:=Printer.Canvas.Font.GetTextHeight('a');


притом независимо от разрешения у него 92пикселя

Господа знатоки - проясните ситуацию, а то мы в замешательстве!!!
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение AMD » 23.02.2008 14:20:23

Кстати читая книги заметил такое

Не только многие компоненты, но и сами формы имеют метод Print, который печатает клиентскую область формы. При этом полоса заголовка формы и полоса главного меню не печатается. Таким образом, можно включить в приложение форму, в которой пользователь во время выполнения размещает необходимые для печати результаты. Если имя этой формы Form2, то ее печать может выполняться оператором

Form2.Print;



Чтото я этого не заметил в лазарусе
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение Attid » 23.02.2008 14:24:51

а пример отсюда не поможет ?
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение AMD » 23.02.2008 14:29:27

Attid писал(а):а пример отсюда не поможет ?


щас попробуем
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение Attid » 23.02.2008 14:31:18

или можно вот так

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  if PrintDialog1.Execute then
  begin
    Image1.Canvas.Font.Name:='Times New Roman';
    Image1.Canvas.TextOut(20,20,'Hello');
    Image1.Canvas.TextOut(20,20+Image1.Canvas.TextHeight('Hello'),'креведко');

    Printer.BeginDoc;
    Printer.Canvas.CopyRect(Bounds(0,0,Image1.Width * Printer.XDPI div 96,Image1.Height* Printer.XDPI div 96),Image1.Canvas,
                            Bounds(0,0,Image1.Width,Image1.Height));
    Printer.EndDoc;
  end;
end;


правда где взять програмно 96 не знаю =/
но умные люди говорят коэфициент можно получить еще так :
Код: Выделить всё
// берем ширину и высоту текста image

i := Image1.Canvas.TextWidth('привет');
i1 := Image1.Canvas.TextHeight('привет');

// берем ширину и высоту текста printer

j := Printer.Canvas.TextWidth('привет');
j2 := Printer.Canvas.TextHeight('привет');

// получаем коэффициент
kofX := j / i;
kofY := j2 / i1;
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение AMD » 23.02.2008 14:43:27

Я вот немогу понять по какой формуле Лазарус считает высоту буквы на Canvas если замена разрешения принтера - меняет размеры страницы в пикселях, а вот размеры букв нет, а ведь размеры страницы как и букв данны в тех же дюймах(пики) в итоге.
Размер в пикселях зависим от разрешения (пикселей на дюйм)- это истина и это мы видим на примере размера страницы в пикселях, но не видно на размере шрифта и его расположения
AMD
постоялец
 
Сообщения: 189
Зарегистрирован: 23.01.2008 22:25:25
Откуда: Кишинев

Сообщение Attid » 24.02.2008 00:59:27

ну как бы исходники есть, смотри =)
рабочих примера у тебя 2 уже есть.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Особености единиц измерения принтера в Лазарусе

Сообщение VAshot » 30.04.2008 11:20:23

Вот такая фиговина: печатает принтер нормально текст, масштабирует его сам, всё отлично, но если не переоткрывая программу сменить принтер (а на нем другое разрешение) или просто разрешение, то всё масштабируется (не само конечно), DPI нормальные, а текст печатает всё равно со старой высотой в пикселах, вот такая ерунда.

Надо как-то обнулить Printer (пересоздать его чтоли). Как это можно сделать по человечески?
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь

Re: Особености единиц измерения принтера в Лазарусе

Сообщение NOPIK » 01.05.2008 21:57:10

А почему делитель 96??? Экран не обязан быть 96DPI. К сожалению, Lazarus пока не умеет получать системное значение и всегда считает, что 96.
Это во-первых. А во-вторых, я обычно использую мм для бумаги (да и для экрана иногда приходится задавать реальное значение) - тогда нет проблем:
mmX:=printer.XDPI/25.4; mmY:=printer.YDPI/25.4;
NOPIK
незнакомец
 
Сообщения: 3
Зарегистрирован: 24.02.2008 09:29:08

Re: Особености единиц измерения принтера в Лазарусе

Сообщение VAshot » 03.05.2008 10:14:47

NOPIK писал(а):А почему делитель 96???

В исходниках паскаля указано 72, если туда смотрел я.
Аватара пользователя
VAshot
постоялец
 
Сообщения: 128
Зарегистрирован: 01.11.2007 12:31:21
Откуда: Пермь


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru