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

Composants VCL Delphi Discussion :

Paramètrage hauteur impression sans boîte de dialogue


Sujet :

Composants VCL Delphi

  1. #1
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Paramètrage hauteur impression sans boîte de dialogue
    Title : Paramètrage hauteur printage sans boîte de dialogue


    Bonjour,

    Question toute bête de débutant :

    Malgré diverses recherches sur ce sujet précis, même F1 n'est pas très loquace.

    Comment faire pour imprimer une fiche d'une hauteur inférieure au format A4, par exemple une enveloppe sans passer par la boîte de dialogue ?

    L'autre fois j'ai aussi installé la ZPrinters, farfouillé et testé, mais je ne suis pas plus avancé.

    Merci d'avance de vos réponses.

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Salut,

    il faut que tu utilises la classe TPrinter.

    Pour ce faire tu vas déclarer ceci dans la clause uses :

    Ensuite tu vas utiliser les propriétés PageWidth et PageHeight, ainsi ton canevas auras la taille d'impression par défaut, c-a-d A4...

    A plus,

    Chris

  3. #3
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir,

    Merci Chris de m'avoir répondu, mais j'avais déjà essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Printer.PageHeight := 227;
    J'avais bien cette classe Printers de déclarée.

    et j'ai toujours ce message d'erreur :
    [Erreur] Unit1.pas(1631): Affectation impossible à une propriété en lecture seule
    Qu'ai-je fait quoi comme mauvaise manip ?

    propriété en lecture seule ???

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Re,

    c'est normal car tu ne peux pas lui donner de valeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Printer.PageHeight := 227;
    C'est cette affectation qui te donne ton erreur. Non moi je pensais plutôt à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Hauteur := Printer.PageHeight;
    A plus,

    Christopher

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 184
    Points : 149
    Points
    149
    Par défaut
    une petite recherche dans google donne
    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
    var
     buffer1 : array[0..250] of char;
     buffer2 : array[0..250] of char;
     buffer3 : array[0..250] of char;
     ADevice, ADriver, APort : pchar;
     hDm :  THandle;
      dm :  DEVMODE; // For help, click on DEVMODE and press F1
     Pdm : ^DEVMODE;
     s : string;
     i : integer;
    begin
      ADevice := buffer1;
      ADriver := buffer2;
      APort   := buffer3;
      Printer.GetPrinter(ADevice, ADriver, APort, hDm);
      Pdm := GlobalLock (hDm);
        // get and set individual parameters here
        // just type "Pdm^." to get a list of available parameters
        // Some useful parameters include
        //    PaperSize - Letter, Legal, A4 etc.
        //    PaperLength, PaperWidth - values in millimeters
        //      - use Printer.PageHeight & .PageWidth to read values in pixels
        //    PrintQuality, YResolution - pixels per inch
     
      GlobalUnlock(hDm);
      printer.SetPrinter(ADevice, ADriver, APort, hDm); // maybe not necessary
    end;
    J'ai pas essayé mais j'imagine que c'est correct

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 302
    Points
    11 302
    Billets dans le blog
    6
    Par défaut
    as-tu essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printer.canvas.Height := 115;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir ,

    Merci à tous, j'ai pas tout pigé (sfpx), par contre le code de Christopher "passe" :

    ...
    var
    Hauteur : integer;
    begin
    with Printer do
    begin
    BeginDoc;
    // un peu de mise en forme
    Canvas.Font.Name := 'Courier New';
    Canvas.font.Size := 10;
    Canvas.font.Style := [fsBold];
    ...
    Ici les trucs à printer...
    // Printer.PageHeight := 227;
    Hauteur := 10;
    Hauteur := Printer.PageHeight;
    EndDoc;
    end;
    end;
    Par contre, bien que la valeur affectée à l'integer (10 pixels) soit ridiculement basse... une enveloppe de 11 cm est entièrement printée !

    Je n'y comprends plus rien ;o(

    Pour tourlourou :
    Ton code donne le même message d'erreur que moi au début.

    Quelle marche ai-je loupée ?

    @+

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 302
    Points
    11 302
    Billets dans le blog
    6
    Par défaut
    Par contre, bien que la valeur affectée à l'integer (10 pixels) soit ridiculement basse... une enveloppe de 11 cm est entièrement printée !
    tu n'affectes pas la hauteur de la page, qui vaut toujours Page.Height, puis que tu peux lire dans Hauteur !

    si > 115 mm, il est donc normal qu'elle s'imprime entièrement...

    il faudrait essayer la méthode de sfpx
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  9. #9
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    Tourlourou, oui tu as sans doute raison, mais là hors la méthode Canvas, ça me dépasse un peu, je suis comme indiqué en seconde ligne de mon premier message : un débutant.

    Enfin avec les méthodes Canvas, je me débrouille bien, mais là...

    Je pensais que tout ça était moins compliqué

    J'ai essayé cette méthode, mais ça donne rien, enfin je ne sais pas trop comment insérer mes objects à printer. Mais au moins ça ne plante pas lol

    Pas un pt'iot exemple d'utilisation de derrière les fagots ? ce serait super.

    Merci d'avance

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Me revoila,

    essaye ce bout de code un peu plus explicite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    With Printer.Canvas do
        begin
        Font.Name := 'Courrier New';
        //Adaptons la taille de la police à la résolution de l'imprimante
        Y:=PageHeight Div (NombreY+8);
        Font.Height:=-Y;
        X:=TextWidth('A');
        Font.Height:=-2*Y;
        TextOut(X*7,Y*3,'Texte que tu veux imprimer');
        .....
        end;

    Essaye déjà ça et dis nous si c'est ce que tu cherchais...

    A plus..

  11. #11
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Merci Christopher,

    J'ai mis les variable X et Y en integer, je ne sais pas si c'est ça qu'il faut faire.

    Par contre au niveau de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Y:=PageHeight Div (NombreY+8);
    Là... PageHeight et et la suite = ça coince lol

    Je ne sais comment y remédier

    Sinon, ça n'a pas l'air d'être mal du tout, je suis bien plus à l'aise avec cette méthode Canvas !

    @+

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Re moi,

    C'était juste un exemple...

    Tu peux remplacer par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    With Printer.Canvas do
        begin
        Font.Name := 'Courrier New';
        Font.Size:=12;
        TextOut(X,Y,'Texte que tu veux imprimer');
        .....
        end;

  13. #13
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Re Christopher,

    Oki, oki mais au moment du printrage : plantage simplement sans rien d'autre (avec F7) avec boîte d'erreur "L'imprimante n'imprime pas pour l'instant" lol véridique.

    je crois que j'ai encore sous-estimé le blème

    @ + merci de tes efforts 8)

  14. #14
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    c'est encore moi

    Tu as bien mis la ligne suivante :

    ...

    A plus,

    Christopher

  15. #15
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Re, encore moi,

    Bin non, là j'ai ajouté mais plantage du pilote du ma printeuse.

    Je vais becter un peu

    Merci !

    Je vais redonner le code complet.. @+

  16. #16
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonsoir, toujours moi

    Voici donc le code au complet, des fois que j'ai loupé une marche :

    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 TForm1.PrintToto(Sender: TObject);
      var
      Y, X: Integer;
    begin
     
    //with Printer do // essais de manip...
    //begin
    //BeginDoc;
     
          With Printer.Canvas do
      begin
        Printer.BeginDoc;
     
         Font.Name := 'Courrier New';
        Font.Size:=12;
        TextOut(X,Y,'Texte que tu veux imprimer');
        // .....
     
    //EndDoc;  // en couple avec l'essai ci-dessus, mais ça passe pô...
     
       end;
    end;
    Le processus de printage se lance, mais la montagne accouche d'une souris, et encore ; le gestionnaire de printage reste affiché et rien ne se passe ensuite.

    Enfin si : je suis bon pour rebooter car le pilote de ma printeuse n'aime pas ce bloc de code

    @+

  17. #17
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 258
    Points : 558
    Points
    558
    Par défaut
    Salut,

    Il faut que tu sortes le EndDoc de ta boucle With ... do, en effet les fonctions BeginDoc et EndDoc appartiennent à l'objet Printer proprement dit et non à l'objet Canvas.

    A plus et bonne prog...

    Christopher

  18. #18
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    Merci Christopher de ne pas me lâcher, il y aurait de quoi

    Regarde, j'ai donc placé EndDoc - ainsi que tu me le conseillais - hors de la boucle - également BeginDoc - et j'ai d'ailleurs mis ce "project" bien à part, sans autre code dessus afin que rien ne vienne interférer :

    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
    procedure TForm1.BtnPrintClick(Sender: TObject);
    var
      Y, X: Integer;
    begin
         Printer.BeginDoc;
     
          With Printer.Canvas do
      begin
        Font.Name := 'Courrier New';
        Font.Size:=12;
        TextOut(X,Y,'Texte que tu veux imprimer');
        // code à venir...
          end;
     
      EndDoc(22); // là je ne savais pas trop quoi ajouter, car il manquait des paramètres  ;o(
    end;
    (Au message d'erreur qui me disait qu'il manquait des paramètres, je lisais en bulle ceci : DC : HDC)

    En électronique j'aurais injecté un courant continu - DC - , mais là je suis pas trop à l'aide

    Le résultat tu vas me demander ?

    Hé bien idem, c'est à dire le plantage du pilote gestionnaire de ma printeuse.

    Je reboot ensuite, je vérifie sur une autre appli que ma printeuse refonctionne = ok et je tente sur cet essai = plantage idem pilote de ma printeuse.

    @+ si pas découragé lol

  19. #19
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Encore moi,

    J'avais oublié de mettre des valeurs aux variables X et Y :

    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 TForm1.BtnPrintClick(Sender: TObject);
    var
      Y, X: Integer;
    begin
    // Printer.BeginDoc;
            With Printer.Canvas do
      begin
         Printer.BeginDoc;
         X:=50;
         Y:=100;
     
        Font.Name := 'Courrier New';
        Font.Size:=12;
        TextOut(X,Y,'Texte que tu veux imprimer');
        // code à venir...
          end;
     
      EndDoc(22); // là je ne savais pas trop quoi ajouter, car il manquait des paramètres  ;o(
    end;
    Alors là ça ne plante plus tu tout

    Le printage commence et attend... et attend...

    Je quitte alors de mon appli et là le printage se termine OK !

    Reste à savoir ce que je dois ajouter à la fin du EndDoc

    @+

    =======================================
    En relisant, j'ai l'impression que l'on s'éloigne du sujet initial, à savoir comment réaliser un printage d'un morceau de papier de 10 cm de HAUTEUR par exemple, et non d'imprimer à une certaine distance d'une feuille A4 telle ou telle donnée en texte.

    Mais peut-être qu'il n'est pas nécessaire de "déclarer" la HAUTEUR d'une feuille à printer même si celle-ci est < à du A4 ?

    Sinon, autant faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    Printer.BeginDoc;
    Printer.Canvas.TextOut(50,25,'Salut !');
    Printer.EndDoc
    ...
    Enfin, il me semble.

    @+

  20. #20
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bonjour,

    Je cherche, je cherche... http://delphi.developpez.com/faq/?rechercher=imprimer+

    Sur DelphiKtop un site Chinois, je viens de trouver une véritable mine d'or !
    http://delphi.ktop.com.tw/topic.asp?TOPIC_ID=75503

    (Pour les formats standards http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_10237426.html )

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Device : array[0..255] of char;
    Driver : array[0..255] of char;
    Port : array[0..255] of char;
    hDMode : THandle;
    PDMode : PDEVMODE;
    begin
    Printer.PrinterIndex := Printer.PrinterIndex;
    Printer.GetPrinter(Device, Driver, Port, hDMode);
    if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin
     
    {Set to legal}
    pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
    pDMode^.dmPaperSize := DMPAPER_LEGAL;
     
    {Set to custom size}
    pDMode^.dmFields := pDMode^.dmFields or
    DM_PAPERSIZE or
    DM_PAPERWIDTH or
    DM_PAPERLENGTH;
    pDMode^.dmPaperSize := DMPAPER_USER;
    pDMode^.dmPaperWidth := 100 {SomeValueInTenthsOfAMillimeter};
    pDMode^.dmPaperLength := 100 {SomeValueInTenthsOfAMillimeter};
     
    {Set the bin to use}
    pDMode^.dmFields := pDMode^.dmFields or DMBIN_MANUAL;
    pDMode^.dmDefaultSource := DMBIN_MANUAL;
     
    GlobalUnlock(hDMode);
    end;
    end;
    Printer.PrinterIndex := Printer.PrinterIndex;
    Printer.BeginDoc;
    Printer.Canvas.TextOut(100,100, 'Test 1');
    Printer.EndDoc;
    end;
    Je n'ai pas tout bien saisi, mais à mon sens, la ligne suivante est assez intéressante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pDMode^.dmPaperSize := DMPAPER_LEGAL;
    Je précise que ce code fonctionne impec nichel chrôme.

    Je vais approfondir, qu'en pense les lecteurs de ce topic ?

    Reste justement à savoir comment donner des dimensions "spéciales" de hauteur, car pas de format "tout-fait" au millimètre près.

    Je remercie au passage sfpx qui nous avait présenté une méthode similaire.

    Merci de vos réfexions et idées

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Impression sans boite de dialogue
    Par lodizzz dans le forum VB.NET
    Réponses: 3
    Dernier message: 15/06/2012, 12h09
  2. Réponses: 6
    Dernier message: 06/11/2010, 07h34
  3. Réponses: 2
    Dernier message: 09/01/2007, 10h21
  4. Comment "sauver sous" sans boîte de dialogue ?
    Par CAMIC dans le forum VBA Access
    Réponses: 1
    Dernier message: 01/11/2006, 15h44
  5. Réponses: 1
    Dernier message: 08/12/2005, 10h14

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