Пользователь приходит и говорит программисту:
- Мне информацию в электронном виде надо. Ну, на дискете чтоб.
- А в каком формате?
- Как в каком? Ясно в каком - в A4.
Вот пример, выводящий список форматов бумаги для принтера, установленного по
умолчанию:
procedure TForm1.Button2Click(Sender: TObject);
type
TPaperName = array[0..63] of Char;
TPaperNameArray = array[1..High(Cardinal) div Sizeof(TPaperName)] of
TPaperName;
PPapernameArray = ^TPaperNameArray;
var
Device, Driver, Port: array[0..255] of Char;
hDevMode: THandle;
i, numPaperformats: Integer;
pPaperFormats: PPapernameArray;
begin
Printer.PrinterIndex := -1;
Printer.GetPrinter(Device, Driver, Port, hDevmode);
numPaperformats :=
WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES, nil, nil);
if numPaperformats > 0 thenbegin
GetMem(pPaperformats, numPaperformats * Sizeof(TPapername));
try
WinSpool.DeviceCapabilities(Device, Port, DC_PAPERNAMES,
Pchar(pPaperFormats), nil);
memo1.clear;
for i := 1 to numPaperformats do
memo1.lines.add(pPaperformats^[i]);
finally
FreeMem(pPaperformats);
end;
end;
end;
Переведенный текст:
Код - процедура в Delphi, которая получает список форматов бумаги для печати на умолчанию установленном принтере на системе. Вывод отображается в контроле memo (memo1).
Разбивка кода:
Инициализирует некоторые переменные:
Device, Driver и Port - массивы для хранения информации о устройстве, драйвере и порте принтера.
hDevMode -.handle к структуре устройства режима.
numPaperformats - целочисленная переменная для хранения количества форматов бумаги доступных для печати.
pPaperFormats - указатель на массив TPaperName (массив из 64 символов), который будет использоваться для хранения списка форматов бумаги.
Устанавливает индекс принтера в -1, что означает использование умолчательного принтера. Затем вызывает GetPrinter для получения структуры устройства режима для умолчательного принтера.
Вызывает WinSpool.DeviceCapabilities с значением DC_PAPERNAMES, чтобы получить количество форматов бумаги доступных для печати на этом принтере.
Если есть более 0 форматов бумаги доступных, выделяет память для массива TPaperName используя GetMem.
Вызывает WinSpool.DeviceCapabilities снова с значением DC_PAPERNAMES и выделенной памятью, чтобы получить список форматов бумаги.
Наконец, освобождает выделенную память используя FreeMem, очищает контрол memo (memo1) и добавляет каждый формат бумаги из массива к строкам контрола memo.
Возможные улучшения:
Вместо жесткого кодирования индекса принтера в -1, рассмотрите возможность позволить пользователю выбрать принтер или получить список доступных принтеров.
Вы можете улучшить обработку ошибок, проверяя ошибки, возвращаемые WinSpool.DeviceCapabilities и другими системными вызовами.
Рассмотрите добавление более функциональности процедуры, например, позволение пользователю фильтровать форматы бумаги по определенным критериям (например, только показать форматы A4).
Код использует контрол memo для отображения результатов. Вам может быть полезно использовать более robust UI-контрол, например, список или дерево, в зависимости от требований.
Альтернативное решение: вы можете использовать компонент TPrinter Delphi и его методы, такие как PaperNames, чтобы получить список форматов бумаги доступных для печати. Это может быть проще и более поддерживаемым, чем использование вызовов Windows API напрямую.
В статье описывается пример программного кода на языке Delphi, который выводит список форматов бумаги для принтера, установленного по умолчанию.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.