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

Как получить и установить выбор бумаги во время выполнения в Delphi FireMonkey для MacOS

Delphi , Программа и Интерфейс , Приложение своё

 

Введение

При разработке кроссплатформенных приложений в Delphi с использованием FireMonkey разработчики часто сталкиваются с необходимостью работы с печатью на разных операционных системах, включая macOS. Одна из распространенных задач - динамическое получение и установка выбора бумаги во время выполнения программы. В этой статье мы рассмотрим, как реализовать эту функциональность в FireMonkey-приложении для macOS.

Основы печати в FireMonkey

FireMonkey предоставляет унифицированный API для работы с печатью через компонент TPrintDialog и класс TPrinter. Однако, при работе с macOS, возникают некоторые специфические особенности, связанные с архитектурой печати в этой операционной системе.

uses
  FMX.Printer, FMX.Printer.Mac;

Получение списка доступных форматов бумаги

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

procedure GetAvailablePaperTypes;
var
  Printer: TPrinter;
  MacPrinter: TMacPrinter;
  I: Integer;
begin
  Printer := TPrinter.CurrentPrinter;
  if Printer is TMacPrinter then
  begin
    MacPrinter := TMacPrinter(Printer);
    for I := 0 to MacPrinter.PaperCount - 1 do
    begin
      Writeln('Paper name: ' + MacPrinter.Papers[I].Name);
      Writeln('Paper size: ' + 
        FloatToStr(MacPrinter.Papers[I].Width) + 'x' + 
        FloatToStr(MacPrinter.Papers[I].Height));
    end;
  end;
end;

Установка формата бумаги во время выполнения

Для установки выбранного формата бумаги при печати можно использовать следующий код:

procedure SetPaperType(APaperName: string);
var
  Printer: TPrinter;
  MacPrinter: TMacPrinter;
  I: Integer;
begin
  Printer := TPrinter.CurrentPrinter;
  if Printer is TMacPrinter then
  begin
    MacPrinter := TMacPrinter(Printer);
    for I := 0 to MacPrinter.PaperCount - 1 do
    begin
      if SameText(MacPrinter.Papers[I].Name, APaperName) then
      begin
        MacPrinter.ActivePaper := MacPrinter.Papers[I];
        Break;
      end;
    end;
  end;
end;

Работа с пользовательскими форматами бумаги

Если вам необходимо работать с пользовательскими форматами бумаги, которые не представлены в стандартном списке, можно использовать следующий подход:

procedure AddCustomPaperType(AName: string; AWidth, AHeight: Single);
var
  Printer: TPrinter;
  MacPrinter: TMacPrinter;
  Paper: TPaperInfo;
begin
  Printer := TPrinter.CurrentPrinter;
  if Printer is TMacPrinter then
  begin
    MacPrinter := TMacPrinter(Printer);
    Paper := TPaperInfo.Create;
    try
      Paper.Name := AName;
      Paper.Width := AWidth;
      Paper.Height := AHeight;
      MacPrinter.AddPaper(Paper);
    except
      Paper.Free;
      raise;
    end;
  end;
end;

Пример полного кода для работы с выбором бумаги

Вот пример более полной реализации, которая включает интерфейс для выбора бумаги:

unit PaperSelectionForm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.ListBox, FMX.Printer, FMX.Printer.Mac, FMX.Layouts, FMX.Controls.Presentation;

type
  TFormPaperSelection = class(TForm)
    ComboBoxPaperTypes: TComboBox;
    Label1: TLabel;
    ButtonSelect: TButton;
    ButtonCancel: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ButtonSelectClick(Sender: TObject);
  private
    { Private declarations }
    procedure LoadPaperTypes;
  public
    { Public declarations }
    class function SelectPaperType(var APaperName: string): Boolean;
  end;

implementation

{$R *.fmx}

procedure TFormPaperSelection.FormCreate(Sender: TObject);
begin
  LoadPaperTypes;
end;

procedure TFormPaperSelection.LoadPaperTypes;
var
  Printer: TPrinter;
  MacPrinter: TMacPrinter;
  I: Integer;
begin
  ComboBoxPaperTypes.Clear;

  Printer := TPrinter.CurrentPrinter;
  if Printer is TMacPrinter then
  begin
    MacPrinter := TMacPrinter(Printer);
    for I := 0 to MacPrinter.PaperCount - 1 do
    begin
      ComboBoxPaperTypes.Items.Add(MacPrinter.Papers[I].Name);
    end;

    if ComboBoxPaperTypes.Items.Count > 0 then
      ComboBoxPaperTypes.ItemIndex := 0;
  end;
end;

procedure TFormPaperSelection.ButtonSelectClick(Sender: TObject);
begin
  ModalResult := mrOk;
end;

class function TFormPaperSelection.SelectPaperType(var APaperName: string): Boolean;
var
  Form: TFormPaperSelection;
begin
  Form := TFormPaperSelection.Create(nil);
  try
    Result := Form.ShowModal = mrOk;
    if Result then
      APaperName := Form.ComboBoxPaperTypes.Items[Form.ComboBoxPaperTypes.ItemIndex];
  finally
    Form.Free;
  end;
end;

end.

Альтернативный подход через Native API

Если вам требуется более глубокий контроль над процессом печати в macOS, можно использовать прямой вызов Native API через объявления в Delphi:

uses
  Macapi.CoreFoundation, Macapi.CocoaTypes, Macapi.AppKit;

function GetCurrentPrinterPaperList: TArray<string>;
var
  PrintInfo: NSPrintInfo;
  Printer: NSPrinter;
  PaperList: NSArray;
  I: Integer;
begin
  PrintInfo := TNSPrintInfo.Wrap(TNSPrintInfo.OCClass.sharedPrintInfo);
  Printer := PrintInfo.printer;
  if Assigned(Printer) then
  begin
    PaperList := Printer.stringListForKey(NSPrinterPaperName, inTable(NSPrinter.PPD));
    SetLength(Result, PaperList.count);
    for I := 0 to PaperList.count - 1 do
    begin
      Result[I] := NSStrToStr(TNSString.Wrap(PaperList.objectAtIndex(I)));
    end;
  end;
end;

Обработка ошибок и особенности macOS

При работе с печатью в macOS важно учитывать следующие особенности:

  1. Разрешения: Убедитесь, что ваше приложение имеет необходимые разрешения для доступа к принтерам.
  2. Доступность принтера: Всегда проверяйте, что принтер доступен и подключен.
  3. Различия в DPI: macOS может использовать разные значения DPI для разных принтеров.
procedure SafeSetPaperType(APaperName: string);
var
  Printer: TPrinter;
begin
  try
    Printer := TPrinter.CurrentPrinter;
    if not Printer.Active then
      Printer.Active := True;

    SetPaperType(APaperName);
  except
    on E: Exception do
      ShowMessage('Ошибка при установке формата бумаги: ' + E.Message);
  end;
end;

Заключение

Работа с выбором бумаги во время выполнения в Delphi FireMonkey для macOS требует понимания как общего API FireMonkey, так и специфики macOS. Представленные в статье подходы позволяют эффективно управлять настройками печати в кроссплатформенных приложениях. Для более сложных сценариев можно комбинировать стандартные методы FireMonkey с прямыми вызовами Native API macOS.

Не забывайте тестировать вашу реализацию на различных принтерах и версиях macOS, чтобы обеспечить корректную работу во всех возможных сценариях.

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

Статья описывает методы динамического получения и установки выбора бумаги в Delphi FireMonkey для macOS во время выполнения программы.


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

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




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


:: Главная :: Приложение своё ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-06 22:48:29/0.0067760944366455/0