Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Как напечатать текст на бумаге в определенных координатах?   Найти похожие ветки 

 
Relaxxx   (2004-06-23 10:39) [0]

Здрастуйте!
Как напечатать текст на бумаге в определенных координатах?


 
Тимохов ©   (2004-06-23 10:45) [1]

один из вариантов:

1. взять dpi принтера (функция GetDeviceCaps)
2. узнать сколько в дюйме милиметров
3. узанть координаты в милиметрах
4. пересчитать одно в другое (элементарная математика), т.е. получить координаты в точках
5. напечатать через printer.canvas


 
Relaxxx   (2004-06-23 17:17) [2]

Вот какая проблема, сделал я функции для перещета пикселей принтера в милиметры, но когда я выставил координаты 0,0 то всеравно эсть отступ справа 5мм и сверху 10мм, это нормально, и у каждого принтера это растояние разное, а нельзя ли как-то считать с самого начала листа и неучитывать какой захват у принтера???


 
DimKa ©   (2004-06-23 17:28) [3]

Лови фишку:

with printer do begin
   {Величины представлены в пикселах}
   ScaleHor    := GetDeviceCaps (Handle, LogPixelsX);      // Разрешение принтера по горизонтали
   ScaleVert   := GetDeviceCaps (Handle, LogPixelsY);      // Разрешение принтера по вертикали
   SheetWidth  := GetDeviceCaps (Handle, PhysicalWidth);   // Ширина листа
   SheetHeight := GetDeviceCaps (Handle, PhysicalHeight);  // Выcота листа
   OffLeft     := GetDeviceCaps (Handle, PhysicalOffSetX); // Непечатаемая область слева
   OffTop      := GetDeviceCaps (Handle, PhysicalOffSetY); // Непечатаемая область сверху
   OffRight    := SheetWidth - PageWidth - OffLeft;        // Непечатаемая область справа
   OffBottom   := SheetHeight - PageHeight - OffTop;       // Непечатаемая область снизу
   PrMmHor     := ScaleHor  / Inch;                        // Число пикселов в миллиметре по горизонтали
   PrMmVert    := ScaleVert / Inch;                        // Число пикселов в миллиметре по вертикали
   {Величины представлены в миллиметрах}
   ListWidthMm   := (PageWidth/ScaleHor)*Inch;             // Ширина рабочей области листа
   ListHeightMm  := (PageHeight/ScaleVert)*Inch;           // Высота рабочей области листа
   SheetWidthMm:= round((SheetWidth/ScaleHor)*Inch);       // Ширина листа
   SheetHeightMm:= round((SheetHeight/ScaleVert)*Inch);    // Выcота листа
 end;


 
DimKa ©   (2004-06-23 17:30) [4]

Последние величины в миллиметрах лишние, но может наведут на какие-то мысли


 
Relaxxx   (2004-06-23 18:50) [5]

Все равно милемитра 2-3 расхождения, а надо чтобы небыло!!!

Вот я приведу функции как я это делаю, а вы подскажите что нетак:

//Инициализация
Procedure TMainForm.GetPrinterInfo;
begin
 PixelsX:=GetDeviceCaps(printer.Handle,LogPixelsX);
 PixelsY:=GetDeviceCaps(printer.Handle,LogPixelsY);
 OffLeft:=GetDeviceCaps(printer.Handle, PhysicalOffSetX);
 OffTop:=GetDeviceCaps(printer.Handle, PhysicalOffSetY);
end;

//Пересчет в мм Х
function TMainForm.PrinterCoordX(x:integer):integer;
begin
PrinterCoordX:=round(PixelsX/25.4*x)-OffLeft;
end;

//Пересчет в мм Y
function TMainForm.PrinterCoordY(Y:integer):integer;
begin
PrinterCoordY:=round(PixelsY/25.4*Y)-OffTop;
end;

//Ну и сама печать
GetPrinterInfo;
 with Printer do
   begin
     BeginDoc;
     Canvas.TextOut(PrinterCoordX(100), PrinterCoordY(100), "Эывпаыврпавр");
     EndDoc;
   end;

