При разработке кроссплатформенных приложений в 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 важно учитывать следующие особенности:
Разрешения: Убедитесь, что ваше приложение имеет необходимые разрешения для доступа к принтерам.
Доступность принтера: Всегда проверяйте, что принтер доступен и подключен.
Различия в 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.