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

**Синхронизация списка принтеров в Delphi XE2: сравнение `TPrintDialog` и `Printer.Printers`**

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

Синхронизация списка принтеров в Delphi XE2: сравнение TPrintDialog и Printer.Printers

Вопрос пользователя заключается в том, что при подключении к терминальному серверу и использовании тестовой программы на Delphi XE2, список имен принтеров в коллекции Printer.Printers отличается от списка, который отображается при использовании TPrintDialog. Несмотря на то, что некоторые переадресованные принтеры отображаются в обоих списках, в диалоговом окне печати присутствуют еще три локальных принтера, которые также переадресованы. Пользователь пытался найти источник списка принтеров в коде Vcl.Dialogs и напрямую вызвать EnumPrinters, но результаты были неудовлетворительными. Вопрос состоит в том, как убедиться, что в коде на Delphi можно получить тот же список принтеров, что и при просмотре через Панель управления.

Подтвержденный ответ:

Для синхронизации списка принтеров в программе на Delphi XE2 с тем, что отображается в диалоговом окне печати, можно использовать следующий подход:

  1. Вызов функции Printer.Refresh непосредственно перед получением списка принтеров может помочь обновить список доступных принтеров. Это действие обновляет внутреннюю коллекцию Printer.Printers, что может быть необходимым в случае, если изменения в системе принтеров не были учтены.

  2. Использование функции EnumPrinters с соответствующими параметрами для получения полного списка принтеров, включая локальные, сетевые и переадресованные принтеры. Пример кода на Object Pascal:

uses
  Winapi.Windows,
  Winapi.PrinterUtils;

procedure TForm1.GetPrinterList;
var
  InfoLevel: TEnumPrintersLevel;
  PrinterName: array[0..(MAX_PATH - 1)] of Char;
  Printers: TArray<TPrinterInfo2>;
  Count: Cardinal;
  Flags: DWORD;
begin
  InfoLevel := PRINTER_ENUM_CONNECTIONS;
  Count := 0;
  Flags := PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS;
  EnumPrinters(InfoLevel, nil, PRINTER_INFO_2, @Printers[0], SizeOf(TPrinterInfo2) * Length(Printers),
    Count, Flags);
  SetLength(Printers, Count div SizeOf(TPrinterInfo2));
  if EnumPrinters(InfoLevel, nil, PRINTER_INFO_2, @Printers[0], SizeOf(TPrinterInfo2) * Length(Printers), Count, Flags) then
  begin
    // Обработка списка принтеров
    for var i := 0 to Count - 1 do
    begin
      StrCopy(PrinterName, Printers[i].pPrinterName);
      // Вывод или использование информации о принтере
    end;
  end;
end;
  1. Учет возможных особенностей работы терминальных серверов, таких как использование служб Easy Print в Windows Server 2008 и выше, которые могут влиять на отображение списка принтеров.

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

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

Заключение:

Для обеспечения синхронизации списка принтеров в Delphi XE2 с тем, что отображается в диалоговом окне печати, необходимо использовать сочетание обновления коллекции Printer.Printers и прямого вызова функции EnumPrinters. Это позволит получить полный и актуальный список принтеров, доступных в системе, включая переадресованные принтеры на терминальных серверах.

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

Ответ на вопрос пользователя касается синхронизации списка принтеров в программе на Delphi XE2 с тем, который отображается в стандартных средствах операционной системы, в частности, в диалоговом окне печати.


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

Получайте свежие новости и обновления по 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:09:47/0.0033769607543945/0