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

Lazarus Pascal Discussion :

Utiliser les informations d'une imprimante [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut Utiliser les informations d'une imprimante
    Bonjour,
    Suite à un problème matériel j'ai changé d'imprimante et de résolution de 300 à 600.
    J'ai développé depuis un certain temps sous linux avec lazarus une petite application pour imprimer des enveloppes de différents formats en utilisant une base de données d'adresses sous sqlite.
    Pour l'impression j'utilise les informations hauteur papier, largeur papier, orientation etc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Printer.Orientation:=poLandscape;
      XLARG_PAGE:= Printer.PaperSize.PaperRect.PhysicalRect.Right-Left;  
      XHAUT_PAGE:= Printer.PaperSize.PaperRect.PhysicalRect.Bottom-Top;
    Je voudrais utiliser la valeur de la résolution que je peux afficher via le composant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     PrinterSetupDialog.execute
    mais je n'arrive pas à récupérer cette valeur de résolution. C'est surement très simple mais je n'ai pas encore trouvé.
    Alors un petit coup de main me serait bien utile.
    Merci d'avance
    A+

  2. #2
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par ovni76 Voir le message
    ... je n'arrive pas à récupérer cette valeur de résolution. ...
    Ces valeurs sont données par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Printer.XDPI
    Printer.YDPI
    Cordialement.

    Pierre.

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 695
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    Pour l'impression (en supposant que ce soit du Windows), le mieux est de convertir le DC de l'imprimante en (centième de) millimètre par SetMapMode.
    Tu t'affranchis ainsi de tous les calculs de conversion ET de la résolution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Coordonnées en 1/100 mm
    SetMapMode(Printer.Canvas.Handle, MM_HIMETRIC);
    Attention cependant à l'axe Y qui est inversé. Les valeurs sont négatives :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Texte à 10mm des bords
    Printer.canvas.TextOut(1000, -1000, 'Texte');

  4. #4
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Merci pour vos réponses,
    Pour Andnotor je suis sous linux donc la solution proposée n'est pas valable et de plus je préfère la solution utilisant les paramètres ce qui va me permettre de modifier mon application pour la rendre plus générale, utilisable avec des imprimantes aux caractéristiques différentes.
    Donc je vais utiliser la solution de ChPr qui va dans mon sens.
    Encore merci A+

  5. #5
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut voici quelques fonctions qui pourraient t'être utiles :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    { NOTE :
       1 cm =  37.79527559055 pixels
       1 pixel = 0.02645833333333416 cm
    }
    function PixelsToCentimeters(nbPixels : Integer) : Double;
    begin
      Result := (nbPixels * 0.02645833333333416)
    end;
     
    function CentimetersToPixels(nbCm : Double) : Integer;
    begin
      Result := Round((nbCm / 0.02645833333333416));
    end;
     
    { NOTE :
     
      1 pouce (inch) = 2,54 cm
      1 cm = 0,3937 pouce (inch)
    }
    function InchToCentimeters(nbInch : Double) : Double;
    begin
      Result := nbInch / 0.3937;
    end;
     
    function CentimetersToInch(nbCm : Double) : Double;
    begin
      Result := nbCm * 0.3937;
    end;
     
    function PixelsToMillimeters(nbPixels : Integer) : Double;
    begin
      Result := PixelsToCentimeters(nbPixels) * 10;
    end;
     
    function MillimetersToPixels(nbMm : Double) : Integer;
    begin
      Result := CentimetersToPixels(nbMm / 10);
    end;
     
    function InchToPixels(nbInch : Double) : Integer;
    begin
      Result := CentimetersToPixels(InchToCentimeters(NbInch));
    end;
     
    function PixelsToInch(nbPixels : Integer) : Double;
    begin
      Result := CentimetersToInch(PixelsToCentimeters(nbPixels));
    end;
     
    function PixelsResolutionToCentimeters(nbPixels, DPI : Integer) : Double;
    begin
      Result := nbPixels * 2.54 / DPI;
    end;
     
    function CentimetersToPixelsResolution(nbCm : Double; DPI : Integer) : Integer;
    begin
      Result := Round(nbCm * DPI / 2.54);
    end;
    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #6
    Membre actif
    Homme Profil pro
    Retraité
    Inscrit en
    Juillet 2008
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juillet 2008
    Messages : 385
    Points : 223
    Points
    223
    Par défaut
    Merci Beanzmaster,
    Ces fonctions se sont des personnelles où elles viennent d'un composant ?
    A+

  7. #7
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ovni76 Voir le message
    Merci Beanzmaster,
    Ces fonctions se sont des personnelles où elles viennent d'un composant ?
    A+
    Perso, elles sont dans mon unité BZMath, de mon projet
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut voici quelques fonctions qui pourraient t'être utiles : ...
    Pourquoi n'as-tu pas mis ces fonctions sous formes de "Helpers", comme tu l'as fait pour d'autres types de conversions ?

    Cordialement.

    Pierre.

  9. #9
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Pourquoi n'as-tu pas mis ces fonctions sous formes de "Helpers", comme tu l'as fait pour d'autres types de conversions ?

    Cordialement.

    Pierre.
    Salut

    De quels autres types de conversions fais tu allusion ?
    Mettre ces fonctions dans mon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDoubleHelper =  type helper for Double
    ne me parait pas approprié car elles sont spécifiques. De plus elles utilisent également des "integer" du coup faudrait également ajouter certaine de ces fonctions dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TIntegerHelper =  type helper for Integer
    Ce ne serait pas très logique et pratique, à mon avis. Par contre les mettre dans une classe ou un enregistrement spécifique serait un plus, suivant le cas.

    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #10
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    ... De quels autres types de conversions fais tu allusion ? ...
    Voir cette discussion.

    C'est vrai qu'ici c'est spécifique, mais dans cet esprit tu aurais remplacé par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbCm:= InchToCentimeters(Printer.XDPI);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbCm:= Printer.XDPI.ToCentimeters;
    Cordialement.

    Pierre.

  11. #11
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Voir cette discussion.

    C'est vrai qu'ici c'est spécifique, mais dans cet esprit tu aurais remplacé par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbCm:= InchToCentimeters(Printer.XDPI);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NbCm:= Printer.XDPI.ToCentimeters;
    Cordialement.

    Pierre.
    Bien vu je n'y avais pas pensé dans ce sens. Reste que cet assistant sera propriétaire de l'application uniquement.
    Pour ma part cela serait plus logique si c'est appliqué sur la largeur et la hauteur.
    Mais dans ce cas, au lieu de faire un assistant pour les Integer, je le ferais plus pour l'objet TPrinter avec une fonction pour paramétrer directement la taille de la page à imprimer.

    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
    Unit PrinterHelper;
     
    {$mode objfpc}{$H+}
     
    interface  
     
    uses Classes, SysUtils, Printers;
     
    Type
      TPrinterHelper = class helper for TPrinter
      public
          procedure SetPageSize(LargeurCm, HauteurCm : Double; DPI : Integer); overload;
          procedure SetPageSize(LargeurCm, HauteurCm : Double; XDPI, YDPI : Integer); overload;
          procedure SetPageSize(LargeurCm, HauteurCm : Double); overload; // Prend les DPI de TPrinter
     
          function GetWidthInCentimers : Double; //pas vraiment utile car on connait déja la taille d'impression du papier
          function GetHeightInCentimers : Double;
       end;
    Mais bon l'objet TPrinter ne semble pas gérer les DPI et est limité à 72 DPI seulement par défaut. En plus les propriétés XDPI et YDPI sont en lecture seule Il semble que la solution c'est de passer par le TPrinterCanvas pour gérer les dimensions et la résolution à la main.

    J'ai très peu utilisé l'objet TPrinter, ca mériterait le détour un de ces quatre . Il y sûrement moyen d'améliorer cet objet grâce aux assistants. À réfléchir.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

Discussions similaires

  1. Comment lire les propriétés d'une imprimante ?
    Par zidenne dans le forum Langage
    Réponses: 18
    Dernier message: 06/08/2010, 11h26
  2. script permettant d'installer les drivers d'une imprimante
    Par Chromatic dans le forum Installation, Déploiement et Sécurité
    Réponses: 1
    Dernier message: 28/02/2006, 11h30
  3. comment utiliser les fonctions d'une dll
    Par sebled dans le forum MFC
    Réponses: 3
    Dernier message: 24/02/2006, 16h59
  4. Réponses: 5
    Dernier message: 23/12/2005, 19h19
  5. Réponses: 5
    Dernier message: 19/07/2005, 21h54

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