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 :

[Lazarus 0.9.22/WinXP] Imprimer avec TPrintDlg plus d'une page


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut [Lazarus 0.9.22/WinXP] Imprimer avec TPrintDlg plus d'une page
    Bonjour à tous,

    j'ai une fonction qui me permet d'imprimer le contenu de plusieurs listbox mais le problème c'est que je n'arrive a imprimer q'une page balgré que ma boucle contient tout les éléments, une seule page sort de l'imprimante.

    Le composant TPrinterDlg a une propriété PrintRange qui est par défaut a prAllPages, je l'ai également initialisée au début de ma boucle mais rien y fait.
    Voici mon code :
    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
    var
      Line,H : integer;
      MyPrinter: TPrinter;
      test : integer;
    begin
      if PrintDialog1.Execute then
      begin
        MyPrinter := Printer;
        MyPrinter.BeginDoc;
        MyPrinter.Canvas.Font.Name := 'Arial';
        MyPrinter.Canvas.Font.Size := 7;
        H := MyPrinter.Canvas.TextHeight('Gg') + 2;
        test :=  Listbox1.Items.Count-1;
        for Line := 0 to test do
        begin
          MyPrinter.Canvas.TextOut(25, 25 + Line * H, ListBox1.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(250, 25 + Line * H, ListBox2.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(2000, 25 + Line * H, ListBox3.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(2300, 25 + Line * H, ListBox4.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(3300, 25 + Line * H, ListBox5.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(3600, 25 + Line * H, ListBox6.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(4400, 25 + Line * H, ListBox7.Items.Strings[Line]);
        end;
        MyPrinter.EndDoc;
      end;
    end;
    Voilà, si vous avez une idée de quelle propriété se cache derière ce "bloquage"

    Encore une chose : J'ai regardé du côté de Tprinters et il y a une propriété PageNumber qui est toujours à 1. Elle est déclarée en Private dans le compostant alors pas possible d'influencer dessus.

    Encore merci pour l'énergie de ce forum et à très vite !

    inc002

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hio,

    L'impression multi-pages requiert un peu plus d'efforts de la part du programmeur.

    Il faut que tu calcules le nombres de lignes que tu peux mettre par page (sans oublier la taille des éventuels en-tête, pied de page), et que pour chaque page, tu dises à l'imprimante "page terminée, on va à la suivante" (désolé, je ne me souviens plus de ce qu'il faut envoyer pour faire ça. )

    Pour calculer le nombre de lignes par page, il faut récupérer les caractéristiques de l'imprimante, et calculer avec la hauteur d'une ligne que tu vas écrire (ton "H"), sans oublier de laisser un interligne suffisant.

    En clair, tu es sur le bon chemin, mais il faut en faut un peu plus.

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Vois du côté de la méthode NewPage ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 39
    Par défaut
    Justement...

    Je l'ai trouvée avant de lire ce post et j'ai imaginé quelque chose dans ce style... Pour essayer mais sans succès, serai-ce la bonne piste ? Parce que au niveau du résultat, j'ai le nb de pages voulu qui sont mais la seconde imprime que 2 ligen en bas de page et les autres sont vierges...
    99 est le monbre de ligen que j'ai par page

    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
    procedure TForm2.Button1Click(Sender: TObject);
    var
      Line,H : integer;
      MyPrinter: TPrinter;
      compteur,compteur2,i : integer;
    begin
      if PrintDialog1.Execute then
      begin
        i:=0;
        compteur2:=0;
        Compteur := 0;
     
        MyPrinter := Printer;
        MyPrinter.BeginDoc;
        MyPrinter.Canvas.Font.Name := 'Arial';
        MyPrinter.Canvas.Font.Size := 7;
     
        H := MyPrinter.Canvas.TextHeight('Gg') + 2;
     
        PrintDialog1.PrintRange := prAllPages ;
        for Line := 0 to Listbox8.Items.Count-1 do
        begin
          inc(Compteur);
          if (Compteur = 99) OR (Compteur = 198) OR (Compteur = 297) OR (Compteur = 396) OR (Compteur = 495)then
            MyPrinter.NewPage;
          MyPrinter.Canvas.TextOut(25, 25 + Line * H, ListBox8.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(250, 25 + Line * H, ListBox2.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(2000, 25 + Line * H, ListBox3.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(2300, 25 + Line * H, ListBox4.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(3300, 25 + Line * H, ListBox5.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(3600, 25 + Line * H, ListBox6.Items.Strings[Line]);
          MyPrinter.Canvas.TextOut(4400, 25 + Line * H, ListBox7.Items.Strings[Line]);
        end;
     
     {   for i := i to Compteur2 do    cette boucle est un autre essai
          MyPrinter.NewPage; }        mais imprime que des pages blanches à la fin
     
        MyPrinter.EndDoc;
      end;
    end;
    Voilà si ca peut servir à autrui en plus

    Merci encore

  5. #5
    Membre chevronné

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Par défaut
    Ne penses-tu pas qu'au delà d'une certaine valeur pour line, tu sois hors canvas, tout simplement?
    Autrement dit debuggue et surveille tes valeurs successives pour 25+line*h

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hio,
    Citation Envoyé par Clandestino
    Ne penses-tu pas qu'au delà d'une certaine valeur pour line, tu sois hors canvas, tout simplement?
    Autrement dit debuggue et surveille tes valeurs successives pour 25+line*h
    +1,

    Et les sauts de page avec des valeurs absolues pour le nombre de lignes par page, pas beau, ni bon, du tout.

    Il faut calculer le nombre de lignes par page, en fonction de la hauteur d'une ligne (ton "H").
    De là, le nombre de pages.

    Puis 2 boucles imbriquées:
    - sur le nombre de pages
    - pour une page, sur le nombre de lignes que contient cette page (attention pour la dernière page, qui ne sera probablement pas pleine).

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

Discussions similaires

  1. [Débutant] imprimer un control sur toute une page A4 avec print dialog
    Par Anthony_C dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 16/06/2014, 11h00
  2. [W3C] Probleme avec un pdf dans une page
    Par mael94420 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 14/09/2006, 11h09
  3. Réponses: 3
    Dernier message: 24/08/2006, 23h24
  4. Imprimer un tableau présent dans une page php
    Par griese dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/07/2006, 09h08
  5. problèmes avec "include file" pour une page asp
    Par chipsense dans le forum ASP
    Réponses: 1
    Dernier message: 02/09/2005, 15h22

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