IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Appli FMX sous Windows, imprimer un Trectangle et son contenu.


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Technicien, secteur de l'énergie.
    Inscrit en
    Novembre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien, secteur de l'énergie.
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 13
    Par défaut Appli FMX sous Windows, imprimer un Trectangle et son contenu.
    Bonjour,

    Je suis en train de réécrire ce qui est ma première et unique application Delphi, initialement VCL en utilisant cette fois FMX.
    L'application est destinée à fonctionner sous windows.

    J'ai dans cette application un bouton "imprimer" qui m'ouvre la boite de dialogue d'impression en vue d'imprimer un TRectangle et tout son contenu.

    Après recherches (doc et exemples) je suis arrivé au code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    procedure TFormPrincipale.ButtonPrintClick(Sender: TObject);
     
    var
     Destrect : TrectF;
    begin
       if PrintDialog1.Execute
       then begin
                Setprinter(printer);
                Printer.Canvas.BeginScene;
                Printer.Orientation:=TPrinterOrientation.poPortrait;
                Printer.title:='Montitre';
                Printer.ActivePrinter.SelectDPI(1200,1200);
                Printer.BeginDoc;
                RectangleSchéma.Repaint;
                Destrect:=TRectF.Create(0,0,Printer.PageWidth,Printer.PageHeight);
                RectangleSchéma.Paintto(  Printer.canvas, Destrect );
                Printer.EndDoc;
                Printer.Canvas.EndScene;
            end;
     
    end;
    La procédure s'exécute correctement et j'arrive donc à lancer l'impression ( la génération d'un PDF en l'occurence puisqu'aucune imprimante n'est installée ).
    En revanche j'ai des problèmes avec les composants contenus dans le Trectangle. Le texte des boutons par exemple ne s'affiche pas et le style des boutons n'est pas correctement reproduit.

    Je ne comprend pas si le problème vient de mon code qui serait inadapté à ma situation, ou si il s'agit d'un problème de paramétrage des composants.

    Par avance merci à ceux qui pourront m'éclairer.

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 524
    Billets dans le blog
    10
    Par défaut
    Tu peux faire une capture d'écran dans un bitmap et c'est le Bitmap que tu imprime.exemple non vérifié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    procedure CaptureComponent(AComponent: TControl; const FileName: string);
    var
      Bitmap: TBitmap;
    begin
      Bitmap := TBitmap.Create;
      try
        // Dimensionner le bitmap à la taille du composant
        Bitmap.SetSize(AComponent.Width, AComponent.Height);
     
        // Dessiner le composant dans le bitmap
        AComponent.PaintTo(Bitmap.Canvas);
     
        // Sauvegarder l'image
        Bitmap.SaveToFile(FileName);
      finally
        Bitmap.Free;
      end;
    end;
    si tu veux un exemple complet tu me dis

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 031
    Par défaut
    @David_57, faudrait voir d'où vient le style, un StyleBook sur la Form par exemple, il y a une propriété AParent pour la fonction PaintTo, faudrait voir quel rôle cela joue.

    Ton besoin me rappelle exactement ce sujet Composants FMX > Delphi Générer un PDF et ce post montre le problème de vouloir imprimer directement un controle conçu pour un DPI Ecran contre un DPI d'imprimante, c'était en 2012 mais cela doit être toujours valide et comme ALWEBER, je ferais la même recommandation qu'à l'époque, d'ailleurs même en VCL, je ferais la même recommandation

    Citation Envoyé par ShaiLeTroll Voir le message
    Comme je le disais tu as des risques de proportion !
    Dessine d'abord dans un TBitmap puis dans le Canvas du TPrinter, je suis persuadé qu'il utilise le PixelsPerInch de l'imprimante pour calculer les Font !






    @ALWEBER, tu devrais essayé MakeScreenshot pour refactorer CaptureComponent qui d'ailleurs devrait être renommée en SaveCaptureFMXControlToFile puisque c'est ce que cela fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure SaveCaptureFMXControlToFile(AControl: FMX.Controls.TControl; const FileName: string);
    begin
      // Dessiner le composant dans un nouveau bitmap
      with AControl.MakeScreenshot() do
      try 
        // Sauvegarder l'image
        SaveToFile(FileName);
      finally
        Free();
      end;
    end;

    @David_57, l'avantage de MakeScreenshot génère un TBitmap qui contient une éventuellement une valeur pour BitmapScale, un ratio qui peut être utile pour imprimer si tu as un Rectangle 2D dans une Scene 3D (TLayer3D)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre averti
    Homme Profil pro
    Technicien, secteur de l'énergie.
    Inscrit en
    Novembre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien, secteur de l'énergie.
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 13
    Par défaut
    Bonsoir,

    Merci pour vos réponses et merci @ShaiLeTroll pour la lecture.

    Je pense avoir compris le principe, ce qui en soit est déjà une bonne chose

  5. #5
    Membre averti
    Homme Profil pro
    Technicien, secteur de l'énergie.
    Inscrit en
    Novembre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien, secteur de l'énergie.
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 13
    Par défaut
    Je n'ai pas su résister à l'appel du code, et cela a été fructueux !

    Merci encore à vous deux pour m'avoir mis sur la bonne piste.
    En partant de mon code de départ, et de vos conseils, puis après un peu d'optimisation je suis arrivé à ce code qui fonctionne comme je le souhaitais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    procedure TFormPrincipale.ButtonPrintClick(Sender: TObject);
     
    var
     Destrect : TrectF;
     Bitmap : Tbitmap;
     CouleurOrigineRectangle : TAlphaColor;
     
    begin
      // Mémorisation de la couleur d'origine du Rectangle et passage en blanc pour l'impression
      CouleurOrigineRectangle := RectangleSchéma.Fill.Color;
      RectangleSchéma.Fill.Color:=TAlphaColorRec.White;
      // Initialisation du bitmap et capture écran du rectangle
      Bitmap := Tbitmap.Create;
      Bitmap := RectangleSchéma.MakeScreenshot;
      // Remise à la couleur initiale du rectangle
      RectangleSchéma.Fill.Color := CouleurOrigineRectangle;
     
      try
       if PrintDialog1.Execute
       then begin
                // Initialisation de l'impression
                Setprinter(printer);
                Printer.Orientation:=TPrinterOrientation.poPortrait;
                Printer.title:='SMTS';
                Printer.ActivePrinter.SelectDPI(1200,1200);
                Printer.BeginDoc;
                // Définition de la zone d'impression en conservant les proportions (Merci ShaiLeTroll)
                DestRect := TRectF.Create(0, 0, Printer.PageWidth-10, (Bitmap.BitmapScale * Printer.PageWidth-10));
                // Transfert du bitmap dans la zone d'impression
                Printer.Canvas.BeginScene;
                Printer.Canvas.DrawBitmap(Bitmap, Bitmap.BoundsF, DestRect, 1);
                Printer.EndDoc;
                Printer.Canvas.EndScene;
            end;
      finally
       Bitmap.free;
      end;
    end;
    Je passe le sujet en résolu, mais je reste à votre écoute si quelque chose ne vous semble pas conventionnel dans le code.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 576
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    Ce que je reproche à ce genre de code c'est que le PDF contient une image et il est donc impossible (ou plutôt extrêmement compliqué) de récupérer des informations de texte dedans.
    A contrario, un générateur d'état (bien évidemment je pense à FastReport proposé via getit, mais il n'y a pas que lui) contient zones texte, images etc... le pdf est alors largement plus exploitable.

  7. #7
    Membre averti
    Homme Profil pro
    Technicien, secteur de l'énergie.
    Inscrit en
    Novembre 2018
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien, secteur de l'énergie.
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2018
    Messages : 13
    Par défaut
    Bonjour,

    Pour mon usage cela convient car le but est bien d'imprimer sur papier ce qui de plus est un schéma.
    Mais ton message rajoute une ligne à ma longue liste de choses à découvrir ... ( FastReport et ses amis ... )

    david.

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 576
    Billets dans le blog
    65
    Par défaut
    Et j'en rajoute une couche en indiquant que Skia permet de créer des PDF (lire ceci) sans passer par l'imprimante.
    Avec Skia4Delphi, il est possible de créer des documents PDF et de dessiner n'importe quoi dessus, du texte aux images.
    J'avoue que si l'exemple est bluffant, je me vois mal faire un états contenant des données avec cette technique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. déploiement d'une appli vb6 sous windows 7 - 32 bits
    Par JiBeL dans le forum Installation, Déploiement et Sécurité
    Réponses: 0
    Dernier message: 07/11/2012, 11h06
  2. Developper une appli IOS sous windows, est ce possible?
    Par Baradhur dans le forum Développement iOS
    Réponses: 1
    Dernier message: 05/03/2012, 07h51
  3. Réponses: 2
    Dernier message: 15/04/2011, 16h30
  4. Porter une applis GTK# sous Windows
    Par Rapha222 dans le forum C#
    Réponses: 2
    Dernier message: 10/11/2008, 23h12
  5. Réponses: 15
    Dernier message: 01/05/2007, 00h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo