Impression VB.net?????

Astro8899 Messages postés 77 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 1 février 2007 - 2 nov. 2005 à 22:07
felsfr Messages postés 25 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 décembre 2005 - 5 nov. 2005 à 19:04
Voici ce que j'ai fait pour imprimer mes données que je récupère. Mon problème est que j'imprime seulement la première page mais pas les autres. Et quand je fais e.HasMorePages = True il me fait une boucle sans fin. ALors j'aimerais avoir quelque conseil








Private
Sub PrintDocument1_PrintPage(
ByVal sender
As System.Object,
ByVal e
As System.Drawing.Printing.PrintPageEventArgs)
Handles PrintDocument1.PrintPage

Dim pad
As
Char
pad = Convert.ToChar(" ")

Dim FontL
As Font =
New Font("Courier New", 10, FontStyle.Regular)

Dim Position
As
Single = -1

Dim Count
As
Integer = -5
'numero de ligne
Dim LeftMargin
As
Single
'= e.MarginBounds.Left 'margine gauche
Dim TopMargin
As
Single = e.MarginBounds.Top
' Bord haut
Dim Ligne
As
String
Dim Nb_items
As
Single = 55
'nb des lignes par page
Dim item_actuel
As
Integer
Dim NbLignes
As
Single = e.MarginBounds.Height / FontL.GetHeight(e.Graphics)

While (Count < NbLignes
And item_actuel < Nb_items)
Position = TopMargin + (Count * FontL.GetHeight(e.Graphics))
Ligne = ListView1.Items(item_actuel).SubItems(0).Text.PadRight(22, pad) & _
ListView1.Items(item_actuel).SubItems(1).Text.PadRight(22, pad) & _
ListView1.Items(item_actuel).SubItems(2).Text

e.Graphics.DrawString(Ligne, FontL, Brushes.Black, LeftMargin, Position,
New StringFormat)

Count = Count + 1
item_actuel = item_actuel + 1

End
While

end sub

16 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
2 nov. 2005 à 23:06
salut

c'est recupere d(un autre message du forum
Le plus dur est de determiner a quel momment mattre hasmorepage a false

Private Sub pd_PrintPage(sender As object, ev As System.Drawing.Printing.PrintPageEventArgs)
Dim lpp As Single = 0 'nombre de ligne par page
Dim yPos As Single = 0 'ordonnée
Dim count As Integer = 0 'numéro de ligne
Dim leftMargin As Single = ev.MarginBounds.Left
Dim topMargin As Single = ev.MarginBounds.Top
Dim line as String

'calcul du nombre de ligne par page
' hauteur de la page/hauteur de la police de caractère
lpp = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics)
'lit une ligne dans le fichier
line=streamToPrint.ReadLine()

'On affiche les lignes tant qu'il y en a et que l'on a
'pas atteint la fin de page
'(le reste ira sur la page suivante)
while (count < lpp AND line <> Nothing)
yPos = topMargin + (count * printFont.GetHeight(ev.Graphics))

'Ecrit le texte dans l'objet graphique
ev.Graphics.DrawString (line, printFont, Brushes.Black,leftMargin, yPos, new StringFormat())
count = count + 1
if (count < lpp) then
line=streamToPrint.ReadLine()
end if

End While

'S'il y a encore des lignes, on réimprime une page
If (line <> Nothing) Then
'pd_PrintPage sera de nouveau exécuté !!!!
ev.HasMorePages = True
Else
ev.HasMorePages = False
End If

End Sub

Voila
0
felsfr Messages postés 25 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 décembre 2005
3 nov. 2005 à 00:11
Même question posée il y a moins d'une semaine sur ce même Forum !!! Avec la réponse...http://www.vbfrance.com/forum.v2.aspx?ID=588637

Je pense que vous n'avez pas dû saisir le fonctionnement de l'impression sous VB.NET.
Lorsque l'on utilise un composant PrintDocument, l'évenement PrintPage doit contenir toute la logique d'impression, c'est l'objet graphique qui va être envoyé à l'imprimante, c'est à vous de dessiner (texte, graphique) ce qui doit être imprimé. Si vous indiquez en fin de code de PrintPage e.HasMorePages = True, cela ne fait qu'indiquer que PrintPage doit être ré-exécuté (d'où la boucle sans fin si votre code n'indique pas à un moment que vous avez fini d'envoyer des documents, par e.HasMorePagesFalse). e.HasMorePages True n'est pas une commande de saut de page. A chaque fois que PrintPage est exécuté jusqu'au Endsub final, une page est envoyée à l'imprimante(PrintPage n'envoie la page à l'imprimant qu'une fois le EndSub atteint, et une seule page!!!). Le code se trouvant doit donc tenir compte de la page actuelle à imprimer, tant qu'il ne s'agit pas de la dernière, e.HasMorePages = True,(dans ce cas PrintPage est ré-exécuté donc le code doit tenir compte qu'il s'agit d'une autre page)
et quand on a fini e.HasMorePages = False.

Consulte le lien indiqué, j'ai expliqué comment procéder.
@+
0
Astro8899 Messages postés 77 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 1 février 2007
3 nov. 2005 à 21:15
Voici mon code
cela ne focntionne toujours pas alors je voudrais savoir c'est quoi que je fais de pas correct.
merci

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

Dim pad
As
Char
pad = Convert.ToChar(" ")
'police

Dim FontL
As Font =
New Font("Courier New", 10, FontStyle.Regular)

Dim Position
As
Single = -1

Dim Count
As
Integer = -5
'numero de ligne
Dim LeftMargin
As
Single
'= e.MarginBounds.Left 'margine gauche
Dim TopMargin
As
Single = e.MarginBounds.Top
' Bord haut
Dim Ligne
As
String
Dim Nb_items
As
Single = 55
'nb des lignes par page
Dim n
As
Single
Dim item_actuel
As
Integer


Nbitems =
Me.ListView1.Items.Count
item_actuel = 0

Dim NbLignes
As
Single = e.MarginBounds.Height / FontL.GetHeight(e.Graphics)

While (Count < NbLignes
And item_actuel < nbitems)
Position = TopMargin + (Count * FontL.GetHeight(e.Graphics))
Ligne = ListView1.Items(item_actuel).SubItems(0).Text.PadRight(22, pad) & _
ListView1.Items(item_actuel).SubItems(1).Text.PadRight(22, pad) & _
ListView1.Items(item_actuel).SubItems(2).Text
e.Graphics.DrawString(Ligne, FontL, Brushes.Black, LeftMargin, Position,
New StringFormat)
Count = Count + 1
item_actuel = item_actuel + 1



End
While



If item_actuel < Nbitems
Then
e.HasMorePages =
True
Else
e.HasMorePages =
False
End
If

End
Sub
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
3 nov. 2005 à 21:26
Salut

Il semble avoir un programme.

If item_actuel < Nbitems
Then
e.HasMorePages =
True
Else
e.HasMorePages =
False
End
If

n'est executé qu'une fois
je pense que ca doit etre mis dans la boucle ?

voila
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
felsfr Messages postés 25 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 décembre 2005
4 nov. 2005 à 13:19
Ton erreur c'est que tu déclares item_actuel dans PrintDocument1_PrintPage, tu ne dois avoir que la premiere page qui s'imprime en boucle si je ne me trompe pas ? Item_actuel doit etre déclaré et initialisé dans la procédure qui appelle PrintDocument1_PrintPage, je ne sais pas comment tu déclenches l'impression, mais s'il s'agit du clic sur un bouton, place le code suivant dans l'évenement clic de ce bouton et supprime le de PrintDocument1_PrintPage.

Dim item_actuel
As
Integer
item_actuel = 0

De même

Dim Nb_items
As
Single = 55
'nb des lignes par page
Nbitems = Me.ListView1.Items.Count

devrait également se trouver dans la procédure d'appel quoi que cela ne nuise pas au fonctionnement.

@+
0
Astro8899 Messages postés 77 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 1 février 2007
4 nov. 2005 à 16:09
merci de ta réponse car cela a focntionner.

maintenant, connais-tu la façon de faire pour su texte autour des mes donnée que j'imprime dans le sens de mettre le nombre de page dansle bas etc....ou si il y a des modèle rapport , si tu préfères faire de la mise en page sans se servir de crystal report ou il faut que je me serve de crystal report pour faire cela. Et y a t il une place pour telecharger crystal report

merci
0
felsfr Messages postés 25 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 décembre 2005
4 nov. 2005 à 18:04
Je ne peux te renseigner quant à cristal report car effectivement je fais mes mises en pages moi même. Pour indiquer le numéro de page sur tes feuilles, il suffit d'initialiser une variable par exemble numero_page=1 dans la procédure d'appel (pas dans printdocument_printpage sinon remis à 1 à chaque page) comme pour item_actuel

après ta boucle while
(c'est un exemple, à toi d'indiquer police, brush, position etc en fonction de ta page (attention de ne pas écrire hors zone imprimable, il te faudra certainement réduire le nb de lignes imprimées dans ta boucle du dessus sinon le nr de page n'apparaitra pas)


'on affiche le n° de la page
Dim texte
As
String
texte = "- " & page.ToString & " -"
e.Graphics.DrawString(texte,
New Font("arial", police_taille), Brushes.Black, (position_X + 190 / 2) * ratio, position_Y * ratio, align_centre)

modifie le reste comme suit

If item_actuel < Nbitems
Then
e.HasMorePages =
True
numero_page = numero_page + 1 'on incrémente le numero pour la page suivante
Else
e.HasMorePages =
False
End
If

@+
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
4 nov. 2005 à 19:39
Salut pour le nombre de page,

il n'y a pas beaucoup de moyen, il faut parcourir
deux fois.

c'est aussi le principe si tu veux avoir un sommaire.

regardes le code de http://www.vbfrance.com/code.aspx?ID=27689

il y a peut etre ce que tu cherche
0
Astro8899 Messages postés 77 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 1 février 2007
4 nov. 2005 à 21:06
Salut!!!!

Je te remercie. Mais comment l'adapter car je ne sais pas comme faire fonctionner le PiSys_Print.PiSys_PrintClass ou comment le gérer alors si tu peux m'aider a comprendre j'aimerais bien
merci
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
4 nov. 2005 à 21:26
Desolé, je ne sais pas. J'ai pas regardé le contenu de cette source.

Il y a une impression dans un graphics et apres une impression sur l'imprimante pour faire la numerotation des pages.
0
Astro8899 Messages postés 77 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 1 février 2007
4 nov. 2005 à 22:10
Salut !!!

Dans ce cas as-tu d'autre truc pour la mise en page genre de le nombre de page et des en-tête de feuille etc...

merci
0
felsfr Messages postés 25 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 décembre 2005
5 nov. 2005 à 14:35
Je ne vois vraiment pas pourquoi il faudrait 'parcourir' 2 fois, la numérotation des pages fonctionne très bien avec la méthode expliquée plus haut ???? Pour des en-tête de feuille, aucune difficulté non plus, puisqu'ils sont identiques sur chaque feuille, le code sera le même pour chaque page.
@+
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
5 nov. 2005 à 14:45
Il faut parcourir deux fois si tu veux le nombre de page.

La methode donnes le numeros des pages mais pas le nombre.
texte = "- " & page.ToString & " -"

voila
0
felsfr Messages postés 25 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 décembre 2005
5 nov. 2005 à 15:37
Si tu sais ce que tu veux imprimer aucune difficulté pour avoir le nombre de pages, inutile de parcourir 2 fois.


Dans le cas présent on connait le nombre d'éléments de ListView1 par Nbitems = Me.ListView1.Items.Count, il suffit de diviser par le nombre de lignes par page et tu as ton nombre de pages.

Voila

@+
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
5 nov. 2005 à 15:54
Oui, si on veux
Mais j'etais parti dans un systeme plus général

J'avais pas lu le source avec la listview.

Si on veux imprimer un truc plus complexe, il faut le faire en général en deux fois.
A moins de calculer toutes les hauteurs. et les superpositions.

Bien alors c'est pas pas trop dur.

il suffit de connaitre le nombre max de ligne par pages et faire une division.

Sinon il faut determiner la hauteur d'un element et faire la division par la hauteur utiles sans les marges.

Bon courage.
0
felsfr Messages postés 25 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 13 décembre 2005
5 nov. 2005 à 19:04
Si tu le dis, mais je ne vois vraiment pas quel courage il faut pour gérer l'impression. C'est toi qui décide ce qui doit être imprimé, c'est toi qui crée le code en réflechissant (un peu), rien de complexe...Rien de sorcier pour déterminer les marges réelles de l'imprimante ( 33900 http://www.vbfrance.com/code.aspx?ID=33900).
Les réponses apportées à Astro8899 sont fonctionnelles et correspondent à ses demandes, et non à des réponses généralistes ou à des sources citées sans en connaitre le contenu et dans lesquelles il y a 'peut être' une réponse.
D'autre part il vaut mieux éviter d'affirmer des choses totalement fausses qui vont induire en erreur.
STOP ET FIN

"Salut
Il semble avoir un programme. ??? COMPREND PAS ???

If item_actuel < Nbitems
Then
e.HasMorePages =
True
Else
e.HasMorePages =
False
End
If

n'est executé qu'une fois !!!! TOTALEMENT FAUX !!! *1
je pense que ca doit etre mis dans la boucle ? !!!!!CERTAINEMENT PAS !!!!! *2

voila"

*1 : PrintDocument1_PrintPage est exécuté entièrement, puis si e.HasmorePage avait été déclaré =True, PrintDocument1_PrintPage est de nouveau exécuté entièrement, ceci tant e.HasMorePage n'est pas déclaré False. A signaler qu'à aucun moment on ne reprend la main tant que toutes les pages n'ont pas été envoyées. Le code ci dessus est donc exécuté plusieurs fois. HasMorePage n'envoie pas une commande saut de page à l'imprimante.

*2: -2 possibilités: si le nombre d'items <nb de ligne de la page, alors ok impression d'une page et fin. si nombres d'items>nb de lignes par page alors boucle sans fin
0
Rejoignez-nous