Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.02;
Скачать: 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 вся ветка

Текущий архив: 2007.09.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
8-1164552655
Vovan#2
2006-11-26 17:50
2007.09.02
Звук и запись звука


11-1169072058
ZiTRaX
2007-01-18 01:14
2007.09.02
Файл KOL.pas, созданный GlueCut для FreePascal


15-1185953843
Bless
2007-08-01 11:37
2007.09.02
задачка об обходе шахматной доски конем.


9-1159531329
KygECHuK
2006-09-29 16:02
2007.09.02
Физика


15-1186492728
ArtemESC
2007-08-07 17:18
2007.09.02
Как отключить банеры?