Проблемы с печатью в Delphi
TChart (первоначально на форме)на основании введенных пользователем данных,
после этого пользователь может распечатать на принтере результаты:
сначала идет некоторый текст, затем диаграмма и затем снова некоторый текст.
Я пробовал программу на целом наборе принтеров в разных местах (всюду под Win98)
и полученные результаты сильно различались: на матричных и струйных принтерах
все работает как задумано, а вот на лазерных - большие странности:
на старом HP Laserjet II все работает, на HP 1200 при попытке печати -
"недопустимая операция", на некоторых других (тоже HP) текст печатается нормально,
графические примитивы рисуются нормально, а вот битмэп, в который я копирую
диаграмму - не печатается. (Должен заметить, что попытки печати "напрямую" -
с помощью методов самого компонента TChart - привели к неудовлетворительным
результатам). Не могли бы ли Вы что-нибудь посоветовать в такой ситуации?
В общих чертах процедура печати выглядит следующим образом:
procedure TForm1.BtnPrintClick(Sender: TObject);
var
bm :tbitmap;
r :trect;
s :string;
PX,PY,
y,x,j : Integer;
y1 :integer;
begin
// Рисование диагр. на "виртуальной" канве
with chart1 do
begin
bm:=tbitmap.create;
bm.width:=chart1.width;
bm.height:=chart1.height;
PrintPartialCanvas(bm.Canvas, Rect(0,0,chart1.width,chart1.height));
end;
with printer, printer.canvas do
begin
orientation:=poPortrait;
pen.style:=styles[1];
begindoc;
//Прямоугольник по периметру страницы
with r do
begin
left:=round(0.1*Printer.PageWidth);
right:=round(0.9*Printer.PageWidth);
top:=round(0.1*Printer.Pageheight);
bottom:=round(0.9*Printer.Pageheight);
end;
pen.width:=1;
Rectangle(r);
{
Вывод на печать нескольких строк текста с помощью процедуры
textout(x,y,'Некоторый текст');
}
//ОПРЕДЕЛЕНИЕ ПРЯМОУГОЛЬНИКЯ ДЛЯ ПЕЧАТИ ДИАГРАММЫ С СОБЛЮДЕНИЕМ ПРОПОРЦИЙ ДИАГРАММЫ
x:=round(0.15*Printer.PageWidth);
R.Left:=x;
R.Right:=Printer.PageWidth-x;
y:=y+120;
R.Top:=y;
R.Bottom:=y+(r.right-r.left)*chart1.Height div chart1.Width*
GetDeviceCaps(Printer.Handle,LOGPIXELSY) div
GetDeviceCaps(Printer.Handle,LOGPIXELSX);
//ВЫВОД ДИАГРАММЫ НА БУМУГУ
StretchDraw(r,bm);
//ПЕЧАТЬ РАМКИ ВОКРУГ ДИАГРАММЫ
polyline([point(r.left,r.top),point(r.right,r.top),
point(r.right,r.bottom),point(r.left,r.bottom),point(r.left,r.top)]);
{
СНОВА вывод на печать нескольких строк текста с помощью процедуры
textout(x,y,'Некоторый текст');
}
enddoc;
end;
bm.free;
end;