Hoooo, merci beaucoup, je m'en vais essayer ça ce soir, c'est plus que ce que je demandais, enfin que j'avais osé demander !
Sinon pas trop horrifié par mes codes ?
Encore merci
Pierre
Hoooo, merci beaucoup, je m'en vais essayer ça ce soir, c'est plus que ce que je demandais, enfin que j'avais osé demander !
Sinon pas trop horrifié par mes codes ?
Encore merci
Pierre
Pas de problème, ce n'était qu'une suggestion.
A bientôt,
Phil
nos messages se sont croisés, car je m'obstine ....
bon je dois etre stupide ou je ne sais quoi, mais ça marche pas ....
j'ai fais
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 Police = Final_datas.Lab_str_displ_max.Font HauteurLigne = Police.GetHeight(e.Graphics) Ligne = Final_datas.Lab_str_displ_max.Text Position = New PointF(50, 975) '''' Ceci correspond aux valeurs Left et Top que tu utilises Rectangle.Location = Position If Position.Y + HauteurLigne > e.MarginBounds.Height Then e.HasMorePages = True Exit Sub Else e.HasMorePages = False End If e.Graphics.DrawString(Final_datas.Lab_str_displ_max.Text, Final_datas.Lab_str_displ_max.Font, Brushes.Black, Rectangle) Police = Final_datas.Lab_str_displ_max.Font HauteurLigne = Police.GetHeight(e.Graphics) Ligne = Final_datas.Lab_str_displ_max.Text Position = New PointF(50, 50) '''' Ceci correspond aux valeurs Left et Top que tu utilises Rectangle.Location = Position If Position.Y + HauteurLigne > e.MarginBounds.Height Then e.HasMorePages = True Exit Sub Else e.HasMorePages = False End If e.Graphics.DrawString(Final_datas.Lab_str_displ_max.Text, Final_datas.Lab_str_displ_max.Font, Brushes.Black, Rectangle)
donc il voit que le nbre de ligne dépasse le nbre de ligne par page, il lance hasmorepage, et ensuite dans la page suivante je lui remet la derniere data avec la nouvelle position, mais le programme me lance des pages a n'en plus finir avec tjrs l'impression de la première page, pour info je regarde la valeur de marginbounds elle est de 965.
Nos messages de 15h31 se sont croisés
Nous pouvons utilisez les 2 modes d'impressions dans un premier temps.
Dans final_datas.vb, le PrintPreviewToolStripMenuItem_Click permet le Preview qui permet (par son bouton) d'imprimer avec PrintDocument1_PrintPage.
Dans final_datas.vb, le PrintToolStripMenuItem_Click peut être réutilisé comme ceci :
Bien entendu, dans impression.vb, tu dois écrire la procédure Friend Sub ImprimeAvecWord().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Private Sub PrintToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PrintToolStripMenuItem.Click impression.ImprimeAvecWord() End Sub
Voici cette procédure :
Et bien entendu, dans impression.vb, tu écris la procédure Private Sub GoToWord().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Friend Sub ImprimeAvecWord() GoToWord() End Sub
Dans cette procédure, comme dans celle que je t'ai envoyée, ça commence comme ceci :
Quand tu auras démarré cette programmation, si tu as des difficultés, envoye-moi le code de impression.vb et ton doc de base, que je puisse tester ...
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 Private Sub GoToWord() Dim WAPP As New Microsoft.Office.Interop.Word.Application Dim UnDoc As New Microsoft.Office.Interop.Word.Document Dim Table As Microsoft.Office.Interop.Word.Table ' Travailler avec un double (FImpresion) du fichier pour ne pas modifier l'original Dim Punto As Integer Punto = ArchivoPrimeroParaImpresion.LastIndexOf(".") ''' Je vois que j'ai oublié de traduire quelques détails ... :D))) Dim FImpresion As String = ArchivoPrimeroParaImpresion.Substring(0, Punto) & "_" & Trim(Now.Millisecond) & ".Docx" System.IO.File.Copy(ArchivoPrimeroParaImpresion, FImpresion) ' Ouvrir le fichier FImpresion et traiter UnDoc = WAPP.Documents.Open(FImpresion) WAPP.Visible = True ' *** Remplir le document (exemple) Table = UnDoc.Tables(1) ' Les tables sont indiciées de 1 à N, si N tables ' Dans une table, les données accédées par les indices des lignes et des colonnes : ' Table.Cell(Ligne, Colonne).Range.Text = ... ' Ligne de 1 à N lignes et Colonne de 1 à N colonnes ' Si une seule cellule, c'est en ligne 1 et colonne 1 Table.Cell(1, 1).Range.Text = ... ... ... selon ce que tu dois écrire, par exemple : TableAImprimer(0).Texte ... ... ...
...![]()
Ça avance, lentement, mais avance, le code est intégré et je n'ai plus de message d'erreur, la page word est créé, et je n'arrive à remplir que les 2 tables d'une seule cellule que j'ai créé, je n'arrive pas à remplir le tableau, il ne plante pas mais ne remplit pas non plus !?
.......
Je crois savoir ou je m.....e, je suis parti de ton exemple avec le datagrid, alors que je devrais partir de TableAImprimer(…).Texte seulement je n'ai pas la moindre idée ou la trouver ????
Bonjour,
Cette ligne de code e.Graphics.DrawString(Final_datas.Lab_str_displ_max.Text, Final_datas.Lab_str_displ_max.Font, Brushes.Black, Rectangle) ne correspond pas du tout à ce qu'il faut, vois dans mon code, cela doit êtreCertes, cela ne change pas grand chose, sauf qu'avec toujours la même ligne d'impression, ça évite des erreurs (et puis pour la suite, on pourra peut-être la mettre dans une boucle).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 e.Graphics.DrawString(Ligne, Police, Brushes.Black, Rectangle)
Par ailleurs, et c'est là ton problème actuel, lorsque tu as produit un saut de page en forçant une position au-delà de la limite supportée, tu refais une impression en 50,50 (bonne idée en première approche) mais comme je te l'ai signalé, le HasMorePage = True + Exit Sub provoque la relance de la procédure. Cette procédure recommence à sa première ligne de code, réimprime tout ce que tu as demandé jusque là, arrive à l'impression forcée au-delà de la limite supportée, recommence le saut de page, recommence à sa première ligne de code, ..., ..., ...
A toi d'imaginer le mécanisme qui va te permettre de relancer _PrintPage, en continuant l'impression au début d'un nouvelle page, sans ré-imprimer ce qui l'a déjà été. C'est pas gagné vu ton organisation "séquentielle" de tes données à imprimer ...Tout fonctionnera impeccablement tant que tu ne produis pas de saut de page. Lorsque se produira un saut de page, les positions Top de tes zones d’impression devront être « remises à 0 ». Comprends bien que si tu demandes une impression en position 1000 (par exemple) et que cela produit un saut de page, tu dois remettre ta zone d’impression en haut de la nouvelle page. Il faut dire que ton approche de « reproduction sur papier » (ou presque) de l'écran, ne facilite guère la gestion des sauts de pages. Mais d’un autre côté, puisque tu es capable de calculer la position que chaque zone sur la page, tu dois pouvoir aussi calculer quand tu veux passer à la page et où imprimer dans ce cas.
J'ai une idée d'algorithme qui pourrait te convenir, je le peaufine et je te l'envoie tout à l'heure ...![]()
Peut-être une bonne solution ...
Voici TOUT le code de la classe impression.vb (sauf ce que tu dois compléter dans la procédure PrepareImpression().
L'algorithme consiste à remplir une table avec tout le nécessaire à l'impression et relire cette table à l'aide d'une boucle (==> une seule ligne DrawString) dans la procédure _PrintPage.
Le remplissage de cette table se fait dans PrepareImpression() et c'est ce que tu dois compléter (j'ai écrit les 4 premières données d'impression à titre d'exemple).
Les valeurs de Y sont toujours des valeurs relatives à l'impression précédente, hauteur de ligne comprise (un Y de 0 implique un rectangle d'impressionsur la même ligne que le précédent). Sans doute qu'il faudra plusieurs essais pour définir ces valeurs de Y, (il me faudra sûrement affiner la calcul du Y effectif, calcul de PositionYPrec dans le code).
Je suis intéressé que tu remplisses toute la table avec toutes ces valeurs que tu as dans _PrintPage. En principe tu peux garder toutes tes valeurs X et pour les Y, il ne faut prendre que les différences d'une impression à l'autre.
Je reprendrai ensuite tout le code (de impression.vb) pour tester.
Dans un premier temps, il ne faut tracer aucune ligne ni imprimer aucune image (on verra cela ensuite), rien que les libellés et les données.
Penses à faire une copie de TA classe impression avant de coller 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
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 Public Class impression Private Structure DonneePourImpression Dim Texte As String ' le texte à imprimer Dim Police As Font ' sa police Dim Valeur_X_Rect As Single ' Position LEFT du rectangle d'impression par rapport à la marge Dim Valeur_Y_RelativePrec As Single ' Position TOP du rectangle d'impression par rapport aux impressions précédentes End Structure Dim MaxIndideImpression As Integer = 200 ' Si 200 pas suffisant, augmenter !!! Dim TableAImprimer(MaxIndideImpression) As DonneePourImpression Private Sub PrepareImpression() For i As Integer = 0 To MaxIndideImpression TableAImprimer(i).Texte = String.Empty ' Initialisation indispensable car la valeur Empty sert au contrôle de la boucle d'impression Next TableAImprimer(0).Texte = Final_datas.lb_well_name.Text TableAImprimer(0).Police = Final_datas.lb_well_name.Font TableAImprimer(0).Valeur_X_Rect = 50 '50 unités à droite de la 1ère position possible TableAImprimer(0).Valeur_Y_RelativePrec = 50 '50 unités en dessous de la 1ère position possible TableAImprimer(1).Texte = Final_datas.Lb_date.Text TableAImprimer(1).Police = Final_datas.Lb_date.Font TableAImprimer(1).Valeur_X_Rect = 500 '500 unités à droite de la 1ère position possible TableAImprimer(1).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(2).Texte = Form1.Label19.Text TableAImprimer(2).Police = Form1.Label19.Font TableAImprimer(2).Valeur_X_Rect = 50 '50 unités à droite de la 1ère position possible TableAImprimer(2).Valeur_Y_RelativePrec = 5 ' 5 unités à la suite de l'impression précédente TableAImprimer(3).Texte = Form1.Label1.Text TableAImprimer(3).Police = Form1.Label1.Font ' TableAImprimer(3).Valeur_X_Rect = 100 '100 unités à droite de la 1ère position possible TableAImprimer(3).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente ' .............. End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim Ligne As String Dim Position As System.Drawing.PointF Dim Rectangle As RectangleF Dim Police As Font Dim HauteurLigne As Single = 0 Dim PositionYPrec As Single = 0 Static IndiceTable As Integer = 0 If IndiceTable = 0 Then PrepareImpression() End If Do Police = TableAImprimer(IndiceTable).Police Ligne = TableAImprimer(IndiceTable).Texte If TableAImprimer(IndiceTable).Valeur_Y_RelativePrec > 0 Then PositionYPrec += TableAImprimer(IndiceTable).Valeur_Y_RelativePrec + HauteurLigne Else PositionYPrec += TableAImprimer(IndiceTable).Valeur_Y_RelativePrec End If HauteurLigne = Police.GetHeight(e.Graphics) Position = New PointF(TableAImprimer(IndiceTable).Valeur_X_Rect, PositionYPrec) Rectangle.Location = Position If Position.Y + HauteurLigne > e.MarginBounds.Height Then e.HasMorePages = True Exit Sub Else e.HasMorePages = False End If e.Graphics.DrawString(Ligne, Police, Brushes.Black, Rectangle) IndiceTable += 1 Loop Until TableAImprimer(IndiceTable).Texte = String.Empty End Sub End Class
Bon tu me rassures un peu..., tout était pas faux et ma logique aurait du être bonne, si Mr crosoft n'avait pas compliqué à souhait !.
J'essaye et je te tiens au courant,
merci
Bon ça marche et ca imprime sur 2 pages ..., j'ai forcé sur les interlignes pour mettre des data's sur la page 2.
j'ai cru comprendre que tu voulais t'amuser un peu, alors je te copie le code complet
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 Public Class impression Private Structure DonneePourImpression Dim Texte As String ' le texte à imprimer Dim Police As Font ' sa police Dim Valeur_X_Rect As Single ' Position LEFT du rectangle d'impression par rapport à la marge Dim Valeur_Y_RelativePrec As Single ' Position TOP du rectangle d'impression par rapport aux impressions précédentes End Structure Dim MaxIndideImpression As Integer = 200 ' Si 200 pas suffisant, augmenter !!! Dim TableAImprimer(MaxIndideImpression) As DonneePourImpression Private Sub PrepareImpression() For i As Integer = 0 To MaxIndideImpression TableAImprimer(i).Texte = String.Empty ' Initialisation indispensable car la valeur Empty sert au contrôle de la boucle d'impression Next TableAImprimer(0).Texte = Final_datas.lb_well_name.Text TableAImprimer(0).Police = Final_datas.lb_well_name.Font TableAImprimer(0).Valeur_X_Rect = 50 '50 unités à droite de la 1ère position possible TableAImprimer(0).Valeur_Y_RelativePrec = 50 '50 unités en dessous de la 1ère position possible TableAImprimer(1).Texte = Final_datas.Lb_date.Text TableAImprimer(1).Police = Final_datas.Lb_date.Font TableAImprimer(1).Valeur_X_Rect = 500 '500 unités à droite de la 1ère position possible TableAImprimer(1).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente '****************** previous casing ************ TableAImprimer(2).Texte = Final_datas.Lab_pr_csg_size.Text TableAImprimer(2).Police = Final_datas.Lab_pr_csg_size.Font TableAImprimer(2).Valeur_X_Rect = 50 '50 unités à droite de la 1ère position possible TableAImprimer(2).Valeur_Y_RelativePrec = 50 ' 5 unités à la suite de l'impression précédente TableAImprimer(3).Texte = Final_datas.Lab_pr_csg_weight.Text TableAImprimer(3).Police = Final_datas.Lab_pr_csg_weight.Font ' TableAImprimer(3).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(3).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(4).Texte = Final_datas.Lab_pr_csg_shoe.Text TableAImprimer(4).Police = Final_datas.Lab_pr_csg_shoe.Font ' TableAImprimer(4).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(4).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédente TableAImprimer(5).Texte = Final_datas.Lab_pr_csg_int_capa.Text TableAImprimer(5).Police = Final_datas.Lab_pr_csg_int_capa.Font ' TableAImprimer(5).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(5).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente '****************** casing to run *********** TableAImprimer(6).Texte = Final_datas.Lab_csg_size.Text TableAImprimer(6).Police = Final_datas.Lab_csg_size.Font ' TableAImprimer(6).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(6).Valeur_Y_RelativePrec = 100 ' à la même hauteur que l'impression précédente TableAImprimer(7).Texte = Final_datas.Lab_csg_weight.Text TableAImprimer(7).Police = Final_datas.Lab_csg_weight.Font ' TableAImprimer(7).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(7).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(8).Texte = Final_datas.Lab_csg_int_vol.Text TableAImprimer(8).Police = Final_datas.Lab_csg_int_vol.Font ' TableAImprimer(8).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(8).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédente TableAImprimer(9).Texte = Final_datas.Lab_csg_ext_vol.Text TableAImprimer(9).Police = Final_datas.Lab_csg_ext_vol.Font ' TableAImprimer(9).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(9).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(10).Texte = Final_datas.Lab_csg_int_dia.Text TableAImprimer(10).Police = Final_datas.Lab_csg_int_dia.Font ' TableAImprimer(10).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(10).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédente TableAImprimer(11).Texte = Final_datas.Lab_collar_depth.Text TableAImprimer(11).Police = Final_datas.Lab_collar_depth.Font ' TableAImprimer(11).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(11).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédente TableAImprimer(12).Texte = Final_datas.Lab_shoe_depth.Text TableAImprimer(12).Police = Final_datas.Lab_shoe_depth.Font ' TableAImprimer(12).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(12).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(13).Texte = Final_datas.Lab_shoe_track_lenght.Text TableAImprimer(13).Police = Final_datas.Lab_shoe_track_lenght.Font ' TableAImprimer(13).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(13).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédente '******************Open Hole ********************** TableAImprimer(14).Texte = Final_datas.lb_int_vol_OH.Text TableAImprimer(14).Police = Final_datas.lb_int_vol_OH.Font ' TableAImprimer(14).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(14).Valeur_Y_RelativePrec = 100 ' à la même hauteur que l'impression précédente TableAImprimer(15).Texte = Final_datas.Lb_TD_MD.Text TableAImprimer(15).Police = Final_datas.Lb_TD_MD.Font ' TableAImprimer(15).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(15).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédente TableAImprimer(16).Texte = Final_datas.Lb_TD_TVD.Text TableAImprimer(16).Police = Final_datas.Lb_TD_TVD.Font ' TableAImprimer(16).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(16).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(17).Texte = Final_datas.Lb_lg_OH.Text TableAImprimer(17).Police = Final_datas.Lb_lg_OH.Font ' TableAImprimer(17).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(17).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédente '********************Cement volume************************ TableAImprimer(18).Texte = Final_datas.Lb_vol_lead.Text TableAImprimer(18).Police = Final_datas.Lb_vol_lead.Font ' TableAImprimer(18).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(18).Valeur_Y_RelativePrec = 100 ' à la même hauteur que l'impression précédente TableAImprimer(19).Texte = Final_datas.Lb_vol_excess_lead.Text TableAImprimer(19).Police = Final_datas.Lb_vol_excess_lead.Font ' TableAImprimer(19).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(19).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(20).Texte = Final_datas.Lb_vol_tail.Text TableAImprimer(20).Police = Final_datas.Lb_vol_tail.Font ' TableAImprimer(20).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(20).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédent TableAImprimer(21).Texte = Final_datas.Lb_vol_excess_tail.Text TableAImprimer(21).Police = Final_datas.Lb_vol_excess_tail.Font ' TableAImprimer(21).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(21).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente '*********************Displacement******************** TableAImprimer(22).Texte = Final_datas.Lab_vol_shoe_track.Text TableAImprimer(22).Police = Final_datas.Lab_vol_shoe_track.Font ' TableAImprimer(22).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(22).Valeur_Y_RelativePrec = 100 ' à la même hauteur que l'impression précédente TableAImprimer(23).Texte = Final_datas.Lab_half_ST.Text TableAImprimer(23).Police = Final_datas.Lab_half_ST.Font ' TableAImprimer(23).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(23).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(24).Texte = Final_datas.lab_vol_int_csg_to_fc.Text TableAImprimer(24).Police = Final_datas.lab_vol_int_csg_to_fc.Font ' TableAImprimer(24).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(24).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédent TableAImprimer(25).Texte = Final_datas.Lab_str_displ.Text TableAImprimer(25).Police = Final_datas.Lab_str_displ.Font ' TableAImprimer(25).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(25).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédente TableAImprimer(26).Texte = Final_datas.Lb_diplac_max.Text TableAImprimer(26).Police = Final_datas.Lb_diplac_max.Font ' TableAImprimer(26).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(26).Valeur_Y_RelativePrec = 20 ' à la même hauteur que l'impression précédent TableAImprimer(27).Texte = Final_datas.Lab_str_displ_max.Text TableAImprimer(27).Police = Final_datas.Lab_str_displ_max.Font ' TableAImprimer(27).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(27).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédent '********************* casing 2 **************** TableAImprimer(28).Texte = Final_datas.Lb_csg2_size.Text TableAImprimer(28).Police = Final_datas.Lb_csg2_size.Font ' TableAImprimer(28).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(28).Valeur_Y_RelativePrec = 300 ' à la même hauteur que l'impression précédent TableAImprimer(29).Texte = Final_datas.Lb_csg2_weight.Text TableAImprimer(29).Police = Final_datas.Lb_csg2_weight.Font ' TableAImprimer(29).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(29).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédent TableAImprimer(30).Texte = Final_datas.Lb_csg2_int_vol.Text TableAImprimer(30).Police = Final_datas.Lb_csg2_int_vol.Font ' TableAImprimer(30).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(30).Valeur_Y_RelativePrec = 150 ' à la même hauteur que l'impression précédent TableAImprimer(31).Texte = Final_datas.Lb_csg2_int_vol.Text TableAImprimer(31).Police = Final_datas.Lb_csg2_int_vol.Font ' TableAImprimer(31).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(31).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédent TableAImprimer(32).Texte = Final_datas.Lb_csg2_ext_vol.Text TableAImprimer(32).Police = Final_datas.Lb_csg2_ext_vol.Font ' TableAImprimer(32).Valeur_X_Rect = 50 '100 unités à droite de la 1ère position possible TableAImprimer(32).Valeur_Y_RelativePrec = 30 ' à la même hauteur que l'impression précédent TableAImprimer(33).Texte = Final_datas.Lab_csg2_int_dia.Text TableAImprimer(33).Police = Final_datas.Lab_csg2_int_dia.Font ' TableAImprimer(33).Valeur_X_Rect = 350 '100 unités à droite de la 1ère position possible TableAImprimer(33).Valeur_Y_RelativePrec = 0 ' à la même hauteur que l'impression précédent End Sub Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim Ligne As String Dim Position As System.Drawing.PointF Dim Rectangle As RectangleF Dim Police As Font Dim HauteurLigne As Single = 0 Dim PositionYPrec As Single = 0 Static IndiceTable As Integer = 0 If IndiceTable = 0 Then PrepareImpression() End If Do Police = TableAImprimer(IndiceTable).Police Ligne = TableAImprimer(IndiceTable).Texte If TableAImprimer(IndiceTable).Valeur_Y_RelativePrec > 0 Then PositionYPrec += TableAImprimer(IndiceTable).Valeur_Y_RelativePrec + HauteurLigne Else PositionYPrec += TableAImprimer(IndiceTable).Valeur_Y_RelativePrec End If HauteurLigne = Police.GetHeight(e.Graphics) Position = New PointF(TableAImprimer(IndiceTable).Valeur_X_Rect, PositionYPrec) Rectangle.Location = Position If Position.Y + HauteurLigne > e.MarginBounds.Height Then e.HasMorePages = True Exit Sub Else e.HasMorePages = False End If e.Graphics.DrawString(Ligne, Police, Brushes.Black, Rectangle) IndiceTable += 1 Loop Until TableAImprimer(IndiceTable).Texte = String.Empty End Sub End Class
Bonsoir,
J’ai fait un exemple qui ne correspond sûrement pas à ta manière de présenter les données …
Le fichier de base est mesdatasExemple.docx (à copier dans … Bin\Debug). Voici ce à quoi il ressemble avant exécution :
Le premier tableau contient 3 cellules sans traits de séparations. VB y place des infos en colonne 1 et en colonne 3. En colonne 2, le slashe est placé dans Word.
Le deuxième tableau contient 2 colonnes et la première ligne contient les titres des colonnes en taille un peu plus grande et en caractères gras.
VB place les valeurs à partir de la 2ème ligne et ajoute les lignes au fur et à mesure des besoins. C’est bien entendu ici que ça ne correspond pas à ta façon de présenter les données … La difficulté vient du fait que tes Label contiennent à la fois le libellé et la valeur (ordinairement, on utilise 2 zones distinctes pour y placer 2 textes distincts : le libellé et la valeur).
En pièce jointe, Pierrelec.zip contient les codes complets de final_datas.vb et de impression.vb, ainsi que mesdatasExemple.docx .
A l’exécution, dans le menu de final_datas, c’est Print qui commande l’impression par Word. La procédure GotoWord est commentée.
…![]()
Ecoute, je ne sais pas comment te remercier, même si ça ne correspond pas, dans la mise en page à ce que je voudrais, la modification va être facile, et surtout CA MARCHE !!!!
Me reste maintenant à faire une version 6 plus intuitive et ce sera pas mal du tout !
encore merci.
Pierre
Bonjour,
TableAImprimer(…) est dans ton programme, dans impression.vb, c'est la procédure que tu as du remplir, où tu as exagéré les espaces pour obtenir un saut de page ...
Pour ce qui est d'imprimer plusieurs lignes dans un tableau qui a été créé avec peu de lignes (ce qui est normal), il faut ajouter les lignes quand on en a besoin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 '... Table.Rows.Add() L += 1 ' L est l'indice utilisé pour les lignes Table.Cell(L, 1).Range.Text = "" ' dans cet exemple, on vide la cellule de la colonne 1, de la ligne L. '...
...![]()
Bravo !!!
Et bien si tu peux composer avec mon algo et que tu es content du résultat que tu obtiens, alors je n'ai rien à corriger, vaut même mieux ne plus y toucher ...
Cependant, telle quelle, la classe impression permet l'impression du texte. Si tu veux tirer un trait après une ligne de données, ou bien placer là une image, rien ne te le permet.
Je me propose donc de mettre en place un système de codes sur base desquels serait fait le choix de l'impression souhaitée dans _PrintPage. Je dois tester un peu ...
avec plaisirs, car je voulais insérer un tableau pour récapituler les temps/volume de pompage, et donc je pensais à éditer les lignes grâce a power pack, ou alors des labels qui contiendrais de "-" ou des "_" enfin tu vois le bricolage .....
mais si tu as un moyen !!!
Si je peux me permettre ...
Pourquoi ne séparerais-tu pas les libellés et les valeurs sur tes écrans ? Cela ne devrait pas être trop difficile puisqu'il en est ainsi dans ta DB.
Tu pourrais ensuite remplir la TableAImprimer() comme ceci (ce n'est qu'une illustration) :
TableAImprimer(2).Texte = "Le texte du libellé qui vient là"
TableAImprimer(2).Police = ...
TableAImprimer(2) ...X... = ...
TableAImprimer(2) ...Y... = ...
TableAImprimer(3).Texte = "Le texte de la valeur pour le libellé qui est à côté (le 2)"
TableAImprimer(3) ... = ...
TableAImprimer(3) ... = ...
TableAImprimer(3) ... = ...
et ainsi de suite, les indices pairs (4, 6, ... ) concernant les libellés et les impairs concernant les valeurs correspondantes.
Pour l'impression directe, toutes les lignes de la TableAImprimer() sont utiles.
Pour l'impression via Word, les lignes de la TableAImprimer() qui concernent les valeurs X et Y sont inutiles et 2 situations sont à envisager :
- soit tu as écrit les libellés dans le doc de base, alors seules les lignes de la TableAImprimer(IndiceImpair).Texte sont utiles;
- soit tu n'as pas écrit les libellés dans le doc de base, alors toutes les lignes de la TableAImprimer().Texte sont utiles, et éventuellement les lignes TableAImprimer().Police.
A toi de voir ...
Passe une excellente journée![]()
il aurait meme plus simple, la mise en page Word sera toujours la meme, pourquoi ne pas mettre une fois pour toute les libéllés dans la mise en page word et ne lui faire que remplir que les valeurs !!
C'est pas très satisfaisant parce que les espaces occupés sur le papier ne sont pas gérés comme avec les textes. Les lignes et images doivent donc être imprimées en positions absolues (ne mémorise pas la position X pour l’impression suivante et attention au saut de page).
Mais ça permet de continuer avec la table des données à imprimer et d'imprimer dans une boucle.
Voici le code de la procédure _PrintPage et une illustration des insertions faites dans PrepareImpression pour tester.
Attention, si tu places effectivement des impressions de lignes et d'images, il te faut corriger tous les autres indices de la table.
Je te laisse tester et je pourrai te donner des explication demain après-midi (si nécessaire).
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 Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Dim Ligne As String Dim Position As System.Drawing.PointF Dim Rectangle As RectangleF Dim Police As Font Dim HauteurLigne As Single = 0 Dim PositionYPrec As Single = 0 Static IndiceTable As Integer = 0 Dim SeparateurSplit As Char() = {"~"} Dim LesValeurs() As String If IndiceTable = 0 Then PrepareImpression() End If Do Select Case TableAImprimer(IndiceTable).Texte.Substring(0, 6) ' les 6 premiers caractères Case "~~~~~~" ' Choix du caractère ASCII 126 comme caractère "spécial", séparateur de données. ' Rien à faire (donnée nulle pour faire "tampons" dans la table TableAImprimer Case "~LIGNE" ' chaque ~ suivant exprime une donnée : ~NomCouleur~Epaisseur~X1~Y1~X2~Y2 LesValeurs = TableAImprimer(IndiceTable).Texte.Split(SeparateurSplit) Dim Epaisseur As Single = CType(LesValeurs(3), Single) Dim X1 As Integer = CType(LesValeurs(4), Integer) Dim Y1 As Integer = CType(LesValeurs(5), Integer) Dim X2 As Integer = CType(LesValeurs(6), Integer) Dim Y2 As Integer = CType(LesValeurs(7), Integer) Dim Couleur As Color = Color.FromName(LesValeurs(2)) Dim Pinceau As New Pen(Couleur, Epaisseur) If X2 > e.MarginBounds.Height Then ' Attention, ici on n'est pas dans le relatif : X1 et X2 doivent tenir sur une même page e.HasMorePages = True Exit Sub Else e.HasMorePages = False End If e.Graphics.DrawLine(Pinceau, X1, Y1, X2, Y2) Case "~IMAGE" ' chaque ~ suivant exprime une donnée : ~Nom_et_Chemin_Du_FichierImage~X~Y LesValeurs = TableAImprimer(IndiceTable).Texte.Split(SeparateurSplit) Dim MonImage As Image = Image.FromFile(LesValeurs(2)) Dim X As Integer = CType(LesValeurs(3), Integer) Dim Y As Integer = CType(LesValeurs(4), Integer) If X + MonImage.Height > e.MarginBounds.Height Then ' Attention, ici on n'est pas dans le relatif : X + la hauteur de l'image doit tenir sur une même page e.HasMorePages = True Exit Sub Else e.HasMorePages = False End If e.Graphics.DrawImage(MonImage, X, Y) Case Else Police = TableAImprimer(IndiceTable).Police Ligne = TableAImprimer(IndiceTable).Texte If TableAImprimer(IndiceTable).Valeur_Y_RelativePrec > 0 Then PositionYPrec += TableAImprimer(IndiceTable).Valeur_Y_RelativePrec + HauteurLigne Else PositionYPrec += TableAImprimer(IndiceTable).Valeur_Y_RelativePrec End If HauteurLigne = Police.GetHeight(e.Graphics) Position = New PointF(TableAImprimer(IndiceTable).Valeur_X_Rect, PositionYPrec) Rectangle.Location = Position If Position.Y + HauteurLigne > e.MarginBounds.Height Then e.HasMorePages = True Exit Sub Else e.HasMorePages = False End If e.Graphics.DrawString(Ligne, Police, Brushes.Black, Rectangle) End Select IndiceTable += 1 Loop Until TableAImprimer(IndiceTable).Texte = String.Empty End Sub
![]()
Bien évidemment !
Si tu renonces à l'impression directe que tu règles la mise en page dans Word, la TableAImprimer ne doit plus contenir que les champs .Texte.
![]()
Partager