Миграция кода 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, которые вызывают ошибку:
Если 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 для гарантированного закрытия принтера:
При миграции проектов между разными версиями Delphi важно внимательно следить за изменениями в типах данных и обрабатывать возможные ошибки. Использование try/finally блоков помогает избежать утечек ресурсов, а корректная обработка возвращаемых значений функций — предотвратить ошибки выполнения программы.
### Описание
Проблема с миграцией кода Delphi: ошибка при использовании функции `DocumentProperties` в PDF-печати при переходе с Delphi 7 на Delphi XE, связанная с неправильной интерпретацией возвращаемых значений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.