Синхронизация списка принтеров в Delphi XE2: сравнение TPrintDialog и Printer.Printers
Вопрос пользователя заключается в том, что при подключении к терминальному серверу и использовании тестовой программы на Delphi XE2, список имен принтеров в коллекции Printer.Printers отличается от списка, который отображается при использовании TPrintDialog. Несмотря на то, что некоторые переадресованные принтеры отображаются в обоих списках, в диалоговом окне печати присутствуют еще три локальных принтера, которые также переадресованы. Пользователь пытался найти источник списка принтеров в коде Vcl.Dialogs и напрямую вызвать EnumPrinters, но результаты были неудовлетворительными. Вопрос состоит в том, как убедиться, что в коде на Delphi можно получить тот же список принтеров, что и при просмотре через Панель управления.
Подтвержденный ответ:
Для синхронизации списка принтеров в программе на Delphi XE2 с тем, что отображается в диалоговом окне печати, можно использовать следующий подход:
Вызов функции Printer.Refresh непосредственно перед получением списка принтеров может помочь обновить список доступных принтеров. Это действие обновляет внутреннюю коллекцию Printer.Printers, что может быть необходимым в случае, если изменения в системе принтеров не были учтены.
Использование функции 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;
Учет возможных особенностей работы терминальных серверов, таких как использование служб Easy Print в Windows Server 2008 и выше, которые могут влиять на отображение списка принтеров.
Альтернативный ответ:
Если вышеуказанные действия не приводят к желаемому результату, можно рассмотреть другие причины, такие как неполное завершение процесса переадресации принтеров терминальным сервером до начала работы RemoteApp, или необходимость изменения индекса текущего принтера в программе.
Заключение:
Для обеспечения синхронизации списка принтеров в Delphi XE2 с тем, что отображается в диалоговом окне печати, необходимо использовать сочетание обновления коллекции Printer.Printers и прямого вызова функции EnumPrinters. Это позволит получить полный и актуальный список принтеров, доступных в системе, включая переадресованные принтеры на терминальных серверах.
Ответ на вопрос пользователя касается синхронизации списка принтеров в программе на Delphi XE2 с тем, который отображается в стандартных средствах операционной системы, в частности, в диалоговом окне печати.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.