Форум: "KOL";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизПечать графики Найти похожие ветки
← →
Dimaxx © (2003-09-16 22:54) [0]Братва! У меня такая проблема:
В моей программе предусмотрена печать графической информации. Информация растягивается на весь лист. Я использовал модуль KOLPrinters. Прога, в принципе, готова. Опробовал печать на работе. Все работает. Сейчас поправил кое-что в коде (не печати) и снова пробую на работе. Не идет печать!!! У нас на работе два принтера на машине: HP DeskJet 1220C и Canon LBP-810. Описываю все по порядку...
1) Создаю PrintDalogvar PRN: PPrintDlg;
...
PRN:=NewPrintDialog(From.Handle,[pdCollate,pdPrintToFile,pdWarning,pdHelp]);
2) Далее в процедуре печати пишуif PRN.Execute then
begin
Printer^.Assign(PRN.Info);
W:=Printer^.PageWidth;
H:=Printer^.PageHeight;
DPIX:=GetDeviceCaps(Printer^.Canvas.Handle,LOGPIXELSX);
DPIY:=GetDeviceCaps(Printer^.Canvas.Handle,LOGPIXELSY);
...
Printer^.BeginDoc;
...
// Далее рисуем на канве принтера заготовку
...
// Здесь графически выводим текст через DrawText
...
// Здесь рисую значки из битмапов
...
Printer^.EndDoc;
end;
3) ГлушуPRN.Free;
Все! Вывожу под Вынь98 на печать свои художества.
ГЛЮК №1: При настройке параметров указываю ориентацию Ландшафт. Дебажу пошагово и получаю ВСЕГДА ширину меньше высоты (то есть ориентация всегда Портрет). Пробовал вручную задать после диалога Ландшафт - не помогает.
ГЛЮК №2: На HP печать не проходит (не появляется в трее значок диспетчера печати и нет превьюшного окна драйвера HP). На Canon посылаю - получаю ошибку в библиотеке драйвера. На третьей машине по ВыньМЕ с HP 1100 выдает ошибку в библиотеке драйвера HP...
Перезагружаюсь в ХРюшу и запускаю там - вываливается ошибка в GDI32.dll. Приехали! Че за ботва?! Лезу в код и начинаю отключать участки по порядку. Нашел-таки! Ошибку вызывает блок вывода текста графически. Без этого блока на HP все запускается, а на Canon все равно ошибка в его библиотеке. Но может и нормально напечататься. Но глюк №1 все равно остается!!!
Теперь смотрим блок печати текста (переменная С - масштабный коэффициент: 1,2,3 и т.д.):...
Printer^.Canvas.Font.FontName:="Arial Narrow";
Printer^.Canvas.Font.FontHeight:=26*С;
Printer^.Canvas.Font.FontStyle:=[fsBold];
Printer^.Canvas.Font.Color:=0;
Mode:=SetBkMode(Printer^.Canvas.Handle,TRANSPARENT);
for Y:=0 to 14 do
for X:=0 to 19 do
begin
S:=...;
R:=Bounds(X0+5*C,Y0+20*C,DX-10*C,2*Printer^.Canvas.TextHeight(S));
Printer^.Canvas.Brush.Color:=...;
Printer^.Canvas.DrawText(S,R,DT_CENTER+DT_TOP+DT_WORDBREAK);
end;
SetBkMode(Printer^.Canvas.Handle,Mode);
...
Может, я туфту написал, но ерунда - все ведь работало... И функция WriteLn из KOLPrinters работает нормально!!! Я в замешательстве!!! Все раньше работало!! У меня куча тестовых отпечатков с разными DPI и ориентациями на обоих принтерах!! Ради эксперимента попробовал на сетевой машине послать (опять на такой же Canon) и на одиночной под ВыньМЕ с HP LJ1100! Все то же самое!!! Не могут же три машины одинаково глючить. Причем печать из Ворда, Автокада и прочих приблуд нормально выводится!!
Пробовал по-другому. Создавал шрифт через NewFont и Assign"овал его на канву. Ноль эмоций!!!
В свете сказанного хотел бы спросить:
1) Как правильно реализовать независимость от DPI? На всех принтерах, которые мне доступны, DPI всегда равны (300х300 и 600х600). Через ф-цию GetDeviceCaps можно запросить ASPECTX и ASPECTY. Я не совсем понял для чего они служат - вроде бы эти самые масштабные коэффициенты. Если печать будет происходить, скажем, на фото-Epson с разрешением 5760х1440, то у меня получится лажа. То есть, если я выведу квадрат 100х100 точек, то на 300х300 dpi будет квадрат, 600х600 - тоже, а при 2400х1200 - вертикальный прямоугольник? Так не пойдет!
2) Может кто кинет в меня примерчик по моей проблеме?
PS: А может винду снести?
← →
Boguslaw (2003-09-16 23:14) [1]var PRN: PPrintDlg;
...
PRN:=NewPrintDialog(From.Handle,[pdCollate,pdPrintToFile,pdWarning,pdHelp]);
Do You mean :
PRN := NewPrintDialog(Form,[pdCollate,pdPRintToFile,pdWarning,pdHelp]);
Anyway give full example of what You are doing between Begin and EndDoc.
← →
Boguslaw (2003-09-16 23:32) [2]Well, I tested with some printer drivers (not printers becouse I don"t have it) and seems that some DPI is capable to be selected but others not (for HP PCL 5L 300 and 600 DPI can be selected but 75 DPI not) Maybe a printer driver behaviour ? The same is for Portrait /Landscape :
Portrait : W= 2329, H= 3241
Landscape = W = 3236 H = 2329 , so Portrait is higher then should be ??? Possibly a bug in KOLPrinterDialogs package but I"m not sure. Some docs said about non-printable area excluded from printing by drivers.
← →
SPeller © (2003-09-17 08:15) [3]Если проблемы в выводом текста не исчезли, то попробуй убрать вызовы TextHeight и TextWidth (всё что вызывает TextExtent) в канве. Попробуй вместо этого подставить константные значения. Дело в том, что в нутри TextExtent может происходить избавление от хендла контекста, используемого данным объектом канвы. Проверь значение хендла после вызова TextHeight или подобных, и если оно равно нулю - то это баг. Я Кладову уже писал об этом. Там изменения какие-то для закрытия утечек были сделаны, но не Владимиром, а Герасимовым. Надо ему по голове настучать за такие заплатки :) Шутка :). Я спасся на время комментированием в коде TextExtent строки
If Not fIsPaintDC then ClearHandle := True;
но Кладов на это сказал "fIsPaintDC кстати нельзя трогать". Поэтому пока жду его реакции на происходящее.
← →
Gandalf © (2003-09-17 20:12) [4]Можешь попробовать альтернатив MHPrinters - он колный конверт VCL аналога - если там код пахал, будет и сдесь - причем один в один.
← →
Dimaxx © (2003-09-17 21:23) [5]Вот текст процедуры печати - нет возможности разместить полностью, поэтому в архиве.
http://dimaxx.nightmail.ru/print.zip
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.047 c