Impression depuis une application FireMonkey

De RAD Studio
Aller à : navigation, rechercher

Remonter à Guide des applications FireMonkey


Vous pouvez imprimer depuis une application FireMonkey sur Windows ou OS X.

API d'impression FireMonkey

L'objet FMX.Printer.TPrinter encapsule les fonctionnalités d'accès et d'impression vers une imprimante raccordée à un ordinateur sous Windows ou OS X. Utilisez l'objet FMX.Printer.TPrinter pour gérer toutes les impressions effectuées par une application. Obtenez une instance de FMX.Printer.TPrinter en appelant la fonction globale FMX.Printer.Printer.

FMX.Printer.TPrinter a une liste d'objets TPrinterDevice, chacun représentant une imprimante. Chaque imprimante a sa propre liste de résolutions d'impression en DPI (dots per inch, ou PPP, points par pouce). La propriété DPICount vous donne le nombre de résolutions prises en charge par l'imprimante. La propriété DPI est une propriété indexée qui peut être traversée pour trouver les résolutions réelles. ActiveDPIIndex est un index de base zéro pour la propriété indexée DPI qui représente la résolution d'impression sur le périphérique d'impression.

Activation de l'impression dans votre application FireMonkey

Les étapes suivantes vous montrent comment imprimer avec succès à partir d'une application FireMonkey.

  1. Incluez FMX.Printer dans la fiche qui émet le travail d'impression :
    Delphi :
    uses FMX.Printer;
    
    C++ :
    #include "FMX.Printer.hpp"
    
  2. Utilisez toujours le canevas de l'imprimante ou un canevas d'un composant graphique (par exemple, le canevas d'une image) au lieu du canevas de la fiche. Quand vous n'utilisez pas le canevas de l'imprimante, démarrez toujours l'opération d'impression avec BeginScene et terminez le travail d'impression avec EndScene.
  3. Pour un contrôle complet sur la qualité de l'impression, la résolution et la portabilité du canevas, définissez tout d'abord ActiveDPIIndex en lui assignant une valeur ou en appelant la méthode SelectDPI (la façon recommandée) :
    Delphi :
    Printer.ActivePrinter.SelectDPI(1200, 1200); { one way }
    Printer.ActivePrinter.ActiveDPIIndex := 1; { another way }
    
    C++ :
    Printer->ActivePrinter->SelectDPI(1200, 1200); /* one way */
    Printer->ActivePrinter->ActiveDPIIndex = 1; /* another way */
    
  4. Démarrez le travail d'impression réel avec BeginDoc :
    Delphi :
    Printer.BeginDoc;
    
    C++ :
    Printer->BeginDoc();
    
  5. Terminez le travail d'impression réel avec EndDoc :
    Delphi :
    Printer.EndDoc;
    
    C++ :
    Printer->EndDoc();
    
  6. Ne changez jamais ActiveDPIIndex durant un travail d'impression.

A propos du support DPI et des pilotes

Le support des pilotes pour la même imprimante varie de beaucoup sur les différentes plates-formes (Windows, OS X). En conséquence, vous ne devez pas dépendre du fait que le nombre ou l'ordre des résolutions prises en charge dans le tableau DPI est le même entre Windows et OS X. Par exemple, seules trois résolutions sont prises en charge pour l'imprimante HP Laser Printer sur OS X, alors que sept résolutions sont prises en charge pour Windows. Si vos applications ont des fonctionnalités d'impression à la fois sur Windows et OS X, vous devez ajouter du code supplémentaire (spécifiant principalement le DPI) pour garantir que la sortie de l'impression est raisonnablement similaire sur les deux plates-formes.

La meilleure pratique consiste à toujours spécifier le DPI en définissant la propriété ActiveDPIIndex ou en appelant la méthode SelectDPI avant l'impression, comme mentionné dans les étapes ci-dessus.

Notez que ActiveDPIIndex n'est pas définie sur le DPI par défaut pour une imprimante donnée. Un objet TPrinterDevice ne prend pas en charge un DPI par défaut, car certains pilotes d'imprimante OS X ne signalent pas le DPI par défaut. Pour cette raison, ActiveDPIIndex est définie sur -1 quand l'application démarre, pour tous les objets TPrinterDevice. La valeur -1 signifie que l'application utilisera le dernier DPI d'impression ou le DPI par défaut. Le DPI par défaut est disponible seulement si, quand l'application a démarré, vous n'avez pas changé ActiveDPIIndex en une autre valeur d'index et n'avez pas appelé BeginDoc.

D'autre part, vous pouvez définir ActiveDPIIndex sur -1 et l'application utilisera le dernier DPI de l'imprimante ayant été préalablement défini. Vous devez donc toujours penser à définir une valeur sur ActiveDPIIndex avant d'appeler BeginDoc si vous voulez la même taille de canevas sur Windows et OS X.

La méthode SelectDPI est très facile à utiliser pour laisser un objet TPrinter sélectionner la résolution la plus proche de celle de votre imprimante, en fonction des paramètres passés à SelectDPI. Cela est très facile à définir ; par exemple, au lieu de définir directement la propriété ActiveDPIIndex, vous pouvez changer la valeur à l'exécution :

 Delphi :
Printer.ActivePrinter.Select(600, 600);
 C++ :
Printer->ActivePrinter->Select(600, 600);

Etant donné le fait que, sur Windows, le nombre de résolutions d'imprimante signalées par le pilote diffère de celui signalé par le pilote d'imprimante OS X, l'index spécifié peut être indisponible.

En conclusion, l'utilisation de SelectDPI est un moyen plus commode de définir le DPI de l'impression.

Canevas de l'imprimante

Il existe quelques différences entre l'usage d'un canevas d'imprimante et celui d'un canevas d'écran ou de fenêtre (fiche) :

  1. Lors de l'utilisation d'un canevas d'imprimante, vous devez définir les préférences de couleur et de remplissage en utilisant Canvas.Fill :
    Delphi :
    Canvas.Fill.Color := claXXX;
    Canvas.Fill.Kind := TBrushKind.Solid;
    
    C++ :
    Canvas->Fill->Color = claXXX;
    Canvas->Fill->Kind = TBrushKind.Solid;
    
  2. Lors de l'utilisation d'un canevas d'écran ou de fenêtre, vous devez définir les préférences de couleur et de remplissage en utilisant Canvas.Stroke :
    Delphi :
    Canvas.Stroke.Color := claXXX;
    Canvas.Stroke.Kind := TBrushKind.Solid;
    
    C++ :
    Canvas->Stroke->Color = claXXX;
    Canvas->Stroke->Kind = TBrushKind.Solid;
    

Mémorisez les points suivants :

  • Quand vous imprimez du texte et que vous voulez changer sa couleur, utilisez Canvas.Fill.
  • Quand vous dessinez autre chose, à l'exception d'un texte, utilisez Canvas.Stroke.

Le paramètre Opacity, pour toutes les routines le prenant en charge (telles que FMX.Graphics.TCanvas.FillRect), prend des valeurs à virgule flottante dans l'intervalle 0..1 (où 0 est transparent et 1 est opaque). Ne définissez pas des valeurs en dehors de cet intervalle.

Exemple d'impression par programmation

L'exemple suivant utilise une image et un bouton. Quand vous cliquez sur le bouton, l'image est imprimée sur l'imprimante.

 Delphi :
procedure TMyForm.PrintButtonClick(Sender: TObject);
var
  SrcRect, DestRect: TRectF;

begin
  { Set the default DPI for the printer. The SelectDPI routine defaults
    to the closest available resolution as reported by the driver. }
  Printer.ActivePrinter.SelectDPI(1200, 1200);

  { Set canvas filling style. }
  Printer.Canvas.Fill.Color := claBlack;
  Printer.Canvas.Fill.Kind := TBrushKind.Solid;

  { Start printing. }
  Printer.BeginDoc;

  { Set the Source and Destination TRects. }
  SrcRect := Image1.LocalRect;
  DestRect := TRectF.Create(0, 0, Printer.PageWidth, Printer.PageHeight);

  { Print the picture on all the surface of the page and all opaque. }
  Printer.Canvas.DrawBitmap(Image1.Bitmap, SrcRect, DestRect, 1);

  { Finish printing job. }
  Printer.EndDoc;
end;
 C++ :
void __fastcall TMyForm::PrintButtonClick(TObject *Sender)
{
  TRectF SrcRect, DestRect;
  TPrinter *Printer = Printer;

  /* Set the default DPI for the printer. The SelectDPI routine defaults
         to the closest available resolution as reported by the driver. */
  Printer->ActivePrinter->SelectDPI(1200, 1200);

  /* Set canvas filling style. */
  Printer->Canvas->Fill->Color = claBlack;
  Printer->Canvas->Fill->Kind = TBrushKind(1);

  /* Start printing. */
  Printer->BeginDoc();

  /* Set the Source and Destination TRects. */
  SrcRect = Image1->LocalRect;
  DestRect = TRectF(0, 0, Printer->PageWidth, Printer->PageHeight);

  /* Print the picture on all the surface of the page and all opaque. */
  Printer->Canvas->DrawBitmap(Image1->Bitmap, SrcRect, DestRect, 1);

  /* Finish the printing job. */
  Printer->EndDoc();
}

Pour de plus amples informations sur l'API d'impression, reportez-vous à la documentation de l'API dans l'unité FMX.Printer.

Voir aussi

Exemples de code