Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.073 c
2-1186828495
Снова я
2007-08-11 14:34
2007.09.02
Сокеты и слияние команд


15-1185554920
oxffff
2007-07-27 20:48
2007.09.02
Second Life, Second Chance for CodeGear


5-1160461319
Priest
2006-10-10 10:21
2007.09.02
Функция UnRegister для пакета


2-1186564374
1c_user
2007-08-08 13:12
2007.09.02
Форма не показывается


1-1182415440
DevilDevil
2007-06-21 12:44
2007.09.02
Excel. Не ошибка при обращении Sheet.Range





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