Как сделать чтобы ошибкак была кааааак мооожно меньше


 
Relaxxx   (2004-06-24 11:02) [6]

так что никто неможет посоветовать, вообще возможно чтобы печатать с точностью до милиметра на любом принтере(это нужно для того чтобы можно было печатать на бланке)


 
Reindeer Moss Eater ©   (2004-06-24 11:04) [7]

Советую взять что-то навроде QR и не мучаться.


 
Тимохов ©   (2004-06-24 11:09) [8]


> Relaxxx   (24.06.04 11:02) [6]

можно, нужно только поля учитывать.

мы мечатаем платежные поручения. Там требования строгие.
проблем пока не было.


 
Reindeer Moss Eater ©   (2004-06-24 11:12) [9]

Когда-то давно была написана задача по заполнению бланков приложения к диплому. Использовался QR. Погрешность "попадания" не превышала полумиллиметра.


 
Relaxxx   (2004-06-24 11:54) [10]

Что за QR, QuickReport?? и как с помощью него печатать может кто статью подскажет по схожей тематике или может кто-то решал подобную задачу?


 
Amoeba ©   (2004-06-24 12:55) [11]


> Что за QR, QuickReport??

Он входит в чсло библиотек поставляемых с Delphi.


 
Reindeer Moss Eater ©   (2004-06-24 13:04) [12]

или может кто-то решал подобную задачу?

пост № 9 читал вообще?


 
Relaxxx   (2004-06-24 14:13) [13]

Прочитал, а Вы можете поделится опытом как у Вас так получилось, я вот только что сделал с помощью QR, очень даже похоже, никакого гимороя с переводом в милиметры и пересчета дпи, но всеравно, я делал на 3 принтерах, на всех отступ слева совпал, тут вообще все классно, а вот отступ серху, на одном принтере совпал, а на 2 других был 2мм, да кстати верхний отступ я расчитывал так, QRLabel1.Size.Top:=QRLabel1.Size.Top-QRLabel1.Size.Height;
Но все равно, погрешность есть на некоторых принтерах, может скажите как ее обойти если это возможно, что вообще посоветуете, расскажите как делали Вы?


 
Reindeer Moss Eater ©   (2004-06-24 14:17) [14]

Для этого в программе реализуется две настройки
"Поправка слева"
"Поправка сверху"
Перед печатью отчета значения настроек складываются с координатами left и top у банда.


 
Тимохов ©   (2004-06-24 14:18) [15]


> Relaxxx   (24.06.04 14:13) [13]

от себя.

что тут думать - выше вам приводили, как определить непечатуемую область сверху и слева. используейте ее при рассчетах.

ЗЫ. 100 точно у вас все равно не выйдет - бумага +-мм всегда лежит не ровно...


 
simserg   (2004-06-24 15:01) [16]

Доброе время суток!
У меня такой вопрос:
есть база данных, на этой базе в Crystal Reports сделан отчет -
КАК этот отчет вызвать в Дельфийском приложении (Delphi 7)???
Заранее благодарен.


 
Тимохов ©   (2004-06-24 15:03) [17]


> simserg   (24.06.04 15:01) [16]

новый вопрос - новый топик.
что за старться влезать в чужие вопросы?


 
Romkin ©   (2004-06-24 15:04) [18]

У каждого принтера есть погрешность протаскивания бумаги. Обычно 1-2 мм, зависит от модели. Просто распечатай несколько листов или на одном листе несколько раз, и посмотри



Страницы: 1 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.052 c
14-1087955709
Думкин
2004-06-23 05:55
2004.07.11
С днем рождения! 23 июня


1-1088073690
Peter
2004-06-24 14:41
2004.07.11
Много кнопок...


3-1087281540
AlexXn
2004-06-15 10:39
2004.07.11
Картинки в БД


1-1088545291
001
2004-06-30 01:41
2004.07.11
Как получить код символа в строчке?


4-1085668419
Aleksandr.
2004-05-27 18:33
2004.07.11
Какое сообщение получает окно, когда его активируют через панель?