Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.031 c
8-1082626570
Sergey__
2004-04-22 13:36
2004.07.11
Как сделать чтобы текст плавно передвигался по форме


3-1087455401
vic1
2004-06-17 10:56
2004.07.11
Автосумма


1-1088512200
Ben
2004-06-29 16:30
2004.07.11
Работа с текстом в Richedit е


1-1088584282
Николай
2004-06-30 12:31
2004.07.11
Очень простой вопрос: подскажите код символа конца файла


1-1088444654
Петр
2004-06-28 21:44
2004.07.11
86400 отсчетов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский