Вниз
Скачать: CL | DM;

проблема с KOLPrinters   Найти похожие ветки 

← →
vampir_infernal   (2007-01-14 22:34) [0]

Здравствуйте, уважаемые.
Матчасть: Delphi2005+upd3, WinXPSP2, KOL2.50
Не знаю, только у меня такая проблема или раньше встречалась, но в при использовании модуля KOLPrinters не работала печать на принтер по умолчанию без каких либо диаолгов, то есть:
with Printer^ do
begin
  Assign(nil);
  Canvas.Font.....
  BeginDoc;
  -----
  EndDoc;
end;

Я выяснил опытным путем, что при такой конструкции в процедуре TPrinter.DefPrinter при создании канвы принтера fCanvas := NewCanvas(tagPD.hDC) значение tagPD.hDC равно нулю, и соответственно при вызове Writeln(...) программа уходит в бесконечный цикл. Открыл пример из архива с компонентом, он повел себя так же, причем печать с диалогами настройки страницы и выбора принтера работала. Чтобы заработала печать на принтер по умолчанию, мне пришлось слегка модифицировать файл KOLPrinters.pas, а именно:
procedure TPrinter.DefPrinter;
var
ftagPD : tagPD;
DevNames : PDevNames;
fHdc: HDC;
begin
   fAssigned := false;
   fState := psHandle;
   Prepare;
   { Get DC of default printer }
   FillChar(ftagPD,sizeof(tagPD),0);
   ftagPD.Flags := PD_RETURNDC and PD_RETURNDEFAULT;
   ftagPD.lStructSize := sizeof(ftagPD);
   if not PrintDlg(ftagPD) then Exit;
   fAssigned := true;
   DevNames := PDevNames(GlobalLock(ftagPD.hDevNames));
   fDevMode := ftagPD.hDevMode;
   fDeviceMode  := PDevMode(GlobalLock(fDevMode));
   try
       fDriver  := String(PChar(DevNames) + DevNames^.wDriverOffset);
       fDevice  := String(PChar(DevNames) + DevNames^.wDeviceOffset);
       fPort    := String(PChar(DevNames) + DevNames^.wOutputOffset);
   finally
       GlobalUnlock(ftagPD.hDevNames);
       GlobalFree(ftagPD.hDevNames);
   end;
fhDC := CreateDC(PChar(fDriver),PChar(fDevice),PChar(fPort),fDeviceMode);  
   fCanvas := NewCanvas(fhDC);

После этого печать на дефолтный принтер стала работать как следует. Непродолжительное тестирование отклонений не выявило.

Потестируйте пожалуйста модуль с данными изменениями в своих проектах.
Спасибо.


← →
vampir_infernal   (2007-01-15 07:11) [1]

Поправлюсь:
в строке ftagPD.Flags := PD_RETURNDC and PD_RETURNDEFAULT ничего менять не надо, вместо AND нужно "+".


← →
Vladimir Kladov   (2007-01-15 17:30) [2]

А где код уничтожения/освобождения fhDC?


← →
vampir_infernal   (2007-01-15 19:16) [3]

Он не нужен, так как делфи сам уничтожит переменную при выходе из процедуры.


← →
ANTPro ©   (2007-01-15 21:14) [4]

> [3] vampir_infernal   (15.01.07 19:16)
> переменную

А не хэндл?


← →
vampir_infernal   (2007-01-16 07:09) [5]

поскольку в коде написано var fhDC: HDC; - хэндл fhDC является переменной и существует только во время выполнения процедуры, в которой он объявлен. К тому же, не суть важно, как он уничтожится. Главное, что он уничтожится и не останется в виде утечки памяти.


← →
homm ©   (2007-01-16 10:00) [6]

> поскольку в коде написано var fhDC: HDC; - хэндл fhDC является
> переменной и существует только во время выполнения процедуры,
> в которой он объявлен.

Обкурился?
хэндл fhDC является переменной и ПЕРЕМЕННАЯ существует только во время выполнения процедуры, а хэндл уничтожать нужно ручками.


← →
ANTPro ©   (2007-01-16 14:41) [7]

> [6] homm ©   (16.01.07 10:00)

+1


← →
vampir_infernal   (2007-01-16 19:00) [8]

Хм. Что при уничтожении переменной хэндл остается жить, я не знал. Код исправлю.
Странно получается, ведь если хэндл остается, то почему нет утечки памяти? Перед тем, как создать эту тему, я потестил модуль сам. Мемпруф (знаю, что он не панацея) и самопальный счетчик памяти никак не сигнализировали об оставшемся хэндле.


← →
ANTPro ©   (2007-01-16 19:38) [9]

> [8] vampir_infernal   (16.01.07 19:00)

Хэндлы выделяет ось, прога лишь говорит когда их выделить и когда освободить. (Правельно?)


> [8] vampir_infernal   (16.01.07 19:00)
> Мемпруф

Юзай FastMM4 он должен ловить такое


← →
Vladimir Kladov   (2007-01-16 21:18) [10]

Это утечка не памяти, а ресурса GDI, который так и называется в строке memproof: DC.


← →
AndreyRus   (2007-01-16 22:50) [11]


> Обкурился?

:)
Дай бог тяга хорошая, может, что выдет!
> Локализация - проблема не KOL!



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.013 c
2-1186934620
Arx
2007-08-12 20:03
2007.09.02
Вопрос по ООП


15-1185953552
sl8er
2007-08-01 11:32
2007.09.02
Помогите с выбором СУБД


3-1178791509
zero
2007-05-10 14:05
2007.09.02
Как отловить ощибку


15-1186166402
ya00011
2007-08-03 22:40
2007.09.02
HTTP: как сказать качалке о том что докачка не поддерживается?


15-1185680931
Вирт
2007-07-29 07:48
2007.09.02
Подскажите ListView с виртуальным селектом?




   Наверх