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

Изменение размера бумаги в печатных настройках Delphi 2009: преодолеваем проблемы с правами доступа и WinSpool API

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

Разработчики, работающие с печатью в среде Delphi, часто сталкиваются с необходимостью изменения параметров печати, включая размер бумаги. В данной статье мы рассмотрим, как можно программно изменить размер бумаги с Letter на A4, используя WinSpool API, что особенно актуально для программ, которые должны работать на Windows XP и не могут использовать XPS API.

Проблема с правами доступа

При работе с WinSpool API важно правильно настроить права доступа к принтеру. В коде, предоставленном пользователем, при попытке получить информацию о принтере с использованием PRINTER_ACCESS_ADMINISTER возникает ошибка, предположительно из-за UAC. При использовании PRINTER_ACCESS_USE информация о принтере получается успешно, но при попытке её сохранить с помощью SetPrinter возникает ошибка.

Решение проблемы

Пользователь столкнулся с проблемой, что его программа на Delphi 2009 не использует установленные в системе настройки принтера на A4, а вместо этого применяет настройки на Letter. Это происходит из-за того, что программа не устанавливает размер бумаги самостоятельно перед печатью.

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

Ниже приведен пример кода, который изменяет размер бумаги с Letter на A4:

var
  H          : THandle;
  I          : TBytes;
  Info       : PPrinterInfo2;
  NeededSize : DWORD;
  DevMode    : PDeviceMode;
  PD         : TPrinterDefaults;
begin
  PD.pDatatype     := nil;
  PD.pDevMode      := nil;
  PD.DesiredAccess := PRINTER_ACCESS_USE; // Используйте PRINTER_ACCESS_USE для чтения настроек
  if not OpenPrinter('Brother HL-5350DN series Printer', H, @PD) then
  begin
    raise Exception.Create('OpenPrinter error: ' + SysErrorMessage(GetLastError));
  end;
  try
    Assert(not GetPrinter(H, 2, nil, 0, @NeededSize));
    SetLength(I, NeededSize);
    Info := @I[0];
    if not GetPrinter(H, 2, Info, NeededSize, @NeededSize) then
    begin
      raise Exception.Create('GetPrinter error: ' + SysErrorMessage(GetLastError));
    end;
    DevMode             := Info.pDevMode;
    DevMode.dmFields    := DevMode.dmFields or DM_PAPERSIZE;
    DevMode.dmPaperSize := DMPAPER_A4; // Установка размера бумаги на A4
    Info.pSecurityDescriptor := nil; // Сброс безопасности, если не планируется изменение

    // Для сохранения изменений необходимо использовать PRINTER_ACCESS_ADMINISTER
    PD.DesiredAccess := PRINTER_ACCESS_ADMINISTER; // Смена прав для сохранения настроек
    if not SetPrinter(H, 2, Info, 0) then
    begin
      raise Exception.Create('SetPrinter error: ' + SysErrorMessage(GetLastError));
    end;
  finally
    ClosePrinter(H);
  end;
  // Проверка настроек через диалог печати
  TPrintDialog.Create(Self).Execute;
end;

Важные замечания

  • Убедитесь, что настройки Windows для локализации установлены на английский язык, чтобы избежать проблем с кодировкой.
  • Перед использованием SetPrinter с измененными настройками, необходимо установить PRINTER_ACCESS_ADMINISTER в PD.DesiredAccess.
  • Не забудьте закрыть дескриптор принтера с помощью ClosePrinter(H);.

Альтернативный ответ

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

Заключение

Изменение размера бумаги в настройках печати Delphi 2009 может быть непростой задачей, но с использованием WinSpool API и правильным управлением правами доступа, можно достичь желаемого результата. Важно тщательно проверять настройки и следовать инструкциям по безопасности при работе с системными настройками принтера.

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

Разработчики столкнулись с проблемой изменения размера бумаги в печатных настройках Delphi 2009, связанной с правами доступа и использованием WinSpool API для корректной работы с различными форматами бумаги, в частности, переходом от Letter к A4.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:04:27/0.0055060386657715/1