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

Вниз

Печать на принтер и превью в Win98 - какие-то странные глюки.   Найти похожие ветки 

 
romeo   (2003-11-30 17:38) [0]

В своей программе организовал печать и превью векторной графики. Пока занимался ею только на работе (под Win2000) - все было нормально. Решил на выходных дома ударно потрудиться. Дома - Win98SE. И тут началося...

Объясню подробнее что именно делаю:

W := GetDeviceCaps(Printer.Handle, HORZRES);
H := GetDeviceCaps(Printer.Handle, VERTRES);
CompDC := CreateCompatibleDC(Printer.Handle);
B_Handle := CreateCompatibleBitmap(Printer.Handle, W, H);
SelectObject(CompDC, B_Handle);

for Loop := 0 to Objects.Count - 1 do begin
if Objects[Loop].VisibleInRect(PrintableArea) and Objects[Loop].Layer.Visible and Objects[Loop].Layer.Printable
then Objects[Loop].Print(CompDC)
end;

Сами объекты рисуются вот таким макаром:

procedure TPolyLine.Print(hCanvas: hDC; Margins: TPoint; Scale: Real);
var
Loop: Integer;
Pen: hPen;
begin
Pen := CreatePen(PS_SOLID, 1, Color);
SelectObject(hCanvas, Pen);
MoveToEx(hCanvas, Margins.x + Round((Points[0].x - PrintableArea.Left)/Scale), Margins.y + Round((Points[0].y - PrintableArea.Top)/Scale), nil);
for Loop := 0 to FPoints.Count - 1 do begin
LineTo(hCanvas, Margins.x + Trunc((Points[Loop].x - PrintableArea.Left)/Scale), Margins.y + Trunc((Points[Loop].y - PrintableArea.Top)/Scale));
end;
DeleteObject(Pen);
end;

А затем этот CompDC рисую BitBlt-ом на Printer.Canvas.Handle или, если превью - то на PaintBox.Canvas.Handle.

Так вот, если объектов не очень много (сотни две -три) - все работает нормально, превью виден как надо. Если их количество переваливает за какое-то (так и не выяснил какое) значение - в превью рисуется девственно чистый листочек бумажки. А при fmPreview.Close выскакивает занятное сообщение на РУССКОМ языке: "Параметр задан неверно". Шрифт сообщения может изменяться от раза к разу. Если после этого не закрывать программу - то отмечаются странности в перерисовке компонентов на главной форме. Да, если программа была запущена из-под Delphi, то до сообщения дело не доходит - система просто зависает, спасает только кнопочка "Reset" ...

Стал копаться. Выяснил, что если всю уйму объектов рисовать одним и тем же Pen-ом, то все работает нормально, т.е.:

procedure TPolyLine.Print(hCanvas: hDC; Margins: TPoint; Scale: Real);
var
Loop: Integer;
Pen: hPen;
begin
//Pen := CreatePen(PS_SOLID, 1, Color);
//SelectObject(hCanvas, Pen);
MoveToEx(hCanvas, Margins.x + Round((Points[0].x - PrintableArea.Left)/Scale), Margins.y + Round((Points[0].y - PrintableArea.Top)/Scale), nil);
for Loop := 0 to FPoints.Count - 1 do begin
LineTo(hCanvas, Margins.x + Trunc((Points[Loop].x - PrintableArea.Left)/Scale), Margins.y + Trunc((Points[Loop].y - PrintableArea.Top)/Scale));
end;
// DeleteObject(Pen);
end;

Что за полтергейст, блин?!
Если кто знает в чем дело - помогите, а? Заранее спасиба...


 
nikkie   (2003-11-30 17:44) [1]

ресурсов не хватило :)
pen у тебя не удаляется.

DeleteObject
If the function succeeds, the return value is nonzero.
If the specified handle is not valid or is currently selected into a DC, the return value is zero.

надо делать так:
Pen := CreatePen(...);
OldPen := SelectObject(hCanvas, Pen);
...
SelectObject(hCanvas, OldPen);
DeleteObject(Pen);


 
romeo   (2003-11-30 17:59) [2]


> nikkie © (30.11.03 17:44) [1]


Круто! Respect, спасибо и все такое...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.008 c
3-36563
Dunmer1
2003-11-20 12:32
2003.12.12
Возможно ли создать базу без использования Database Desktop?


7-36860
StasVashuk
2003-10-06 16:40
2003.12.12
Вопрос о модулях.


1-36737
Dracula2000
2003-12-02 10:30
2003.12.12
Grid or DBGrid


1-36640
Viper-Omsk
2003-11-22 17:51
2003.12.12
Перемещение файла


1-36626
BDRON
2003-11-30 00:10
2003.12.12
Memo независимый от размера шрифта





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский