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.
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.
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
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.
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.
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
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
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.
Oups, une erreur de copier coller dans mon Code
à la fin, ce n'est pas
mais
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Printer.BeginDoc();
Le Code que j'ai donné c'est pour de l'impression directement sans Visualisation !
Code : Sélectionner tout - Visualiser dans une fenêtre à part Printer.EndDoc();
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
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.
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 := Printer.Canvas;
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) ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part C := TMetaFileCanvas.Create(...);
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
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.
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
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.
Au bessoin, voici toute les procedures.
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;
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager