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

Получить или установить принтер по умолчанию

Delphi , ОС и Железо , Принтеры и Печать

Получить или установить принтер по умолчанию


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; 
  try 
    for I := 0 to Printer.Printers.Count - 1 do 
    begin 
      if Printer.Printers = PrinterName then 
      begin 
        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.

Код работает корректно, но есть некоторые минорные проблемы и предложения:

  1. В GetDefaultPrinter, функция GetProfileString возвращает строку с максимальной длиной 255 символов. Однако не проверяется, если возвращенная строка обрезана или нет.
  2. В SetDefaultPrinter1, функция WriteProfileString перезаписывает любое существующее значение в ключе "device" в разделе "Windows". Могло быть лучше, если бы было проверено, существует ли ключ, и только если он не существует, то устанавливался новый принтер.
  3. В SetDefaultPrinter2, вызовы FreeMem не необходимы, потому что память была выделена с помощью функции GetMem, которая автоматически освобождает память, когда процедура заканчивается.
  4. Код использует устаревший синтаксис Delphi (например, StrPCopy, SendMessage). Рекомендуется обновить код до использования современного синтаксиса Delphi.

Вот обновленная версия SetDefaultPrinter2 с некоторыми улучшениями:

procedure SetDefaultPrinter2( PrinterName: string );
var
  I: Integer;
  Device, Driver, Port: string;
begin
  Printer.PrinterIndex := -1;
  for I := 0 to Printer.Printers.Count - 1 do
  begin
    if Printer.Printers[i] = PrinterName then
    begin
      Device := Format('%s,%s,%s', [Printer.GetPrinterDevice(I), Printer.GetPrinterDriver(I), Printer.GetPrinterPort(I)]);
      WriteProfileString('Windows', 'device', Device);
      SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(PChar(Device)));
    end;
  end;
end;

В этой обновленной версии я использовал функцию Format для конкатенации строк устройства принтера, драйвера и порта. Это более современный и эффективный способ конкатенации строк в Delphi.

В статье описывается, как получить или установить принтер по умолчанию в программировании на языке Delphi с использованием компонентов Printers и Messages.


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

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




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


:: Главная :: Принтеры и Печать ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 05:56:00/0.0035791397094727/0