Доброго времени суток.
Я тут уже ранее задавал вопросы про печать графика, который в TChart сделан. Дело тогда свелось к попытке его распечатать через quick report и я интересовался, как получить от принтера размер бумаги в мм. После многочисленных проб, набролось некторое количество разных вопросов и странностей, о которых хотелось бы спросить корефеев или тех, кто сталкивался с подобным. Итак:
1). по поводу quick report. Мне советовали обратить внимание на функции API GetDeviceCaps и DeviceCapabilities. Я попробовал. Обе функции не выдают результата. DeviceCapabilities либо сваливается по эксепшену в winspool.drv, либо возвращает (-1), то бишь облом. Код такой к примеру (C++ Builder):
char *dev;
char *prt;
int a=DeviceCapabilities (dev,prt,DC_PAPERS,NULL,NULL);
ShowMessage(a);
Мне советовали через GetDeviceCaps c помощью
float ppcmy=GetDeviceCaps(Printer()->Handle,LOGPIXELSY)/2.54;
float ppcmx=GetDeviceCaps(Printer()->Handle,LOGPIXELSX)/2.54;
ShowMessage (Printer()->PageWidth/ppcmy);
ShowMessage (Printer()->PageHeight/ppcmx);
код срабатывает, но результат не похож на А4. Более того, если сменить ориентацию на альбомную, размер бумаги не совпадает с книжной ориентацией...
Вот в чем тут могет быть дело??? Подозреваю, что то, что дальше — другая сторона того же глюка.
2). Сделал по другому. Остановился на варианте c PrintPartialCanvas на полученый канвас принтера. Здесь работает хоть иногда. Но при выборе принтера (PriterSetupDialog или PrintDialog)нормально выбираются только некоторые принтеры. При выборе некоторых (в сети) происходит ужасный эксепшн. Сначала программа высыпается в asm'овский отладчик билдера, после пинка F9 выдает еще 0х00000008 экспешн уже в рантайме. И так 2 раза. после чего выбранный принтер нормально отпечатывает график, который его просили..... Методом тыка было выяснено, что вылет в отладчик вызывает именно окно диалога выбора принтера, а 8-ой эксепшн — Printer->EndDoc(). Уточнение с предположением. Большинство компов — старые, там виды 98. Принтеры везде весят расшареные в сеть на них. Мой комп более менее приличный с XP SP1 на борту. Но все приложения печатают через них нормально..... Но мож дело в этом?
Еще в эту же корзину. Если принтер по умолчанию не доступен, диалог выбора принтера не вызывается вовсе....

Но блин, а это-то почему??? А сменить как???
Опять же туда же... Я уже ранее говорил в предыдущем посте, что вызов Printer()->GetPrinter приводит к тому, что вместо имени принтера возвращается сетевой путь до него! И еще. В qucik reporte есть свойство QRPrinter. При попытке обратиться к любому свойству этого объекта все вылетает по эксепшену.
Вобщем-то проблема, описаная в этом пункте — главная. Подскажите, пожалуйста, что можно сделать!!!!!
Далее вопросы другого характера.
3). Как бы реализовать монохромную печать? То есть графики с цветами, а на черно-белой лазерке выходит плохо.... Соответсвующее свойство выдает нечто ужасное на экране и не влияет на принтер почему-то никак......
4). На некоторых принтерах не пропечатывается сетка. А нужна. Хотел увеличить толщину линий, и, с удивлением для себя, обнаружил, что всякие dash'овские стили пера не поддерживаются для толщины, большей 1.... Что посоветуете?
5). Если отключить видимость легенды, то подпись по оси X самой правой точки графика обрезается на канвасе TChart'а. Как такого избежать?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, woland255, Вы писали:
А>На всё не отвечу, расскажу как делаю сам. Пользую FastReport. Там есть компонент для печати графиков, исходники доступны. Весь смысл в создание EMF/WMF образа с поcледующей отрисовкой на канве принтера. То есть не сложнее вставить картинку в этот самый отчет. Функция Tchart для создания WMF -> TeeCreateMetafile.
А>Насчёт монохромности. Это беда. В самом TChart есть свойство для этих целей но лучше не пользовать. Руками в рантайме сохраняю все цвета, от легенд, серий и тд перевожу в b/w, после забора рисунка для печати восстанавливаю исходные.
Да, кстати, как сделать цвет чернобелым (Photoshop algorithm, уйму времени убил пока нашел...):
function Clamp (X: Double): Byte;
begin
if X < 0 then
Result := 0
else
if X + 0.1 >= 255 then
Result := 255
else
Result := Trunc (X);
end;
function GrayScaleColor(Color: TColor): TColor;
const
cntGamma = 2.243;
var
aRGB : Integer;
aRGBQuad : TRGBQuad absolute aRGB;
aValue : Extended;
aComponent : Byte;
begin
aRGB := ColorToRGB(Color);
with aRGBQuad do
aValue :=
0.213 * Power (rgbRed, cntGamma) +
0.715 * Power (rgbGreen, cntGamma) +
0.0724 * Power (rgbBlue, cntGamma);
aValue := Power (aValue, 1 / cntGamma);
aComponent := Clamp (aValue);
Result := RGB (aComponent, aComponent, aComponent);
end;
Здравствуйте, woland255, Вы писали:
Я печатал в Delphi с помощью функции ChartPreview из модуля TeePrevi.
Не знаю правда как в билдере. Думаю там тоже есть такое.
Правда в Delphi он тока в виде DCU.
Может поможет...
Удачи.