Форум: "KOL";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Внизпроблема с 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 вся ветка
Форум: "KOL";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.053 c