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

Bases de données Delphi Discussion :

Comment réaliser un aperçu avant impression avec une table ?


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Comment réaliser un aperçu avant impression avec une table ?
    realiser un afichage et impression d'une table seulement avec les code de Dephi. je prend exemple de PreviewPrint du forum de Delphi faite sans Table.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Que veux-tu dire qu'avec du code Delphi ?
    Sans Quick Report ou Rave Report, directement en Canvas de TPrinter ? Si oui, tu as la réponse, il suffit d'utiliser le Canvas du Printer (fonction delphi), avec un GetDeviceCaps, tu peux récupérer les infos de l'imprimate (taille en inch à convertir en pixel ou mm), ensuite tu dessine sur le papier comme si tu dessinais à l'écran ...
    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

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Merci Comment realiser un apercu avant impression avec une table ?
    Merci pour votre renponse.
    Vous avez compris ma question. Avec le peu experience que j'ai en Delphi je demande l'aide, Je n'arrive pas utiliser canvas du printer avec table. Pour cela je cite exemple de previewPrint du forum dans delphi qui est fait sans une table pour completer mon probleme.

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Merci pour votre assistance.
    Citation Envoyé par ShaiLeTroll Voir le message
    Que veux-tu dire qu'avec du code Delphi ?
    Sans Quick Report ou Rave Report, directement en Canvas de TPrinter ? Si oui, tu as la réponse, il suffit d'utiliser le Canvas du Printer (fonction delphi), avec un GetDeviceCaps, tu peux récupérer les infos de l'imprimate (taille en inch à convertir en pixel ou mm), ensuite tu dessine sur le papier comme si tu dessinais à l'écran ...
    Merci pour votre renponse.
    Vous avez compris ma question. Avec le peu experience que j'ai en Delphi je demande l'aide, Je n'arrive pas utiliser canvas du printer avec table. Pour cela je cite exemple de previewPrint du forum dans delphi qui est fait sans une table pour completer mon probleme.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    En Fait, le Canvas, c'est une page vierge

    Tu peux obtenir la Taille de l'imprimante avec GetDeviceCaps (...) ...
    Ensuite, tu auras besoin de DrawText et DrawLine ...

    Pour la Table, c'est simple, tu la parcours, avec un First, while not EOF, Next, et tu dessine le Texte contenu dans les colonnes ...

    Sinon, tu peux aussi tricher, tu affiche dans un DBGrid, et il y a des sujets qui traite de l'impression de celui-ci !
    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

  6. #6
    Membre régulier
    Inscrit en
    Mai 2006
    Messages
    202
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 202
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    En Fait, le Canvas, c'est une page vierge

    Tu peux obtenir la Taille de l'imprimante avec GetDeviceCaps (...) ...
    Ensuite, tu auras besoin de DrawText et DrawLine ...

    Pour la Table, c'est simple, tu la parcours, avec un First, while not EOF, Next, et tu dessine le Texte contenu dans les colonnes ...
    !
    Salut,
    es ce qu'on peut avoir un petit exemple avec une table de deux champs. Cela nous aiderais beaucoup.

    merci d'avance

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Si J'ai le temps, je n'ai pas fait d'impression à la main depuis fort longtemps, je le faisais pour l'impression de listing de code barre, le composant que j'utilisais ne supportais pas Quick Report, et comme je n'ai plus le code (quoi que, peut-être, je vais fouiller sur un vieux CD)

    mais cela doit donner (uses Printers)

    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
    Y := 10;
     Printer.BeginDoc();
    Data.First();
    while not Data.EOF do
    begin
      Printer.Canvas.TextOut(10, Y, Data.FieldByName('Champ1').AsString;  
      Printer.Canvas.TextOut(Printer.PageWidth div 2, Y, Data.FieldByName('Champ2').AsString;  
      Inc(Y,  Printer.Canvas.TextHeight + 2);
      Printer.Canvas.MoveTo(10, Y);
      Printer.Canvas.LineTo(Printer.PageWidth - 10, Y);
      Inc(Y, 2);
     
      if Y > Printer.PageHeight then
      begin
        Printer.NewPage()
        Y := 10; 			
      end;  
     
      Data.Next();
    end;
     
     Printer.BeginDoc();
    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

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Merci pour example
    Je remet toujours ma demande d'aide a la visualisation avant impression d'une table seulement avec les code Delphi. Pour bien exprimer je joint les codes d'une impression que j'ai recupere dans le site developpez.com pour modification que je n'arrive pas a le faire.

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Oups, une erreur de copier coller dans mon Code

    à la fin, ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Printer.BeginDoc();
    mais
    Le Code que j'ai donné c'est pour de l'impression directement sans Visualisation !

    Un Preview, tu peux le faire en utilisant le Canvas d'un TPaintBox mais je me pose de questions sur le résultats (je crois que c'était moche), je me rappelle que j'avais calculé à l'époque toutes mes coordonnées en millimètres que je convertissais en Pixel (GetDeviceCaps HORZSIZE, VERTSIZE, LOGPIXELSX, LOGPIXELSY et une petite convertion 1 inch 263 = mm)

    Sinon, où est ce fameux exemple "PreviewPrint" (est ceux-là)
    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

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Oups, une erreur de copier coller dans mon Code

    à la fin, ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Printer.BeginDoc();
    mais
    Le Code que j'ai donné c'est pour de l'impression directement sans Visualisation !

    Un Preview, tu peux le faire en utilisant le Canvas d'un TPaintBox mais je me pose de questions sur le résultats (je crois que c'était moche), je me rappelle que j'avais calculé à l'époque toutes mes coordonnées en millimètres que je convertissais en Pixel (GetDeviceCaps HORZSIZE, VERTSIZE, LOGPIXELSX, LOGPIXELSY et une petite convertion 1 inch 263 = mm)

    Sinon, où est ce fameux exemple "PreviewPrint" (est ceux-là)
    Merci Messieur pour toute cette assistance.
    Ce fameux exemple "PreviewPrint" se refaire a votre lien precisement IMPRESSION API de Mr Jean-Luc Mellet (Alphomega) que je veux combiner l'episode 3 qui donne une page entete, details et pied de page sans la visualisation et l'episode 4 donne la visualisation sans la table. Cette combinaison donnera la visualisation et impression de la table. Je pourrais fournir la combinaison des codes en fichier attache ci neccessaire.

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    En Fait, dans l'Etape 3, il dessine directement sur le Printer

    tu dois à la place mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C := TMetaFileCanvas.Create(...);
    tu n'as pas grand chose à changer, c'est surtout qu'il faut que tu comprennes bien la différence entre le Canvas d'un Printer, et le Canvas Mémoire (MetaFileCanvas) ...

    En ce moment, j'ai du taf, mais si j'ai un créneau, j'essayerais de te donner un exemple, mais je pense qu'en étudiant tranquillement le code, tu vas piger la subtilité de la Liste de MetaFileCanvas ...
    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

  12. #12
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    En Fait, dans l'Etape 3, il dessine directement sur le Printer

    tu dois à la place mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C := TMetaFileCanvas.Create(...);
    tu n'as pas grand chose à changer, c'est surtout qu'il faut que tu comprennes bien la différence entre le Canvas d'un Printer, et le Canvas Mémoire (MetaFileCanvas) ...

    En ce moment, j'ai du taf, mais si j'ai un créneau, j'essayerais de te donner un exemple, mais je pense qu'en étudiant tranquillement le code, tu vas piger la subtilité de la Liste de MetaFileCanvas ...
    MERCI POUR VOTRE ASSISTANCE ET DES EXCUSES POUR MAUVAIS UTILISATION DE CETTE ESPACE.

    J'ai tout fais pour comprendre la difference entre canvas printer et canvas memoire(metafilecanvas) en modiffiant les deux episodes.

    Un exemple sera la bienvenue pour moi. je vous donne les codes de mes modifications. Mes difficulltes sont : insertion de l'entete de pages, le pied de pages, avoir le nombre de lignes details automatiquement a inserer dans le details et enfin une affichage correct a l'ecran.

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Printers, DB, DBTables, Grids, DBGrids, IdTrivialFTPBase,
      DBCtrls, ComCtrls;
     
    type
      TForm1 = class(TForm)
        imprimer: TButton;
        datas: TTable;
        Prv: TPaintBox;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        PrintDialog1: TPrintDialog;
        PrinterSetupDialog1: TPrinterSetupDialog;
        procedure ImprimeEnTete;
        procedure ImprimePiedPage ;
        procedure NouvellePage(RealNewPage: boolean);
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure PrvPaint(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure imprimerClick(Sender: TObject);
     
      private
        { Déclarations privées }
        LPages : TList;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      Entete, Details, PiedPage: TRect; {pour connaître les limites des zones respectives}
      YCurr: integer; {La position en cours pour l'écriture d'une ligne}
      C: TCanvas; {Notre canvas pour imprimer}
      Li, CColonne : integer; {nombre de lignes imprimées }
      Dx, Dy: integer; {Décalage par rapport aux marges}
      NPage: word = 0;  {Le numéro de page à incrémenter à chaque nouvelle page}
      TotalPages: word = 0;  {Le nombre de pages à imprimer. Pour afficher Page x / TotalPages }
    implementation
     
    function Millimetres2PixelsX(Millims: integer): integer;
    begin
     result := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSX), 10 * Millims, 254);
    end;
     
    function Millimetres2PixelsY(Millims: integer): integer;
    begin
     result := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSY), 10 * Millims, 254);
    end;
     
    {$R *.dfm}
     
    procedure DefFonte(F: TFont; Nom: string; Taille: integer; Styl: TFontStyles);
    begin
     with F do begin
       Name := Nom;
       Size := Taille;
       Style := Styl;
      end;
    end;
     
    procedure TForm1.ImprimeEnTete;
    var
     S: string;
    begin
     {On dessine l'entourage (si on le désire)}
     
     C.Rectangle(Entete);
     DefFonte(C.Font, 'Arial', 10, []);
    { Ecriture de la date en haut à gauche en n'oubliant pas les }
    { décalages par rapport aux marges }
    { Vous remarquerez que l'on aurait aussi pu utiliser DrawText avec DT_LEFT or DT_VTOP}
     C.TextOut(Entete.Left + Dx, Entete.top + Dy, DateToStr(now));
    {Notre page en cours}
     S := format('Page %d / %d', [NPage, TotalPages]);
     C.TextOut(Entete.Right - C.TextWidth(S) - Dx, Entete.top + Dy, S);
    {Enfin, centré au milieu de notre rectangle d'en-tète le nom de la table}
     DefFonte(C.Font, 'Times New Roman', 10, []);
     DrawText(C.handle, PChar(Datas.TableName), length(Datas.tablename),
                Entete, DT_VCENTER or DT_SINGLELINE or DT_CENTER);
     {On dessine si on le désire un entourage autour de la zone Détails}
     C.Rectangle(Details);
    end;
     
    procedure TForm1.ImprimePiedPage;
    var
     S: string;
    begin
     C.Rectangle(PiedPage);
     DefFonte(C.Font, 'Arial', 10, []);
     S := format('%d lignes imprimées sur un total de %d', [Li, Datas.RecordCount]);
     DrawText(C.handle, PChar(S), length(S), PiedPage, DT_VCENTER or DT_SINGLELINE or DT_CENTER);
    end;
     
    procedure TForm1.NouvellePage(RealNewPage: boolean);
    begin
     if RealNewPage then Printer.NewPage;
     Inc(NPage);
    // ImprimeEnTete;
     YCurr := Details.Top + Dy;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
     I, y, P: integer;
     R: TRect;
     T : Array of integer;
     S: string;
     Bm : TBookmark;
     Bl : Boolean;
     LignesParPage : Word;
    begin
      Li :=0; {initialisation du nombre de lignes imprimee}
      LPages := TList.Create;
      Dx := Millimetres2PixelsX(2);
      Dy := Millimetres2PixelsY(2);
      P := GetDeviceCaps(Printer.handle, LOGPIXELSX);
     
     LignesParPage := 48;
     {Le nombre de pages sera calcule en divisant le nombre total de lignes par LignesParPage}
     TotalPages := Datas.RecordCount Div LignesParPage;
     {Attention: on doit egalement verifier si les pages seront completes.}
     {avec mod on peut voir s'il nous restera des lignes a imprimer en fin de document}
     Bl := (Datas.RecordCount Mod LignesParPage) <> 0;
     {Si on obtient un reste, il nous faut ajouter une page}
     If Bl then inc(TotalPages);
     
     {Hauteur de l'en-tète = 10% de la hauteur totale}
     Entete := Rect(0, 0, Printer.PageWidth, muldiv(Printer.PageHeight, 10, 100));
     {Hauteur du pied de page = 5% de la hauteur totale}
     PiedPage := Rect(0, Printer.PageHeight - muldiv(Printer.PageHeight, 5, 100), Printer.PageWidth, Printer.PageHeight);
     
     NPage := 0;
     {Le parametre de nouvellePage est false, car la page est deja creee par BeginDoc}
     NouvellePage(false);
     
     for I := 0 to TotalPages-1 do begin
       LPages.add(TMetafile.Create);
       with TMetafile(LPages[I]) do begin
         Width := Printer.PageWidth;
         Height := Printer.PageHeight;
       end;
     end;
     With datas do begin
       CColonne :=1000; //CColonne
       Li :=500; // Ligne
     //  Printer.BeginDoc();
       DAtas.First();
       while not Eof do begin
         for I := 0 to TotalPages-1 do begin
           with TMetafileCanvas.Create(TMetafile(Lpages[i]),0) Do begin
            //ImprimeEnTete;
             For y := 0 to LignesParpage do begin
               Font.PixelsPerInch := P;
               Font.Size := 10;
               TextOut(Li , CColonne, Datas.FieldByName('payroll').AsString);
               TextOut(Printer.PageWidth div 6, CColonne, Datas.FieldByName('Nom').AsString);
               TextOut(Printer.PageWidth div 3, CColonne, Datas.FieldByName('Prenoms').AsString);
     
               Inc(CColonne,  Printer.Canvas.TextHeight(Datas.FieldByName('payroll').AsString)+10);
               MoveTo(500, CColonne);
               LineTo(Printer.PageWidth, CColonne);
     
               Inc(CColonne, 15);
     
               Font.Size := 22;
               R:= Rect(9, 9, Printer.PageWidth, Printer.PageHeight);
               DrawText(Handle, Pchar(s), length(s), R, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
               if Y = LignesParpage then begin
                 Free;
                 CColonne := 1000;
               end;
               Li :=500; // Ligne
               IF Eof then
                 begin
                   Free;
                   Break;
                 end
                 Else Datas.Next;
             end;
           end;
         end;
       End;
     //  Printer.EndDoc();
     end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     if Prv.tag > 0 then
      begin
       Prv.tag := Prv.tag - 1;
       Prv.refresh;
      end
     else ShowMessage('Vos êtes sur la première page visible');
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
     if Prv.tag < LPages.Count - 1 then
       begin
         Prv.tag := Prv.tag + 1;
         Prv.refresh;
       end
     else ShowMessage('Vos êtes sur la dernière page visible');
    end;
    procedure TForm1.PrvPaint(Sender: TObject);
    var M: TMetafile;
    begin
      if LPages.Count > 0 then begin
        Prv.Canvas.Brush.Color := clWhite;
        M := TMetafile(LPages[Prv.tag]);
        Prv.Canvas.FillRect(Rect(0, 0, M.width, M.height));
        Prv.canvas.StretchDraw(Rect(0, 0, Prv.width, Prv.Height), M);
      end;
    end;
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      while LPages.Count > 0 do begin
        Dispose(LPages[0]);
        LPages.Delete(0);
      end;
      LPages.Free;
    end;
    procedure TForm1.imprimerClick(Sender: TObject);
    Var I : Integer;
    begin
      with Printer, Canvas do begin
        BeginDoc;
        for I := 0 to TotalPages-1 do begin
          Draw(0, 0, TMetafile(LPages[I]));
          NewPage;
        end;
        EndDoc;
      End;
    end;
    end.

  13. #13
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Si j'ai un peu de temps, j'essayerais de corriger mais déjà

    C n'est pas alloué ! donc tout code qui y fait référerence est obselète

    essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      C := TMetafileCanvas.Create(TMetafile(Lpages[i]),0);
      with C Do begin
            ImprimeEnTete;
    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

  14. #14
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Je demande vraiment de l'aide. Je nouri l'espoir depuis bientot un an de realiser et
    Citation Envoyé par ShaiLeTroll Voir le message
    Si j'ai un peu de temps, j'essayerais de corriger mais déjà

    C n'est pas alloué ! donc tout code qui y fait référerence est obselète

    essaye

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      C := TMetafileCanvas.Create(TMetafile(Lpages[i]),0);
      with C Do begin
            ImprimeEnTete;
    Je demande vraiment de l'aide. Je nouri l'espoir depuis bientot un an de realiser et intergrer cette procedure dans mon projet.

    J'ai insere les instructions selon vos conseils et j'ai un message d'erreur "hors limite". Voici la partie de l'instruction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      TMetafileCanvas.Create(TMetafile(Lpages[TotalPages]),0);
      for I := 0 to TotalPages-1 do begin
        with TMetafileCanvas.Create(TMetafile(Lpages[i]),0) do begin
            Width := Printer.PageWidth;
            Height := Printer.PageHeight;
         end;
      end;
    Au bessoin, voici toute les procedures.
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
     
    unit Unit11;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Printers, DB, DBTables, Grids, DBGrids, IdTrivialFTPBase,
      DBCtrls, ComCtrls;
     
    type
      TForm11 = class(TForm)
        imprimer: TButton;
        datas: TTable;
        Prv: TPaintBox;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        PrintDialog1: TPrintDialog;
        PrinterSetupDialog1: TPrinterSetupDialog;
        procedure ImprimeEnTete;
        procedure ImprimePiedPage ;
        procedure NouvellePage(RealNewPage: boolean);
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure PrvPaint(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure imprimerClick(Sender: TObject);
     
      private
        { Déclarations privées }
        LPages : TList;
      public
        { Déclarations publiques }
      end;
     
    var
      Form11: TForm11;
      Entete, Details, PiedPage: TRect; {pour connaître les limites des zones respectives}
      YCurr: integer; {La position en cours pour l'écriture d'une ligne}
      C: TCanvas; {Notre canvas pour imprimer}
      Li, CColonne : integer; {nombre de lignes imprimées }
      Dx, Dy: integer; {Décalage par rapport aux marges}
      NPage: word = 0;  {Le numéro de page à incrémenter à chaque nouvelle page}
      TotalPages: word = 0;  {Le nombre de pages à imprimer. Pour afficher Page x / TotalPages }
    implementation
     
    function Millimetres2PixelsX(Millims: integer): integer;
    begin
     result := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSX), 10 * Millims, 254);
    end;
     
    function Millimetres2PixelsY(Millims: integer): integer;
    begin
     result := MulDiv(GetDeviceCaps(Printer.Handle, LOGPIXELSY), 10 * Millims, 254);
    end;
     
    {$R *.dfm}
     
    procedure DefFonte(F: TFont; Nom: string; Taille: integer; Styl: TFontStyles);
    begin
     with F do begin
       Name := Nom;
       Size := Taille;
       Style := Styl;
      end;
    end;
     
    procedure TForm11.ImprimeEnTete;
    var
     S: string;
    begin
     {On dessine l'entourage (si on le désire)}
     
     C.Rectangle(Entete);
     DefFonte(C.Font, 'Arial', 10, []);
    { Ecriture de la date en haut à gauche en n'oubliant pas les }
    { décalages par rapport aux marges }
    { Vous remarquerez que l'on aurait aussi pu utiliser DrawText avec DT_LEFT or DT_VTOP}
     C.TextOut(Entete.Left + Dx, Entete.top + Dy, DateToStr(now));
    {Notre page en cours}
     S := format('Page %d / %d', [NPage, TotalPages]);
     C.TextOut(Entete.Right - C.TextWidth(S) - Dx, Entete.top + Dy, S);
    {Enfin, centré au milieu de notre rectangle d'en-tète le nom de la table}
     DefFonte(C.Font, 'Times New Roman', 10, []);
     DrawText(C.handle, PChar(Datas.TableName), length(Datas.tablename),
                Entete, DT_VCENTER or DT_SINGLELINE or DT_CENTER);
     {On dessine si on le désire un entourage autour de la zone Détails}
     C.Rectangle(Details);
    end;
     
    procedure TForm11.ImprimePiedPage;
    var
     S: string;
    begin
     C.Rectangle(PiedPage);
     DefFonte(C.Font, 'Arial', 10, []);
     S := format('%d lignes imprimées sur un total de %d', [Li, Datas.RecordCount]);
     DrawText(C.handle, PChar(S), length(S), PiedPage, DT_VCENTER or DT_SINGLELINE or DT_CENTER);
    end;
     
    procedure TForm11.NouvellePage(RealNewPage: boolean);
    begin
     if RealNewPage then Printer.NewPage;
     Inc(NPage);
     ImprimeEnTete;
     YCurr := Details.Top + Dy;
    end;
     
    procedure TForm11.FormCreate(Sender: TObject);
    var
     i, y, hm, P: integer;
     
     R: TRect;
     T : Array of integer;
     S: string;
     Bm : TBookmark;
     Bl : Boolean;
     LignesParPage : Word;
    begin
      Li :=0; {initialisation du nombre de lignes imprimee}
      I :=0;
      LPages := TList.Create;
      Dx := Millimetres2PixelsX(2);
      Dy := Millimetres2PixelsY(2);
      P := GetDeviceCaps(Printer.handle, LOGPIXELSX);
    // -----------------------------------------------------
     
      {Hauteur de l'en-tète = 10% de la hauteur totale}
      Entete := Rect(0, 0, Printer.PageWidth, muldiv(Printer.PageHeight, 10, 100));
      {Hauteur du pied de page = 5% de la hauteur totale}
      PiedPage := Rect(0, Printer.PageHeight - muldiv(Printer.PageHeight, 5, 100), Printer.PageWidth, Printer.PageHeight);
     
      with Details do begin
         Left := 0;
         Right := Printer.PageWidth;
         {Haut de la zone détails à 10 mm sous le bas de l'en-tète}
         Top := EnTete.bottom + Millimetres2PixelsY(10);
         {Bas de la zone détails à 5 mm au-dessus du haut du pied de page}
         Bottom := PiedPage.Top - Millimetres2PixelsY(5);
      end;
      C := Printer.Canvas;
      //Calcul du nombre de ligne par page, et ainsi du nombre de page
      DefFonte(C.Font, 'Arial', 11, []);
     
      Hm := C.TextHeight('M');     {On calcule la hauteur d une ligne en pixels}
      {On peut ainsi calculer le nombre de lignes que peut contenir la zone Details}
     
      LignesParPage := (Details.Bottom - Details.Top - Dy) div HM;
      {Le nombre de pages sera calculé en divisant le nombre total de lignes par LignesParPage}
     
      TotalPages := Datas.RecordCount div LignesParPage;
      {ATTENTION: on doit également vérifier si les pages seront complètes.}
      { Avec mod on peut voir s'il nous restera des lignes à imprimer en fin de document}
      Bl := (Datas.RecordCount mod LignesParPage) <> 0;
      {Si on obtient un reste, il nout faut ajouter une page}
      if BL then inc(TotalPages);
     
      {Prenons un exemple! Si la zone Details peut contenir 35 lignes et si nous avons }
      {42 lignes à imprimer, nous aurons les valeurs suivantes: }
      {TotalPages := 42 div 35; Donc  TotalPages  =  1 (1 page de 35 lignes)
      {Bl := (42 mod 35) <> 0 ;  Donc  true puisque 42 mod 35 = 7.
      {Ainsi, nous avons défini que nous aurons 1 page complète de 35 lignes et une page }
      {incomplète de 7 lignes}
      {Utilisons le nombre de colonnes de la DBGrid pour définir nos colonnes sur la sortie imprimée}
      {Bien sur, cela n'est valable que si vous avez un nombre raisonnable de colonnes.}
      {La table utilisée dans l'exemple s'y prète bien.
      {Dans un autre cas, vous serez obligé de définir quelles colonnes vous voulez imprimer}
     
      TMetafileCanvas.Create(TMetafile(Lpages[TotalPages]),0);
      for I := 0 to TotalPages-1 do begin
        with TMetafileCanvas.Create(TMetafile(Lpages[i]),0) do begin
            Width := Printer.PageWidth;
            Height := Printer.PageHeight;
         end;
      end;
      showmessage(intTOstr(width));
      NPage := 0;
      {Le paramètre de NouvellePage est false, car la page est déjà créée par BeginDoc}
      NouvellePage(false);
     // ------------------------------------------------------
     
      With datas do begin
        Bm := GetBookmark;
        DisableControls;
        DAtas.First();
        while not Eof do begin
          for I := 0 to TotalPages-1 do begin
          showmessage(intTOstr(i));
             with TMetafileCanvas.Create(TMetafile(Lpages[i]),0) Do begin
      //         C.TextOut(dx , YCurr, Datas.FieldByName('payroll').AsString);
     //          C.TextOut(Printer.PageWidth div 6, CColonne, Datas.FieldByName('Nom').AsString);
     //          C.TextOut(Printer.PageWidth div 3, CColonne, Datas.FieldByName('Prenoms').AsString);
     
     //          Inc(CColonne,  Printer.Canvas.TextHeight(Datas.FieldByName('payroll').AsString)+10);
     //          C.MoveTo(500, CColonne);
     //          C.LineTo(Printer.PageWidth, CColonne);
     
               Inc(CColonne, 15);
     
               datas.next;
               yCurr := YCurr + hm;
               If YCurr > (Details.Bottom - HM) Then
                 Begin
                   ImprimePiedPage;
                   NouvellePage(True);
                 End;
               If Bl Then ImprimePiedPage;
               GotoBookmark(bm);
               FreeBookmark(bm);
               EnableControls;
             End;
          End;
       End;
     end;
    end;
     
    procedure TForm11.Button1Click(Sender: TObject);
    begin
     if Prv.tag > 0 then
      begin
       Prv.tag := Prv.tag - 1;
       Prv.refresh;
      end
     else ShowMessage('Vos êtes sur la première page visible');
    end;
     
    procedure TForm11.Button2Click(Sender: TObject);
    begin
     if Prv.tag < LPages.Count - 1 then
       begin
         Prv.tag := Prv.tag + 1;
         Prv.refresh;
       end
     else ShowMessage('Vos êtes sur la dernière page visible');
    end;
    procedure TForm11.PrvPaint(Sender: TObject);
    var M: TMetafile;
    begin
      if LPages.Count > 0 then begin
        Prv.Canvas.Brush.Color := clWhite;
        M := TMetafile(LPages[Prv.tag]);
        Prv.Canvas.FillRect(Rect(0, 0, M.width, M.height));
        Prv.canvas.StretchDraw(Rect(0, 0, Prv.width, Prv.Height), M);
      end;
    end;
    procedure TForm11.FormDestroy(Sender: TObject);
    begin
      while LPages.Count > 0 do begin
        Dispose(LPages[0]);
        LPages.Delete(0);
      end;
      LPages.Free;
    end;
    procedure TForm11.imprimerClick(Sender: TObject);
    Var I : Integer;
    begin
      with Printer, Canvas do begin
        BeginDoc;
        for I := 0 to TotalPages-1 do begin
          Draw(0, 0, TMetafile(LPages[I]));
          NewPage;
        end;
        EndDoc;
      End;
    end;
    end.

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

Discussions similaires

  1. Comment faire un aperçu avant impression
    Par botti2007 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 19/12/2010, 10h08
  2. Réponses: 0
    Dernier message: 24/09/2007, 13h30
  3. Aperçu avant impression avec TChart
    Par vitch8 dans le forum Delphi
    Réponses: 3
    Dernier message: 27/03/2007, 18h38
  4. Comment faire un aperçu avant impression (D7PRO)?
    Par tipiweb dans le forum Langage
    Réponses: 2
    Dernier message: 13/03/2006, 23h30

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