Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Миграция кода Delphi: решаем проблему с `DocumentProperties` в PDF-печати между Delphi 7 и XE ###

Delphi , Синтаксис , Справочник по API-функциям

Миграция кода Delphi: решаем проблему с DocumentProperties в PDF-печати между Delphi 7 и XE

При работе с компонентами печати в среде Delphi, особенно при использовании функций, связанных с PDF, могут возникать проблемы при миграции проектов между различными версиями компиляторов. В частности, это касается функции DocumentProperties, которая используется для получения параметров печати устройства, включая размеры буфера для структуры DevMode.

Описание проблемы

При перекомпиляции кода, написанного для Delphi 7 в среде Windows XP, в Delphi XE под Windows 7, возникает ошибка при работе функции GetPrinterDevMode, которая предназначена для сбора свойств документа печатаемого PDF. В Delphi 7 код работает корректно, но при использовании Delphi XE функция завершается с ошибкой. Проблема связана с переменной dwNeeded, которая в Delphi 7 имеет значение 7332, а в XE — 4294967295, что свидетельствует о неправильной интерпретации возвращаемого значения.

Шаг 1: Анализ кода

Для начала, рассмотрим ключевые моменты функции GetPrinterDevMode, которые вызывают ошибку:

dwNeeded := DocumentProperties(0, PrinterHandle, pDevice, pDevModeVar^, pDevModeVar^, 0);
GetMem(pDevModeVar, dwNeeded);

Далее, функция вызывает DocumentProperties снова для заполнения буфера:

dwRet := DocumentProperties(0, PrinterHandle, pDevice, pDevModeVar^, pDevModeVar2^, DM_OUT_BUFFER);

Если dwRet не равен IDOK, то следует освободить выделенную память и закрыть принтер.

Шаг 2: Устранение проблемы

Проблема заключается в том, что возвращаемое значение из DocumentProperties является знаковым 32-битным целым числом типа LONG. В Delphi XE тип LONG не объявлен, поэтому необходимо использовать Integer. Также важно проверять возвращаемое значение на ошибки, так как отрицательный результат указывает на сбой.

Исправленный код должен выглядеть следующим образом:

dwNeeded := DocumentProperties(0, PrinterHandle, pDevice, nil, nil, 0);
if dwNeeded < 0 then
  // Обработка ошибки
  Exit;
GetMem(pDevModeVar, dwNeeded);

dwRet := DocumentProperties(0, PrinterHandle, pDevice, pDevModeVar^, nil, DM_OUT_BUFFER);
if dwRet <> IDOK then
begin
  FreeMem(pDevModeVar);
  ClosePrinter(PrinterHandle);
  Result := nil;
end;

Обратите внимание, что в первом вызове DocumentProperties параметры pDevModeVar и pDevModeVar2 заменены на nil, что является допустимым.

Шаг 3: Обработка ошибок

Необходимо добавить проверку на отрицательное значение dwNeeded и корректную обработку ошибок в случае, если dwRet не равен IDOK. Также, следует использовать блок try/finally для гарантированного закрытия принтера:

try
  // Код, использующий принтер
finally
  ClosePrinter(PrinterHandle);
end;

Заключение

При миграции проектов между разными версиями Delphi важно внимательно следить за изменениями в типах данных и обрабатывать возможные ошибки. Использование try/finally блоков помогает избежать утечек ресурсов, а корректная обработка возвращаемых значений функций — предотвратить ошибки выполнения программы.

Создано по материалам из источника по ссылке.

### Описание Проблема с миграцией кода Delphi: ошибка при использовании функции `DocumentProperties` в PDF-печати при переходе с Delphi 7 на Delphi XE, связанная с неправильной интерпретацией возвращаемых значений.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:17:37/0.0033519268035889/0