Форум: "Основная";
Текущий архив: 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.039 c