uses
Printers, Messages;
function GetDefaultPrinter: string;
var
ResStr: array[0..255] of Char;
begin
GetProfileString('Windows', 'device', '', ResStr, 255);
Result := StrPas(ResStr);
end;
procedure SetDefaultPrinter1(NewDefPrinter: string);
var
ResStr: array[0..255] of Char;
begin
StrPCopy(ResStr, NewdefPrinter);
WriteProfileString('windows', 'device', ResStr);
StrCopy(ResStr, 'windows');
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@ResStr));
end;
procedure SetDefaultPrinter2(PrinterName: string);
var
I: Integer;
Device: PChar;
Driver: PChar;
Port: PChar;
HdeviceMode: THandle;
aPrinter: TPrinter;
begin
Printer.PrinterIndex := -1;
GetMem(Device, 255);
GetMem(Driver, 255);
GetMem(Port, 255);
aPrinter := TPrinter.Create;
tryfor I := 0 to Printer.Printers.Count - 1 dobeginif Printer.Printers = PrinterName thenbegin
aprinter.PrinterIndex := i;
aPrinter.getprinter(device, driver, port, HdeviceMode);
StrCat(Device, ',');
StrCat(Device, Driver);
StrCat(Device, Port);
WriteProfileString('windows', 'device', Device);
StrCopy(Device, 'windows');
SendMessage(HWND_BROADCAST, WM_WININICHANGE,
0, Longint(@Device));
end;
end;
finally
aPrinter.Free;
end;
FreeMem(Device, 255);
FreeMem(Driver, 255);
FreeMem(Port, 255);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption := GetDefaultPrinter2;
end;
//Fill the combobox with all available printers procedure TForm1.FormCreate(Sender: TObject);
begin
Combobox1.Items.Clear;
Combobox1.Items.AddStrings(Printer.Printers);
end;
//Set the selected printer in the combobox as default printer procedure TForm1.Button2Click(Sender: TObject);
begin
SetDefaultPrinter(Combobox1.Text);
end;
Перевод текста на русский язык:
Код на Delphi, предназначенный для получения или установки принтера по умолчанию на Windows.
Вот разбивка каждого процедуры:
GetDefaultPrinter: Получает текущий принтер по умолчанию, прочитав ключ "device" в разделе "Windows".
SetDefaultPrinter1: Устанавливает новый принтер по умолчанию, записывая имя принтера в ключ "device" в разделе "Windows". Кроме того, отправляет сообщение WM_WININICHANGE для обновления окна.
SetDefaultPrinter2: Устанавливает новый принтер по умолчанию, итерируя через все доступные принтеры, проверяя, если выбранный принтер соответствует желаемому, и устанавливаются его свойства. Затем записывается имя устройства принтера, драйвер, порт и режим обработки в ключе "device" в разделе "Windows".
В коде формы:
Button1Click: Получает текущий принтер по умолчанию с помощью GetDefaultPrinter и отображает его в лейбле.
FormCreate: Заполняет комбо-бокс доступными принтерами из компонента "Printers".
Button2Click: Устанавливает выбранный принтер в комбо-боксе как принтер по умолчанию, вызывая SetDefaultPrinter.
Код работает корректно, но есть некоторые минорные проблемы и предложения:
В GetDefaultPrinter, функция GetProfileString возвращает строку с максимальной длиной 255 символов. Однако не проверяется, если возвращенная строка обрезана или нет.
В SetDefaultPrinter1, функция WriteProfileString перезаписывает любое существующее значение в ключе "device" в разделе "Windows". Могло быть лучше, если бы было проверено, существует ли ключ, и только если он не существует, то устанавливался новый принтер.
В SetDefaultPrinter2, вызовы FreeMem не необходимы, потому что память была выделена с помощью функции GetMem, которая автоматически освобождает память, когда процедура заканчивается.
Код использует устаревший синтаксис Delphi (например, StrPCopy, SendMessage). Рекомендуется обновить код до использования современного синтаксиса Delphi.
Вот обновленная версия SetDefaultPrinter2 с некоторыми улучшениями:
В этой обновленной версии я использовал функцию Format для конкатенации строк устройства принтера, драйвера и порта. Это более современный и эффективный способ конкатенации строк в Delphi.
В статье описывается, как получить или установить принтер по умолчанию в программировании на языке Delphi с использованием компонентов Printers и Messages.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.