Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2016, 16:36   #1
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию как перевести пиксели в миллиметры Delphi для печати на принтере

написал функцию для печати StringGrid хотелось бы отступы сделать чтоб указывались в миллиметрах а не в пикселях
Код:
procedure SGridPrint (sTitle:string;SGrid:TStringGrid; MargTop,MargLeft:integer)  ;
var
    x,y,x1,y1,
    j,i:integer;
begin
 Printer.Title := sTitle;
 Printer.BeginDoc;
 Printer.Canvas.Pen.Color  := 0;
 Printer.Canvas.Font := SGrid.Font;
 Printer.Canvas.TextOut(0, 100, Printer.Title);
 for i:=0 to SGrid.ColCount-1 do
 for j:=0 to SGrid.RowCount-1 do
   Begin
    x:=(SGrid.ColWidths[0]+i)*i;
    y:=(SGrid.RowHeights[0]+1)*j;
    x1:=(SGrid.ColWidths[0]+i)*(i+1);
    y1:=(SGrid.RowHeights[0]+1)*(j+1);
    x:=x+MargTop;
    x1:=x1+MargTop;
    y:=y+MargLeft;
    y1:=y1+MargLeft;
    Printer.Canvas.TextRect(rect(x,y,x1,y1),x,y,SGrid.Cells[i,j]);
   end;
 Printer.EndDoc;
end;
Нужно чтобы значение в миллиметрах было для текущего принтера

П.С, проверил это дело оно оказывается еще и не работает(принтер на печать пустой лист отправляет)
до этого на канве, просто вывод проверял, принтера не было под рукой.
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 10.05.2016 в 16:49.
Dvoishnik вне форума Ответить с цитированием
Старый 10.05.2016, 16:55   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Знаешь сколько пикселей на дюйм у принтера? В дюйме ~ 2,54 см
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.05.2016, 17:02   #3
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Знаешь сколько пикселей на дюйм у принтера?
это можно как ни будь программно узнать??
не могу понять почему у меня это дело на канве отрисовывается нормально а на печать не идет.
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 10.05.2016 в 17:14.
Dvoishnik вне форума Ответить с цитированием
Старый 10.05.2016, 17:12   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

в интернетах пишут
Код:
GetDeviceCaps(Printer.Handle, LOGPIXELSY);
например, Get the default printers resolution
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.05.2016, 17:24   #5
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Т.Е. пикселей в миллиметре для текущего принтера
Код:
Function MMPX():integer;
Begin
MMPX:=round( GetDeviceCaps(Printer.Handle, LOGPIXELSY)*2.54/10 );
end ;
152px в 1 мм реальная цифра для принтера??

Цитата:
Сообщение от Dvoishnik Посмотреть сообщение
не могу понять почему у меня это дело на канве отрисовывается нормально а на печать не идет.
не подскажете?

П.С. принтер печатает пустой лист

добавил множитель 5 начал печататься число взял от балды и этим еще больше запутался.
как правильно зная рассчитать этот множитель ?
вообще ума не прилажу.
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 10.05.2016 в 17:47.
Dvoishnik вне форума Ответить с цитированием
Старый 10.05.2016, 18:14   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

dpi/25.4 = пикселей на мм
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.05.2016, 18:41   #7
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Аватар,Serge_Bliznykov, спасибо вам большое
вот что у меня получилось
Код:
Function MMPX():integer;
Begin
MMPX:=round( GetDeviceCaps(Printer.Handle, LOGPIXELSY)/25.4 );
end ;

procedure SGridPrint (sTitle:string;SGrid:TStringGrid; MargTop,MargLeft:integer)  ;
var
    x,y,x1,y1,
    MMPXWork,j,i:integer;
begin
 Printer.Title := sTitle;
 Printer.BeginDoc;
 Printer.Canvas.Pen.Color  := 0;
 Printer.Canvas.Font := SGrid.Font;
 Printer.Canvas.TextOut(0,0, sTitle);
 MMPXWork:=MMPX;
 for i:=0 to SGrid.ColCount-1 do
 for j:=0 to SGrid.RowCount-1 do
   Begin
    x:=((SGrid.ColWidths[0]+i)*i)* Trunc(MMPXWork/3);
    y:=((SGrid.RowHeights[0]+1)*j)* Trunc(MMPXWork/2);
    x1:=((SGrid.ColWidths[0]+i)*(i+1))* Trunc(MMPXWork/3);
    y1:=((SGrid.RowHeights[0]+1)*(j+1))* Trunc(MMPXWork/2);
    x:=x+MargTop* MMPXWork;
    x1:=x1+MargTop* MMPXWork;
    y:=y+MargLeft* MMPXWork;
    y1:=y1+MargLeft* MMPXWork;
    Printer.Canvas.TextRect(rect(x,y,x1,y1),x,y,SGrid.Cells[i,j]);
   end;
 Printer.EndDoc;
end;
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 10.05.2016 в 19:11. Причина: исправил согласно замечанию Аватар
Dvoishnik вне форума Ответить с цитированием
Старый 10.05.2016, 18:49   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Зачем MMPX в цикле вычислять? Один раз достаточно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.05.2016, 18:51   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,656
По умолчанию

не трать зря бумагу и тонер - установи виртуальный принтер.

34.jpg

а ещё есть хитрые компоненты, которые всё сами сделают. Например, вот такой.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 10.05.2016, 18:56   #10
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
не трать зря бумагу и тонер - установи виртуальный принтер.
чет не подумал


Цитата:
Сообщение от min@y™ Посмотреть сообщение
а ещё есть хитрые компоненты
пока учусь обходиться стандартными средствами, компоненты потом

Аватар, исправил в посте #7
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 11.05.2016 в 15:26.
Dvoishnik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать на принтере USB MPRINT R58 с помощью ESC/POS в Delphi. bobinventor Помощь студентам 2 17.12.2013 17:29
с++ как распечатать данные на принтере ? proef Помощь студентам 4 21.10.2013 20:58
Программа для печати плакатов, работа с графикой и печатью (Delphi) Alex1212 Помощь студентам 1 04.08.2012 12:45
Как в Bitmap редактировать пиксели Yungo161 Мультимедиа в Delphi 16 01.02.2012 18:12
отмена печати на принтере в Delphi Юliana Общие вопросы Delphi 2 29.01.2008 19:51