Impression multi pages

Résolu
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021 - Modifié le 14 avril 2021 à 19:37
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021 - 24 avril 2021 à 16:34
Bonjour à tous

Je cherche à faire un impression multi pages.
j'arrive à afficher un en-tête, un pied de page et un contenu ( entre les deux )
je désire afficher des données ( via un Reader Mysql ) dans ce conteneur.

j'ai donc testé un truc dans le style :
 
    Private Sub PrintTest2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        PrintDocument1.DefaultPageSettings.Landscape = True
        NumPage = 0
        CentrageGrpBox()
    End Sub
    Private Sub CentrageGrpBox()
        '  MsgBox("on centre")
        GroupBox1.Top = (Me.Height - GroupBox1.Height) \ 2
        GroupBox1.Left = (Me.Width - GroupBox1.Width) \ 2
        GroupBox1.Location = New Point(GroupBox1.Left)
    End Sub
 
 
    Dim iLefmargin As Integer
    Dim iTopmargin As Integer
    Dim LargPage As Integer
    Dim HautPage As Integer
    Dim NumPage As Integer
    Dim NbreTotalPage As Integer
    Dim LeTitre As String = "Le Titre ici "
    Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy")
    Dim LaSem As String = "Semaine " & "14 " & "Année " & "2021"
    Dim MaxHautCont As Integer
    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
 
        Try
            iLefmargin = e.MarginBounds.Left
            iTopmargin = e.MarginBounds.Top
            LargPage = e.PageSettings.PaperSize.Width
            HautPage = e.PageSettings.PaperSize.Height
 
            Dim StfTitre As StringFormat = New StringFormat()
            StfTitre.LineAlignment = StringAlignment.Center
            StfTitre.Alignment = StringAlignment.Near
 
            Dim StfSem As StringFormat = New StringFormat()
            StfSem.LineAlignment = StringAlignment.Center
            StfSem.Alignment = StringAlignment.Center
 
            Dim StfDate As StringFormat = New StringFormat()
            StfDate.LineAlignment = StringAlignment.Center
            StfDate.Alignment = StringAlignment.Far
 
            Dim FontTitre As Font = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            Dim FontSem As Font = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            Dim FontDate As Font = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point)
 
            Dim RectEntete As RectangleF = New RectangleF(5, e.PageBounds.Top + 5, e.PageBounds.Width - 10, 30)
            Dim RectPied As RectangleF = New RectangleF(5, e.PageBounds.Height - 35, e.PageBounds.Width - 10, 30)
 
            'en-tête 
            e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete))
            e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre)
            e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem)
            e.Graphics.DrawString(LaDate, FontDate, Brushes.Black, RectEntete, StfDate)
 
            'Contenu
            Dim Result As String
            Dim FontCont As Font = New Font("Arial", 9, FontStyle.Bold, GraphicsUnit.Point)
            Dim Pos As Integer = 40
 
            For I = 1 To 25
                Result = I
                Dim RectCont As RectangleF = New RectangleF(50, Pos, 500, 30)
                e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectCont))
                e.Graphics.DrawString(Result, FontCont, Brushes.Black, RectCont, StfTitre)
                Pos = Pos + 35
            Next I
 
            'Pied de page
            e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectPied))
            e.Graphics.DrawString("Page n°" & NumPage & " / " & NbreTotalPage, FontDate, Brushes.Black, RectPied, StfDate)
 
        Catch ex As Exception
            MsgBox("Erreur d'impression : " & ex.Message)
        End Try
 
    End Sub


ce qui donne à l'affichage :


ce que je désire faire c'est de charger la suite sur une page suivante, qui reprend l'en-tête, le pied de page ( avec le numéro de page genre "Page 1 / 5" ) et la suite des données ( ligne 22 / 23 etc )
je sais qu'il faut utiliser e.HasMorePages mais je sais pas du tout comment l'utiliser.
Si l'un de vous peut me donner une piste ou m'aider ça serait vraiment sympa.
Merci par avance

19 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 14 avril 2021 à 14:43
Bonjour
Avez-vous une variable qui vous indique le nombre de lignes totales à imprimer ?
Car c'est elle qui va déterminer l'état de e.HasMorePages
Dans mon projet je l'ai fixé à 50
J'ai fait moi-même un mini projet avec votre code

Public Class Form1

    Private NumPage As Integer ' numéro de page de 0 à NbreTotalPage - 1
    Private NombreContenusRestants As Integer = 50 ' nombre de contenus restants à imprimer ( 50 pour l'exemple )
    Private Const NombreContenusParPage As Integer = 21
    Private NbreTotalPage As Integer ' nombre total de pages à imprimer

    Private Sub PrintTest2_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        NumPage = 0
        ' calcul nombre total de pages 
        NbreTotalPage = NombreContenusRestants \ NombreContenusParPage
        If NombreContenusRestants Mod NombreContenusParPage > 0 Then NbreTotalPage += 1
        ' on imprime
        PrintDocument1.DefaultPageSettings.Landscape = True
        PrintDocument1.Print()

    End Sub

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

        Try
            ' on regroupe toutes les variables par type
            Dim StfTitre, StfSem, StfDate As StringFormat
            Dim FontTitre, FontSem, FontDate, FontCont As Font
            Dim RectEntete, RectPied, RectCont As RectangleF
            Dim Lefmargin, Topmargin, LargPage, HautPage, NombreContenusBoucle As Integer
            Dim Pos As Integer
            Dim LeTitre As String = "Le Titre ici "
            Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy")
            Dim LaSem As String = "Semaine " & "14 " & "Année " & "2021"
            Lefmargin = e.MarginBounds.Left
            Topmargin = e.MarginBounds.Top
            LargPage = e.PageSettings.PaperSize.Width
            HautPage = e.PageSettings.PaperSize.Height
            StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near}
            StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center}
            StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far}
            FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point)
            RectEntete = New RectangleF(5, e.PageBounds.Top + 5, e.PageBounds.Width - 10, 30)
            RectPied = New RectangleF(5, e.PageBounds.Height - 35, e.PageBounds.Width - 10, 30)

            'en-tête 
            e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete))
            e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre)
            e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem)
            e.Graphics.DrawString(LaDate, FontDate, Brushes.Black, RectEntete, StfDate)

            'Contenu
            FontCont = New Font("Arial", 9, FontStyle.Bold, GraphicsUnit.Point)
            Pos = 40
            If NombreContenusRestants > 20 Then
                NombreContenusBoucle = 21
            Else
                NombreContenusBoucle = NombreContenusRestants
            End If
            For i = 1 To NombreContenusBoucle ' les contenus d'une page à imprimer
                RectCont = New RectangleF(50, Pos, 500, 30)
                e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectCont))
                e.Graphics.DrawString(((NumPage * NombreContenusParPage) + i).ToString, FontCont, Brushes.Black, RectCont, StfTitre)
                Pos += 35
            Next i

            'Pied de page
            e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectPied))
            e.Graphics.DrawString("Page n°" & (NumPage + 1).ToString  & " / " & NbreTotalPage.ToString, FontDate, Brushes.Black, RectPied, StfDate)
            NumPage += 1 ' on augmente le numéro de page
            NombreContenusRestants -= NombreContenusParPage
            e.HasMorePages = NombreContenusRestants > 0

        Catch ex As Exception
            MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try

    End Sub

End Class


1
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 14 avril 2021 à 16:18
Encore mieux .
Le numéro de semaine et l'année sont calculés à partir de la date en cour
Imports System.Globalization

Public Class PrintTest2

    Private NumPage As Integer ' numéro de page de 0 à NbreTotalPage - 1
    Private NombreContenusRestants As Integer = 50 ' nombre de contenus restants à imprimer ( 50 pour l'exemple )
    Private Const NombreContenusParPage As Integer = 21
    Private NbreTotalPage As Integer ' nombre total de pages à imprimer

    Private Sub PrintTest2_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        StartPosition = FormStartPosition.CenterScreen ' on centre la Form à l'écran 
        NumPage = 0
        ' calcul nombre total de pages 
        NbreTotalPage = NombreContenusRestants \ NombreContenusParPage
        If NombreContenusRestants Mod NombreContenusParPage > 0 Then NbreTotalPage += 1
        ' on imprime
        PrintDocument1.DefaultPageSettings.Landscape = True
        PrintDocument1.Print()

    End Sub

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

        Try
            ' on regroupe toutes les variables par type
            Dim StfTitre, StfSem, StfDate As StringFormat
            Dim FontTitre, FontSem, FontDate, FontCont As Font
            Dim RectEntete, RectPied, RectCont As RectangleF
            Dim Lefmargin, Topmargin, LargPage, HautPage, NombreContenusBoucle As Integer
            Dim Pos As Integer
            Dim LeTitre As String = "Le Titre ici "
            Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy")
            Dim LaSem As String = "Semaine " & CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(DateTime.Now, CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday).ToString & " Année " & DateTime.Now.Year.ToString
            Lefmargin = e.MarginBounds.Left
            Topmargin = e.MarginBounds.Top
            LargPage = e.PageSettings.PaperSize.Width
            HautPage = e.PageSettings.PaperSize.Height
            StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near}
            StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center}
            StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far}
            FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point)
            RectEntete = New RectangleF(5, e.PageBounds.Top + 5, e.PageBounds.Width - 10, 30)
            RectPied = New RectangleF(5, e.PageBounds.Height - 35, e.PageBounds.Width - 10, 30)

            'en-tête 
            e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete))
            e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre)
            e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem)
            e.Graphics.DrawString(LaDate, FontDate, Brushes.Black, RectEntete, StfDate)

            'Contenu
            FontCont = New Font("Arial", 9, FontStyle.Bold, GraphicsUnit.Point)
            Pos = 40
            If NombreContenusRestants > 20 Then
                NombreContenusBoucle = 21
            Else
                NombreContenusBoucle = NombreContenusRestants
            End If
            For i = 1 To NombreContenusBoucle ' les contenus d'une page à imprimer
                RectCont = New RectangleF(50, Pos, 500, 30)
                e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectCont))
                e.Graphics.DrawString(((NumPage * NombreContenusParPage) + i).ToString, FontCont, Brushes.Black, RectCont, StfTitre)
                Pos += 35
            Next i

            'Pied de page
            e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectPied))
            e.Graphics.DrawString("Page n°" & (NumPage + 1).ToString & " / " & NbreTotalPage.ToString, FontDate, Brushes.Black, RectPied, StfDate)
            NumPage += 1 ' on augmente le numéro de page
            NombreContenusRestants -= NombreContenusParPage
            e.HasMorePages = NombreContenusRestants > 0

        Catch ex As Exception
            MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try

    End Sub

End Class


1
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 20 avril 2021 à 18:55
Bonjour
Pour avoir des repaires avec des numéros de ligne pouvez-vous modifier la présentation de votre code en suivant ce tuto : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code .
Si vous pouvez modifier directement votre précédent message faites-le directement sur votre précédent message . Celui-ci est modifiable durent une heure après son dépôt . Le bouton Modifier vous le permet

Ensuite on y verra plus clair .
Un gros problème pour moi : je n'ai jamais travaillé avec des bases de données . En nous aidant mutuellement je pense que nous devrions nous en sortir tout de même .
Autre chose :
1)
- Cliquez sur Projet dans la barre des menus en haut .
- Cliquez sur Propriétés du projet ( le dernier sous-menu en bas )
- Une nouvelle interface s'affiche
- Cliquer sur Compiler en haut à gauche
- Dans l'interface qui s'affiche mettez sur Option Explicit et Option Strict sur On
- Cliquez sur Références en haut à gauche
- Dans l'interface qui s'affiche dans les espaces de noms importés en bas décochez Microsoft.VisualBasic

L'action sur Compiler vous oblige à déclarer toutes les variables et à effectuer toutes les conversions nécessaires entre 2 types de variables différentes
Exemple :
Dim RecupTextbox1 As Integer = TextBox1.Text

Cette ligne est incorrecte : un Integer ne peut être égal à une String . Le bon code est :
Dim RecupTextbox1 As Integer = Convert.Toint32(TextBox1.Text)


L'action sur Références vous permet de faire du vrai Visual Basic Net sans l'importation des instructions VB6 . Ainsi MsgBox est remplacé par MessageBox.Show par exemple .
Ceci est à faire pour n'n'importe quel projet VB Net


Merci

1
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 22 avril 2021 à 22:06
Bonsoir
Aucun souci pour continuer à vous aider .
Envoyez moi un message privé et en réponse je vous mettrai mon adresse mail .
Pour ceci cliquez sur mon pseudo en bleu dans la discussion et allez sur Contactez


Vous n'aurez plus qu'à m'envoyer une partie de la base ainsi que le projet en fichier Zip ( 2 fichiers séparés bien sûr )
Dîtes-moi aussi ce qu'il faut que j'installe pour pouvoir accéder à la Base de données et où la stocker .
Ainsi je pense que nous avancerons beaucoup plus vite car je pourrais utiliser le débogage, le pas à pas et les points d'arrêt pour débugger le projet .
Merci .

1

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

Posez votre question
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
22 avril 2021 à 23:40
Bonsoir
J'ai bien tout reçu .
Merci
1
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
24 avril 2021 à 15:05
La suite de cette discussion se fera par message privé vu la spécificité du problème .
De plus, même si la solution était trouvée et parfaitement exploitable , celle-ci n'apporterait rien d'exploitable pour Codes-Sources .
Je mets donc ce post en résolu .
1
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
Modifié le 14 avril 2021 à 19:47
Bonjour vb95, avant tout je tiens à vous remercier pour votre participation et votre travail.
j'ai pas encore tester tout ça et vais le faire tout à l'heure.

Pour ce qui concerne la variable pour le nombres de lignes à afficher, pour le moment non car j'ai fait ce code pour essayer de comprendre le fonctionnement.

Mais à la base le nombre de lignes seront aléatoires, car ça va être en fonction d'une requête Mysql ( datareader ).

Chaque rectangle du "conteneur" va contenir une certaines quantité de lignes ( suivants les enregistrements dans la Bd ) et le nombre de rectangle à charger sur une page sera en fonction de taille de ceux-ci .... je sais pas si je suis clair :)

Un truc dans le style :
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
14 avril 2021 à 20:29
Vous êtes très clair dans vos explications .
Moi dans mon projet j'ai affiché une seule ligne par conteneur et celui-ci fonctionne .
Il faudra dans ca cas déterminer pour chaque page le nombre de lignes ainsi que la taille de chaque conteneur .
Cela ne va pas être si facile à mettre en œuvre .
0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
15 avril 2021 à 14:25
Bonjour,
oui je sais que ça ne va pas être facile :)
J'ai testé le code et c'est nickel, je vais m'attaquer à tout ça ce week-end je pense.
Je garde ce fil du forum sous la main, j'y posterai surement la suite et au cas ou j'y solliciterai votre aide.
Merci encore pour votre travail.
0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
20 avril 2021 à 17:50
Bonjour,
Bon bah me revoilà et je suis en train de m'arracher les cheveux !
j'ai mis en page ce que je veux afficher ( je suis désolé par avance de la méthode barbare que j'ai pondu pour afficher mes données ).
j'ai testé un tas de trucs avec le e.HasMorePages et honnêtement j'arrive pas à m'en sortir.
le seul truc que j'arrive à faire c'est de tout superposer sur la même page !

je poste le code sans le e.HasMorePages ( désolé encore pour celui-ci )

Imports MySql.Data.MySqlClient
Public Class PrintTest5

Private SelectSemaine As Integer = 15 ' la semaine sélectionnée
Private SelectAnnee As Integer = 2021 ' l'année sélectionnée
Private NbreCmd As Integer ' le nombre total de commandes à afficher ( rectangles )
Private NbreRectParPage As Integer ' le nombre de rectangles àafficher par parge
Private LargPage As Integer ' la largeur de la page à imprimer mode paysage
Private HautPage As Integer ' la hauteur de la page à imprimer Mode paysage
Private BoundTopPage As Integer
Private BoundHeight As Integer
Private BoundWidth As Integer
Private pageNum As Integer ' le numero de la page
Private PoliceEnGras As New Font("Arial", 12, FontStyle.Bold)
Private PoliceNormale As New Font("Arial", 11)
Private IdCmde As Integer
Private PosConteneur As Integer
Private PosConTSurPage As Integer
Private PosTopCont As Integer
Private XPosTexte, YPosTexte As Single


Private Sub PrintTest5_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CentrageGrpBox()
ComptNbreCmd()
' MsgBox(NbreCmd)
Label5.Text = NbreCmd
End Sub


Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Try
LargPage = e.PageSettings.PaperSize.Height
HautPage = e.PageSettings.PaperSize.Width
BoundTopPage = e.PageBounds.Top
BoundHeight = e.PageBounds.Height
BoundWidth = e.PageBounds.Width

PosConteneur = 40
XPosTexte = 50
Dim SautLigne As Single = 20

Dim HauteurConteneur As Single

Dim StfTitre, StfSem, StfDate As StringFormat
Dim FontTitre, FontSem, FontDate, FontTitreCont As Font
FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point)
StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near}
StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center}
StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far}
Dim RectEntete, RectPied, RectangleConteneur As RectangleF
RectEntete = New RectangleF(5, BoundTopPage + 5, BoundWidth - 10, 30)
RectPied = New RectangleF(5, BoundHeight - 25, BoundWidth - 10, 20)

Dim LeTitre As String = "Liste des départs "
Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy")
Dim LaSem As String = "Semaine " & "15 " & "Année " & "2021"



'en-tête
e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete))
e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre)
e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem)
e.Graphics.DrawString(LaDate & " (Page n°" & pageNum & " / " & pageNum & ")", FontDate, Brushes.Black, RectEntete, StfDate)


'Le contenu
Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer
Dim NomClient, RefCmd, CdePostalCli As String
FontTitreCont = New Font("Arial", 15, FontStyle.Bold, FontStyle.Regular) 'GraphicsUnit.Point)

Mysqlconn.Open()
Dim sqlCdeCmd As New MySqlCommand
Dim rdCmd As MySqlDataReader
sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY CdePostalLivClient,ClientCmd " 'ORDER BY ClientCmd "
sqlCdeCmd.Connection = Mysqlconn
rdCmd = sqlCdeCmd.ExecuteReader

While rdCmd.Read

IdCmde = rdCmd("idCmde")
NomClient = rdCmd("ClientCmd")
RefCmd = rdCmd("RefCmd")
CdePostalCli = rdCmd("CdePostalLivClient")

ReSulComptProSimp = NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'")
ReSulComptProComp = NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'")
ResulComElemCompose = NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'")
ReSulComptTmpsDiv = NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'")


RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, HauteurConteneur)
e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur))

Dim CalculTotalLignes = ReSulComptProSimp + ReSulComptProComp + ResulComElemCompose + ReSulComptTmpsDiv

If CalculTotalLignes = 0 Then
RectangleConteneur.Height = 30
Else
RectangleConteneur.Height = (SautLigne * CalculTotalLignes) + (SautLigne * 3)
End If

RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, RectangleConteneur.Height)
e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur))


e.Graphics.DrawString("CLIENT : " & NomClient & " / REF : " & RefCmd & " / DEP : " & CdePostalCli, PoliceEnGras, Brushes.Black, XPosTexte, RectangleConteneur.Top + 5) ' RectangleConteneur.Top)
YPosTexte = RectangleConteneur.Top + 5 + SautLigne

If ReSulComptProSimp > 0 Then
e.Graphics.DrawString("-Châssis Simple :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
Mysqlconn3.Open()
Dim sqlCChasSimple As New MySqlCommand
Dim RdChasSimple As MySqlDataReader
sqlCChasSimple.CommandText = "select * FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "' " 'ORDER BY ClientCmd "
sqlCChasSimple.Connection = Mysqlconn3
RdChasSimple = sqlCChasSimple.ExecuteReader
While RdChasSimple.Read
e.Graphics.DrawString("---" & RdChasSimple("NomProdcmdprod") & " Quantité : " & RdChasSimple("QteProdcmdprod"), PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
End While
RdChasSimple.Close()
Mysqlconn3.Close()
End If

If ReSulComptProComp > 0 Then
e.Graphics.DrawString("-Châssis Composé :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
Mysqlconn3.Open()
Dim sqlCChasComp As New MySqlCommand
Dim RdChasComp As MySqlDataReader
sqlCChasComp.CommandText = "select * FROM cmdcompos WHERE IdCmd='" & IdCmde & "' " 'ORDER BY ClientCmd "
sqlCChasComp.Connection = Mysqlconn3
RdChasComp = sqlCChasComp.ExecuteReader
While RdChasComp.Read
e.Graphics.DrawString("---" & RdChasComp("NomCmdCompos") & " Quantité : " & RdChasComp("QtecdmComp"), PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
Mysqlconn4.Open()
Dim sqlCElemComp As New MySqlCommand
Dim RdElemComp As MySqlDataReader
sqlCElemComp.CommandText = "select * FROM cmdcompelem WHERE IdDuCompose='" & RdChasComp("IdcmdCompos") & "' " 'ORDER BY ClientCmd "
sqlCElemComp.Connection = Mysqlconn4
RdElemComp = sqlCElemComp.ExecuteReader
While RdElemComp.Read
e.Graphics.DrawString("------" & RdElemComp("TypeElement") & " Désignation : " & RdElemComp("DesigElement") & " Quantité : " & RdElemComp("QteProdcmdprod"), PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
End While
RdElemComp.Close()
Mysqlconn4.Close()
End While
RdChasComp.Close()
Mysqlconn3.Close()
End If

If ReSulComptTmpsDiv > 0 Then
e.Graphics.DrawString("-Temps Divers :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
Mysqlconn3.Open()
Dim sqlCChasTmpDiv As New MySqlCommand
Dim RdChasTmpDiv As MySqlDataReader
sqlCChasTmpDiv.CommandText = "select * FROM cmdprotd WHERE IdCmd='" & IdCmde & "' " 'ORDER BY ClientCmd "
sqlCChasTmpDiv.Connection = Mysqlconn3
RdChasTmpDiv = sqlCChasTmpDiv.ExecuteReader
While RdChasTmpDiv.Read
e.Graphics.DrawString("---" & RdChasTmpDiv("DesiTd"), PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
YPosTexte = YPosTexte + SautLigne
End While
RdChasTmpDiv.Close()
Mysqlconn3.Close()

End If

PosConteneur = RectangleConteneur.Location.Y + RectangleConteneur.Height + 10
PosConTSurPage = RectangleConteneur.Location.Y + RectangleConteneur.Height + 2
Label5.Text -= 1
NbreCmd -= 1

End While
rdCmd.Close()
Mysqlconn.Close()

Catch ex As Exception
Mysqlconn.Close()
Mysqlconn2.Close()
Mysqlconn3.Close()
Mysqlconn4.Close()
MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
End Sub


Private Sub CentrageGrpBox()
GroupBox1.Top = (Me.Height - GroupBox1.Height) \ 2
GroupBox1.Left = (Me.Width - GroupBox1.Width) \ 2
GroupBox1.Location = New Point(GroupBox1.Left)
End Sub

Public Function NbreData(ByVal RequetCompteData As String)
Cursor.Current = Cursors.WaitCursor ' affiche sablier

Mysqlconn2.Open()
Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2)
Dim i As Integer = cmd.ExecuteScalar()
cmd = Nothing
Mysqlconn2.Close()
Return i

Cursor.Current = Cursors.Default

End Function

Private Sub ComptNbreCmd()
Try
Dim ReqMysqlCountCmd = CompterNbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ")
NbreCmd = ReqMysqlCountCmd
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Private Sub ButPagePlus_Click(sender As Object, e As EventArgs) Handles ButPagePlus.Click
Dim RecupTextbox1 As Integer = TextBox1.Text
Dim RecupTextbox2 As Integer = TextBox2.Text
If RecupTextbox1 < RecupTextbox2 Then
PrintPreviewControl1.StartPage = RecupTextbox1
TextBox1.Text = RecupTextbox1 + 1
End If
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
PrintPreviewControl1.Document = PrintDocument1
pageNum = 0
PrintDocument1.DefaultPageSettings.Landscape = True
End Sub


End Class

j'ai donc ce résultat


Si je place un truc dans le style, si la position de mon conteneur est supérieure à 800, je passe logiquement à la page suivante et soudain c'est le drame :)
                PosConteneur = RectangleConteneur.Location.Y + RectangleConteneur.Height + 10
PosConTSurPage = RectangleConteneur.Location.Y + RectangleConteneur.Height + 2
Label5.Text -= 1
NbreCmd -= 1

If PosConteneur > 800 Then
e.HasMorePages = True
pageNum = +1
TextBox1.Text = 1
TextBox2.Text = pageNum
PosConteneur = 40
XPosTexte = 50
Else
e.HasMorePages = False
End If

End While
rdCmd.Close()
Mysqlconn.Close()

Catch ex As Exception
Mysqlconn.Close()
Mysqlconn2.Close()
Mysqlconn3.Close()
Mysqlconn4.Close()
MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try


Ce qui donne à l'affichage
0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
20 avril 2021 à 22:10
Bonsoir et merci pour votre réponse.
En effet je me suis raté sur mon post au sujet de la présentation du code et je vais veiller à ce que cela ne se reproduise pas :)
Pour ce qui concerne la différence en VB6 et VB Net j'avoue que je m'étais pas penché sur les réelles différences et je vais avouer que je développe ma solution avec les deux.
Cela peut-il poser un réel problème de combiner les deux ?
Je suis pas un expert en VB6 ou VB Net mais plus bidouille en mode novice et découverte, pour arriver à réaliser mon projet.( que ça soit fonctionnel )
Mais je suis totalement partant pour faire les choses au mieux.
j'ai donc suivi vos conseils et j'ai donc effectué les modifications sur mon code ( en espérant que ça corresponde bien )

Le code modifié :
Imports MySql.Data.MySqlClient
Public Class PrintTest5

    Private SelectSemaine As Integer = 15 ' la semaine sélectionnée 
    Private SelectAnnee As Integer = 2021 ' l'année sélectionnée
    Private NbreCmd As Integer ' le nombre total de commandes à afficher ( rectangles )
    Private NbreRectParPage As Integer ' le nombre de rectangles àafficher par parge
    Private LargPage As Integer ' la largeur de la page à imprimer mode paysage
    Private HautPage As Integer ' la hauteur de la page à imprimer Mode paysage 
    Private BoundTopPage As Integer
    Private BoundHeight As Integer
    Private BoundWidth As Integer
    Private pageNum As Integer ' le numero de la page 
    Private PoliceEnGras As New Font("Arial", 12, FontStyle.Bold)
    Private PoliceNormale As New Font("Arial", 11)
    Private IdCmde As Integer
    Private PosConteneur As Integer
    Private PosConTSurPage As Integer
    Private PosTopCont As Integer
    Private XPosTexte, YPosTexte As Single


    Private Sub PrintTest5_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CentrageGrpBox()
        ComptNbreCmd()
        Label5.Text = CType(NbreCmd, String)
    End Sub


    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Try
            LargPage = e.PageSettings.PaperSize.Height
            HautPage = e.PageSettings.PaperSize.Width
            BoundTopPage = e.PageBounds.Top
            BoundHeight = e.PageBounds.Height
            BoundWidth = e.PageBounds.Width

            PosConteneur = 40
            XPosTexte = 50
            Dim SautLigne As Single = 20

            Dim HauteurConteneur As Single

            Dim StfTitre, StfSem, StfDate As StringFormat
            Dim FontTitre, FontSem, FontDate, FontTitreCont As Font
            FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point)
            StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near}
            StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center}
            StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far}
            Dim RectEntete, RectPied, RectangleConteneur As RectangleF
            RectEntete = New RectangleF(5, BoundTopPage + 5, BoundWidth - 10, 30)
            RectPied = New RectangleF(5, BoundHeight - 25, BoundWidth - 10, 20)

            Dim LeTitre As String = "Liste des départs "
            Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy")
            Dim LaSem As String = "Semaine " & "15 " & "Année " & "2021"



            'en-tête 
            e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete))
            e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre)
            e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem)
            e.Graphics.DrawString(LaDate & " (Page n°" & pageNum & " / " & pageNum & ")", FontDate, Brushes.Black, RectEntete, StfDate)


            'Le contenu 
            Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer
            Dim NomClient, RefCmd, CdePostalCli As String
            FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)

            Mysqlconn.Open()
            Dim sqlCdeCmd As New MySqlCommand
            Dim rdCmd As MySqlDataReader
            sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY  CdePostalLivClient,ClientCmd  " 'ORDER BY ClientCmd "
            sqlCdeCmd.Connection = Mysqlconn
            rdCmd = sqlCdeCmd.ExecuteReader

            While rdCmd.Read

                IdCmde = CInt(rdCmd("idCmde"))
                NomClient = CType(rdCmd("ClientCmd"), String)
                RefCmd = CType(rdCmd("RefCmd"), String)
                CdePostalCli = CType(rdCmd("CdePostalLivClient"), String)

                ReSulComptProSimp = CInt(NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'"))
                ReSulComptProComp = CInt(NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'"))
                ResulComElemCompose = CInt(NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'"))
                ReSulComptTmpsDiv = CInt(NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'"))


                RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, HauteurConteneur)
                e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur))

                Dim CalculTotalLignes = ReSulComptProSimp + ReSulComptProComp + ResulComElemCompose + ReSulComptTmpsDiv

                If CalculTotalLignes = 0 Then
                    RectangleConteneur.Height = 30
                Else
                    RectangleConteneur.Height = (SautLigne * CalculTotalLignes) + (SautLigne * 3)
                End If

                RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, RectangleConteneur.Height)
                e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur))


                e.Graphics.DrawString("CLIENT : " & NomClient & " /  REF : " & RefCmd & " /  DEP : " & CdePostalCli, PoliceEnGras, Brushes.Black, XPosTexte, RectangleConteneur.Top + 5) ' RectangleConteneur.Top)
                YPosTexte = RectangleConteneur.Top + 5 + SautLigne

                If ReSulComptProSimp > 0 Then
                    e.Graphics.DrawString("-Châssis Simple :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
                    YPosTexte = YPosTexte + SautLigne
                    Mysqlconn3.Open()
                    Dim sqlCChasSimple As New MySqlCommand
                    Dim RdChasSimple As MySqlDataReader
                    sqlCChasSimple.CommandText = "select * FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'  "
                    sqlCChasSimple.Connection = Mysqlconn3
                    RdChasSimple = sqlCChasSimple.ExecuteReader
                    While RdChasSimple.Read
                        e.Graphics.DrawString("---" & RdChasSimple("NomProdcmdprod").ToString & " Quantité : " & RdChasSimple("QteProdcmdprod").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
                        YPosTexte = YPosTexte + SautLigne
                    End While
                    RdChasSimple.Close()
                    Mysqlconn3.Close()
                End If

                If ReSulComptProComp > 0 Then
                    e.Graphics.DrawString("-Châssis Composé :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
                    YPosTexte = YPosTexte + SautLigne
                    Mysqlconn3.Open()
                    Dim sqlCChasComp As New MySqlCommand
                    Dim RdChasComp As MySqlDataReader
                    sqlCChasComp.CommandText = "select * FROM cmdcompos WHERE IdCmd='" & IdCmde & "' "
                    sqlCChasComp.Connection = Mysqlconn3
                    RdChasComp = sqlCChasComp.ExecuteReader
                    While RdChasComp.Read
                        e.Graphics.DrawString("---" & RdChasComp("NomCmdCompos").ToString & " Quantité : " & RdChasComp("QtecdmComp").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
                        YPosTexte = YPosTexte + SautLigne
                        Mysqlconn4.Open()
                        Dim sqlCElemComp As New MySqlCommand
                        Dim RdElemComp As MySqlDataReader
                        sqlCElemComp.CommandText = "select * FROM cmdcompelem WHERE IdDuCompose='" & RdChasComp("IdcmdCompos").ToString & "'  "
                        sqlCElemComp.Connection = Mysqlconn4
                        RdElemComp = sqlCElemComp.ExecuteReader
                        While RdElemComp.Read
                            e.Graphics.DrawString("------" & RdElemComp("TypeElement").ToString & " Désignation : " & RdElemComp("DesigElement").ToString & " Quantité : " & RdElemComp("QteProdcmdprod").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
                            YPosTexte = YPosTexte + SautLigne
                        End While
                        RdElemComp.Close()
                        Mysqlconn4.Close()
                    End While
                    RdChasComp.Close()
                    Mysqlconn3.Close()
                End If

                If ReSulComptTmpsDiv > 0 Then
                    e.Graphics.DrawString("-Temps Divers :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
                    YPosTexte = YPosTexte + SautLigne
                    Mysqlconn3.Open()
                    Dim sqlCChasTmpDiv As New MySqlCommand
                    Dim RdChasTmpDiv As MySqlDataReader
                    sqlCChasTmpDiv.CommandText = "select * FROM cmdprotd WHERE IdCmd='" & IdCmde & "'  " 'ORDER BY ClientCmd "
                    sqlCChasTmpDiv.Connection = Mysqlconn3
                    RdChasTmpDiv = sqlCChasTmpDiv.ExecuteReader
                    While RdChasTmpDiv.Read
                        e.Graphics.DrawString("---" & RdChasTmpDiv("DesiTd").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
                        YPosTexte = YPosTexte + SautLigne
                    End While
                    RdChasTmpDiv.Close()
                    Mysqlconn3.Close()

                End If

                PosConteneur = CInt(RectangleConteneur.Location.Y + RectangleConteneur.Height + 10)
                PosConTSurPage = CInt(RectangleConteneur.Location.Y + RectangleConteneur.Height + 2)

                NbreCmd -= 1

                If PosConteneur > 800 Then
                    e.HasMorePages = True
                    pageNum = +1
                    TextBox1.Text = CType(1, String)
                    TextBox2.Text = CType(pageNum, String)
                    PosConteneur = 40
                    XPosTexte = 50
                Else
                    e.HasMorePages = False
                End If

            End While
            rdCmd.Close()
            Mysqlconn.Close()

        Catch ex As Exception
            Mysqlconn.Close()
            Mysqlconn2.Close()
            Mysqlconn3.Close()
            Mysqlconn4.Close()
            MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub


    Private Sub CentrageGrpBox()
        GroupBox1.Top = (Me.Height - GroupBox1.Height) \ 2
        GroupBox1.Left = (Me.Width - GroupBox1.Width) \ 2
        GroupBox1.Location = New Point(GroupBox1.Left)
    End Sub

    Public Function NbreData(ByVal RequetCompteData As String) As Object
        Mysqlconn2.Open()
        Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2)
        Dim i As Integer = CInt(cmd.ExecuteScalar())
        cmd = Nothing
        Mysqlconn2.Close()
        Return i
    End Function

    Private Sub ComptNbreCmd()
        Try
            Dim ReqMysqlCountCmd = CompterNbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ")
            NbreCmd = CInt(ReqMysqlCountCmd)
        Catch ex As Exception
            MessageBox.Show("Erreur: " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub

    Private Sub ButPagePlus_Click(sender As Object, e As EventArgs) Handles ButPagePlus.Click
        Dim RecupTextbox1 As Integer = CInt(TextBox1.Text)
        Dim RecupTextbox2 As Integer = CInt(TextBox2.Text)
        If RecupTextbox1 < RecupTextbox2 Then
            PrintPreviewControl1.StartPage = RecupTextbox1
            TextBox1.Text = CType(RecupTextbox1 + 1, String)
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        PrintPreviewControl1.Document = PrintDocument1
        pageNum = 0
        PrintDocument1.DefaultPageSettings.Landscape = True
    End Sub


End Class
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
20 avril 2021 à 23:22
Bonjour
1) Vous dîtes développer votre projet avec les deux ( en parlant de VB6 et VB Net ) .
C'est faux . Vous développez bien en VB NET mais VB NET permet l'utilisation de commandes VB 6 par l'intermédiaire de la Référence Microsoft VisualBasic .
Microsoft ( le créateur de ces 2 langages ) ne voulait pas perdre les nombreux VB6istes lors de la création de VB Net et a donc inclus dans VB NET la possibilité d'utiliser des mots clés de VB 6 .
C'est un peu comme mélanger les torchons et les serviettes dans la machine à laver .
Si on programme en VB NET autant tout programmer en vrai VB Net .

2) Maintenant tout n'est pas à convertir avec la méthode convert.ToXXXX .
prenons ce cas :
Label5.Text = CType(NbreCmd, String)

On veut afficher dans un Label la valeur de NbreCmd qui est un valeur de type Integer
Le code correct est :
Label5.Text = NbreCmd.ToString)


3) autre souci
Prenons ce code :
Public Function NbreData(ByVal RequetCompteData As String) As Object
        Mysqlconn2.Open()
        Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2)
        Dim i As Integer = CInt(cmd.ExecuteScalar())
        cmd = Nothing
        Mysqlconn2.Close()
        Return i
    End Function

il retourne une valeur entière . Pourquoi mettre la Function avec le type générique Object . Mettez-le avec le type Integer directement .
    ''' <summary>
    ''' retourne le nombre de requêtes dans RequetCompteData
    ''' </summary>
    ''' <param name="RequetCompteData"></param>
    ''' <returns></returns>
    Public Function NbreData(ByVal RequetCompteData As String) As Integer
        Mysqlconn2.Open()
        Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2)
        Dim Valeur As Integer = CInt(cmd.ExecuteScalar())
        cmd = Nothing
        Mysqlconn2.Close()
        Return Valeur
    End Function

On préfère garder les variables i, j, k d'une seule lettre pour les boucles For .... Next

Pour avoir les lignes <summary> et les suivantes créez une ligne vide au-dessus de la ligne définissant votre Function ou Sub et tapez 3 apostrophes . Les lignes se créeront automatiquement et vous permettront de commenter le rôle de la Function ou de la Sub .

NbreData renvoyant une valeur Integer , inutile aux lignes suivantes de mettre Cint car NbreData est déjà un Integer .
ReSulComptProSimp = CInt(NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'"))
                ReSulComptProComp = CInt(NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'"))
                ResulComElemCompose = CInt(NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'"))
                ReSulComptTmpsDiv = CInt(NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'"))




De mon côté j'essaie de comprendre votre code et je m'y perds un peu . Pouvez-vous le commenter au maximum .
Exemple : que signifient les valeurs ReSulComptProSimp, ReSulComptProComp , ResulComElemCompose, ReSulComptTmpsDiv par exemple .

Et pour finir un cours VB Net qui est mon livre de chevet et ma référence principale en VB Net : https://plasserre.developpez.com/cours/vb-net/ .
Prenez le temps de le potasser car c'est une mine d'or côté programmation VB Net
il y a aussi celui-ci qui est plus concis mais tout aussi bien : https://tahe.developpez.com/dotnet/vbnet/

Je suis entrain de réfléchir et je me demande si on ne fait pas fausse route dans notre façon de voir . On cherche à savoir le nombre de conteneurs sur une page ainsi que le nombre de lignes à imprimer et on imprime la page .
Je me demande si cela ne serait pas mieux de déterminer le contenu de toutes les pages avec le nombre de conteneurs et le nombre de lignes et une fois toutes les pages définies de procéder à leur impression .




0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
21 avril 2021 à 15:10
Bonjour,
merci pour toutes ces infos et je suis rassuré pour ce qui concerne le fait de pouvoir utiliser les commandes de VB6 dans ma solution.
Je vais donc devoir changer mon livre de chevet et donc devoir me séparer de mes revues pornographiques :)
Plus sérieusement j'ai repris une fois de plus le code suivant vos conseils, commenté un maximum ( pour mieux comprendre le fonctionnement en effet )
j'ai aussi viré ce qui ne sert à rien ( j'ai viré le e.HasMorePages que j'avais positionné )
ce qui donne :
Imports MySql.Data.MySqlClient
Public Class PrintTest5

    Private SelectSemaine As Integer = 15 ' la semaine sélectionnée 
    Private SelectAnnee As Integer = 2021 ' l'année sélectionnée
    Private NbreCmd As Integer ' le nombre total de commandes à afficher ( rectangles )
    Private NbreRectParPage As Integer ' le nombre de rectangles àafficher par parge
    Private LargPage As Integer ' la largeur de la page à imprimer mode paysage
    Private HautPage As Integer ' la hauteur de la page à imprimer Mode paysage 
    Private BoundTopPage As Integer
    Private BoundHeight As Integer
    Private BoundWidth As Integer
    Private pageNum As Integer ' le numero de la page 
    Private PoliceEnGras As New Font("Arial", 12, FontStyle.Bold)
    Private PoliceNormale As New Font("Arial", 11)
    Private IdCmde As Integer ' id de la commande
    Private PosConteneur As Integer ' position du conteneur ( le rectangle qui contient les données ) 
    Private XPosTexte, YPosTexte As Single ' position du texte dans le conteneur


    Private Sub PrintTest5_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CentrageGrpBox() ' on centre le groupbox 
        ComptNbreCmd() ' on compte le nombre de commandes
        Label5.Text = NbreCmd.ToString
    End Sub


    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
        Try
            LargPage = e.PageSettings.PaperSize.Height ' non utilisé 
            HautPage = e.PageSettings.PaperSize.Width ' non utilisé 
            BoundTopPage = e.PageBounds.Top ' limite la hauteur de la page 
            BoundHeight = e.PageBounds.Height ' non utilisé 
            BoundWidth = e.PageBounds.Width ' limite la largeur de la page 

            PosConteneur = 40 ' position de départ du 1er conteneur
            XPosTexte = 50 ' position du texte sur les X 
            Dim SautLigne As Single = 20 ' hauteur de la ligne du conteneur



            Dim StfTitre, StfSem, StfDate As StringFormat
            Dim FontTitre, FontSem, FontDate As Font
            FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
            FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point)
            StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near}
            StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center}
            StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far}
            Dim RectEntete, RectangleConteneur As RectangleF
            RectEntete = New RectangleF(5, BoundTopPage + 5, BoundWidth - 10, 30) ' paramètre du rectangle de l'en-tête
            Dim LeTitre As String = "Liste des départs "
            Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy")
            Dim LaSem As String = "Semaine " & "15 " & "Année " & "2021"



            'en-tête 
            e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete)) ' on dessine le rectangle d'en-tête
            e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre) ' on dessine le titre de l'en-tête
            e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem) ' on dessine la semaine de l'en-tête
            e.Graphics.DrawString(LaDate & " (Page n°" & pageNum & " / " & pageNum & ")", FontDate, Brushes.Black, RectEntete, StfDate) ' on dessine la date et numero de page de l'en-tête


            'Le contenu 
            Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer
            Dim NomClient, RefCmd, CdePostalCli As String
            FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)



            Mysqlconn.Open()
            Dim sqlCdeCmd As New MySqlCommand
            Dim rdCmd As MySqlDataReader
            sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY  CdePostalLivClient,ClientCmd  " ' on récupére les commandes qui sont dans certain état d'avancement 
            sqlCdeCmd.Connection = Mysqlconn
            rdCmd = sqlCdeCmd.ExecuteReader

            While rdCmd.Read

                IdCmde = CInt(rdCmd("idCmde")) ' on récupére l'id de la commande 
                NomClient = CType(rdCmd("ClientCmd"), String) ' on récupére le nom du client 
                RefCmd = CType(rdCmd("RefCmd"), String) ' on récupére la référence de la commande
                CdePostalCli = CType(rdCmd("CdePostalLivClient"), String) ' on récupére le code postal du client




                ReSulComptProSimp = NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'") ' on compte le nombre de produits simple ( suivant l'id de la commande ) 
                ReSulComptProComp = NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'") ' on compte le nombre de produits composés ( suivant l'id de la commande ) 
                ResulComElemCompose = NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'") ' on compte le nombre d'éléments dans le produit composé ( suivant l'id de la commande ) 
                ReSulComptTmpsDiv = NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'") ' on compte le nombre de produits divers ( suivant l'id de la commande ) 


                Dim CalculTotalLignes = ReSulComptProSimp + ReSulComptProComp + ResulComElemCompose + ReSulComptTmpsDiv ' on additionne le nombre de produits pour déterminer le nombre de lignes totales

                If CalculTotalLignes = 0 Then
                    RectangleConteneur.Height = 30 ' on détermine la hauteur du conteneur si il n'y a pas de données ( dans la logique elle ne sera jamais vide ) 
                Else
                    RectangleConteneur.Height = (SautLigne * CalculTotalLignes) + (SautLigne * 3) ' on détermine la hauteur du conteneur suivant le nombres d'enregistrements dans la BD 
                End If

                RectangleConteneur = New RectangleF(50, PosConteneur, LargPage - 100, RectangleConteneur.Height) ' paramètres du conteneur
                e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur)) ' on déssine le conteneur suivant les paramètres 


                e.Graphics.DrawString("CLIENT : " & NomClient & " /  REF : " & RefCmd & " /  DEP : " & CdePostalCli, PoliceEnGras, Brushes.Black, XPosTexte, RectangleConteneur.Top + 5) ' on déssine la 1ere ligne du conteneur ( Client / Référence / département )  
                YPosTexte = RectangleConteneur.Top + 5 + SautLigne ' on calcule la position pour la nouvelle ligne du conteneur 

                ' si la commande comporte des produits simple nous les affichons 
                If ReSulComptProSimp > 0 Then
                    e.Graphics.DrawString("-Châssis Simple :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
                    YPosTexte = YPosTexte + SautLigne ' on calcule la position pour la nouvelle ligne du conteneur
                    Mysqlconn3.Open()
                    Dim sqlCChasSimple As New MySqlCommand
                    Dim RdChasSimple As MySqlDataReader
                    sqlCChasSimple.CommandText = "select * FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'  "
                    sqlCChasSimple.Connection = Mysqlconn3
                    RdChasSimple = sqlCChasSimple.ExecuteReader
                    While RdChasSimple.Read
                        e.Graphics.DrawString("---" & RdChasSimple("NomProdcmdprod").ToString & " Quantité : " & RdChasSimple("QteProdcmdprod").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
                        YPosTexte = YPosTexte + SautLigne
                    End While
                    RdChasSimple.Close()
                    Mysqlconn3.Close()
                End If

                ' si la commande comporte des produits composés nous les affichons 
                If ReSulComptProComp > 0 Then
                    e.Graphics.DrawString("-Châssis Composé :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
                    YPosTexte = YPosTexte + SautLigne
                    Mysqlconn3.Open()
                    Dim sqlCChasComp As New MySqlCommand
                    Dim RdChasComp As MySqlDataReader
                    sqlCChasComp.CommandText = "select * FROM cmdcompos WHERE IdCmd='" & IdCmde & "' "
                    sqlCChasComp.Connection = Mysqlconn3
                    RdChasComp = sqlCChasComp.ExecuteReader
                    While RdChasComp.Read
                        e.Graphics.DrawString("---" & RdChasComp("NomCmdCompos").ToString & " Quantité : " & RdChasComp("QtecdmComp").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
                        YPosTexte = YPosTexte + SautLigne

                        'nous affichons les éléments du produit composé 
                        Mysqlconn4.Open()
                        Dim sqlCElemComp As New MySqlCommand
                        Dim RdElemComp As MySqlDataReader
                        sqlCElemComp.CommandText = "select * FROM cmdcompelem WHERE IdDuCompose='" & RdChasComp("IdcmdCompos").ToString & "'  "
                        sqlCElemComp.Connection = Mysqlconn4
                        RdElemComp = sqlCElemComp.ExecuteReader
                        While RdElemComp.Read
                            e.Graphics.DrawString("------" & RdElemComp("TypeElement").ToString & " Désignation : " & RdElemComp("DesigElement").ToString & " Quantité : " & RdElemComp("QteProdcmdprod").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
                            YPosTexte = YPosTexte + SautLigne
                        End While
                        RdElemComp.Close()
                        Mysqlconn4.Close()
                    End While
                    RdChasComp.Close()
                    Mysqlconn3.Close()
                End If


                ' si la commande comporte des produits divers nous les affichons
                If ReSulComptTmpsDiv > 0 Then
                    e.Graphics.DrawString("-Temps Divers :", PoliceEnGras, Brushes.Black, XPosTexte, YPosTexte)
                    YPosTexte = YPosTexte + SautLigne
                    Mysqlconn3.Open()
                    Dim sqlCChasTmpDiv As New MySqlCommand
                    Dim RdChasTmpDiv As MySqlDataReader
                    sqlCChasTmpDiv.CommandText = "select * FROM cmdprotd WHERE IdCmd='" & IdCmde & "'  " 'ORDER BY ClientCmd "
                    sqlCChasTmpDiv.Connection = Mysqlconn3
                    RdChasTmpDiv = sqlCChasTmpDiv.ExecuteReader
                    While RdChasTmpDiv.Read
                        e.Graphics.DrawString("---" & RdChasTmpDiv("DesiTd").ToString, PoliceNormale, Brushes.Black, XPosTexte, YPosTexte)
                        YPosTexte = YPosTexte + SautLigne
                    End While
                    RdChasTmpDiv.Close()
                    Mysqlconn3.Close()
                End If


                PosConteneur = CInt(RectangleConteneur.Location.Y + RectangleConteneur.Height + 10) ' on calcule ici la position du conteneur suivant 

                NbreCmd -= 1 'je soustrais la commande traitée au nobre total de commande à traiter 

            End While
            rdCmd.Close()
            Mysqlconn.Close()

        Catch ex As Exception
            Mysqlconn.Close()
            Mysqlconn2.Close()
            Mysqlconn3.Close()
            Mysqlconn4.Close()
            MessageBox.Show("Erreur d'impression : " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub


    Private Sub CentrageGrpBox()
        GroupBox1.Top = (Me.Height - GroupBox1.Height) \ 2
        GroupBox1.Left = (Me.Width - GroupBox1.Width) \ 2
        GroupBox1.Location = New Point(GroupBox1.Left)
    End Sub

    ''' <summary>
    ''' compte le nombres d'enregistrements que comporte la commande 
    ''' </summary>
    ''' <param name="RequetCompteData"></param>
    ''' <returns></returns>
    Public Function NbreData(ByVal RequetCompteData As String) As Integer
        Mysqlconn2.Open()
        Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2)
        Dim Valeur As Integer = CInt(cmd.ExecuteScalar())
        cmd = Nothing
        Mysqlconn2.Close()
        Return Valeur
    End Function

    Private Sub ComptNbreCmd()
        Try
            Dim ReqMysqlCountCmd = CompterNbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ")
            NbreCmd = CInt(ReqMysqlCountCmd)
        Catch ex As Exception
            MessageBox.Show("Erreur: " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
    End Sub

    Private Sub ButPagePlus_Click(sender As Object, e As EventArgs) Handles ButPagePlus.Click
        Dim RecupTextbox1 As Integer = CInt(TextBox1.Text)
        Dim RecupTextbox2 As Integer = CInt(TextBox2.Text)
        If RecupTextbox1 < RecupTextbox2 Then
            PrintPreviewControl1.StartPage = RecupTextbox1
            TextBox1.Text = CType(RecupTextbox1 + 1, String)
        End If
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        PrintPreviewControl1.Document = PrintDocument1
        pageNum = 0
        PrintDocument1.DefaultPageSettings.Landscape = True
    End Sub


End Class

Je rejoins la dernière méthode que vous avez énumérée
"Je me demande si cela ne serait pas mieux de déterminer le contenu de toutes les pages avec le nombre de conteneurs et le nombre de lignes et une fois toutes les pages définies de procéder à leur impression "
ce qui implique de revoir toute la structure du code j'imagine.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
21 avril 2021 à 18:18
Bonjour
N'utilisez point les anciennes commandes VB6 car
1) un jour ou l'autre elles disparaîtront .
2) la dernière mise à jour de VB6 date de 1998 ( si l'on omet si les mises à jour système qui ont eu lieu jusqu'en 2005)
3) VB Net évolue à la vitesse grand V . On en est à VB Net 2019 maintenant .
Puis-je savoir quelle version de Visual Studio Net vous utilisez ? Ou quelle version de VB Net vous utilisez si lui seul est installé sur votre PC ?

J'ai écrit : "Je me demande si cela ne serait pas mieux de déterminer le contenu de toutes les pages avec le nombre de conteneurs et le nombre de lignes et une fois toutes les pages définies de procéder à leur impression "
Evidemment cela va changer la structure du code
J'ai déjà travaillé travailler là-dessus .
Je vous donne ici le schéma directeur du code que j'ai pondu .
1) On fait le centrage de la Groupbox1 ( En passant quelle est sont rôle ? J'en ai déduit qu'elle sert de conteneur pour les différents rectangles (l'entête, les rectangles conteneurs des données et le pied de page ) à l'affichage
2) CompteNbreCmd : je l'ai laissé pour l'instant . Quel est sont rôle ?
3) Le plus important : Lecture de la base de données .

Pour la lecteur de la base de données je crée un objet ClassRectangle . Celui-ci comprend :
- les lignes de données affichées
- la police de chaque ligne
- le nombre de lignes
- la hauteur du rectangle
Chacun de ces objets est le représentation d'un rectangle à afficher et à imprimer .

On crée aussi une collection d'objet ClassRectangle ( un peu comme un tableau mais en plus puissant et plus simple à manipuler ) . Chaque fois que j'ai fini de créer un Rectangle je l'ajoute à la collection .

Pour l'instant on ne s'occupe nullement d'un affichage à l'écran ou d'une impression . On en est à le construction des données nécessaires pour le projet .

Maintenant pour que je puisse avancer il me faut quelques précisions .
1)
        Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer
        Dim NomClient, RefCmd, CdePostalCli As String
        ListContenusRectangle = New List(Of ClassContenuRectangle)
        Mysqlconn.Open()
        Dim sqlCdeCmd As New MySqlCommand
        Dim rdCmd As MySqlDataReader
        sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY  CdePostalLivClient,ClientCmd  " 'ORDER BY ClientCmd "
        sqlCdeCmd.Connection = Mysqlconn
        rdCmd = sqlCdeCmd.ExecuteReader
        While rdCmd.Read
              ' rdCmd.Read permet-il de lire les informations contenues dans les différentes tables de la base de données pour un seul et unique rectangle pour une commande client?
              

        End While


2)
Private Sub ComptNbreCmd()

        Try
            Dim ReqMysqlCountCmd = CompterNbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ")
            NbreCmd = CInt(ReqMysqlCountCmd)
        Catch ex As Exception
            MessageBox.Show("Erreur: " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            NbreCmd = 0
        End Try

    End Sub

Pouvez-vous me mettre le code de CompterNbreData pour en déduire le type correct de
Dim ReqMysqlCountCmd as ?????????


3) Sur le message n° 7 vous présenter un affichage de la Form PrintTest5 . J'ai remarqué pas mal de boutons, label et autres contrôles . Pour l'instant je proposerai d'épurer cette Form afin d'afficher uniquement les rectangles de la base de données . Ensuite une fois ceci fait on pourra gérer le déplacement dans les différents rectangles, l'affichage des différentes pages ainsi que leur impression .
J'attends votre réponse afin de refaire le design de la Form PrintTest5 .

4) Je suppose que la déclaration de la base de données ainsi que sa chaine de connexion sont aussi incluses dans PrintTest5 . Si ce n'est pas le cas comment faut-il faire pour accéder à la base de données ?

5) Votre projet comporte une Form PrintTest5 . Cette Form permet de naviguer dans les pages à imprimer et de les imprimer si nécessaire . Faut-il gérer l'impression pour une seule page ou pour l'ensemble de toutes les pages ?
Y-a-t 'il d'autres Forms dans votre projet ? Si oui quelles sont-elles et quelles sont leurs rôles ?

6) Les différents contrôles peuvent avoir un nom . Ainsi pour un Label qui affiche un prix de vente par exemple mieux vaut l'appeler LblPrixVente que Label15 par exemple . Et ceci est valable pour tous les contrôles .

Beaucoup de questions oui mais pour faire un code qui tienne la route elles sont nécessaires .

Ps : je suis retraité et une de mes passions est la programmation . A nous deux je pense que nous mènerons ce projet à bien sans trop de souci .
0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
22 avril 2021 à 14:50
Bonjour,
J'ai vu votre post hier soir, mais hélas j’étais en très bonne compagnie et je ne pouvais répondre.
Désolé de la réponse tardive.
J'apporte donc les réponses à vos questions, mais avant toutes choses, je tiens particulièrement à vous remercier pour l'attention et l'implication que vous portez pour ce post.

1) Puis-je savoir quelle version de Visual Studio Net vous utilisez ?
- c'est une version 2015 Professionnal ( update 3 )
- Visual basic 2015
2) Pour la base de donnée j'utilise Mysql version 5.7

3) Je suppose que la déclaration de la base de données ainsi que sa chaine de connexion sont aussi incluses dans PrintTest5
-Non elle est placée sur un module que j'utilise pour tout le reste de ma solution
'Chemin du fichier ini 
    Public INI_File As New IniFile(My.Application.Info.DirectoryPath + "/Config/Config.ini")
'Lecture de l'Adresse du serveur base de donnée Mysql ( ip ou locahost ) sur le fichier config
    Public Urlserveur = INI_File.GetString("Serveur-BD", "Url", "(none)").ToString
'Le mot de passe
Public Pass_sql As String = "Mon Mot de passe"
'connexion à la bd
Public Mysqlconn As New MySqlConnection("server=""" & Urlserveur & """; user id = " & UserBaseDonnee & "  ;password= " & Pass_sql & " ;database=" & BaseDonnee & "")


4) "1) On fait le centrage de la Groupbox1....."
-Non il est pas utilisé pour les conteneurs (vous allez comprendre en regardant l'image ci-dessous )


le bouton 1 est placé pour lancer la prévisualisation, c'est temporaire car elle sera chargée dés l'ouverture de la form, pour faire plus simple cette form sert de prévisualisation avant impression.

5) Pour votre question n°5 : "Votre projet comporte une Form PrintTest5 . Cette Form permet de naviguer "
- La totalité des pages sera suffisante, l'utilisateur pourra l'imprimer en PDF et par la suite en fera ce qu'il veut.

6) Y-a-t 'il d'autres Forms dans votre projet ?
- Oui beaucoup même :)
Pour vous résumer ma solution sert à :
-Planifier une commande suivant une semaine
-Indiquer dans celle-ci un tas de produits ( qui concerne la menuiserie )
-Permettre de valoriser le prix de vente de chaque commandes
-Permettre de valoriser le prix de vente de chaque fournisseurs
-Permettre de calculer des marges ... bénéfices .... statistiques
-Permettre de faire un suivi ( avec différents états , Planification .... Mise en production .... livraison ( complète ou partielle ) .... facturation
-Et un tas d'autres idées que j'ai en tête qui viendrons par la suite.
La partie que nous essayons de régler est en fait au niveau de la gestion des départs de commande suivant la semaine et cette impression va servir à la personne qui s'occupe des chargements.(camion )
c'est la partie la plus délicate en fait que j'ai eu au cours du développement, tout le reste est plus ou moins terminé.
Mais bon suivant tous vos conseil je vais devoir reprendre pas mal de choses (petit à petit) histoire de bien faire les choses.

7) ' rdCmd.Read permet-il de lire les informations contenues dans les différentes tables de la base de données pour un seul et unique rectangle pour une commande client?
- Oui et non il a pour but de lire et récupérer l'id des commandes à afficher, le nom du client , la référence sur une table "commande" et le département du client sur une table "Client"

8) Pouvez-vous me mettre le code de CompterNbreData pour en déduire le type correct de Dim ReqMysqlCountCmd as ?????????
- Il est identique la fonction NbreData
    Public Function NbreData(ByVal RequetCompteData As String) As Integer
        Mysqlconn2.Open()
        Dim cmd As New MySqlCommand(RequetCompteData, Mysqlconn2)
        Dim Valeur As Integer = CInt(cmd.ExecuteScalar())
        cmd = Nothing
        Mysqlconn2.Close()
        Return Valeur
    End Function

il permet de compter le nombre de commande que nous avons à imprimer (il ne sert à rien dans le code que j'ai pondu, juste un repère pour faire des tests au niveau du e.HasMorePages )

j’espère avoir répondu à l'ensemble de vos questions :)
Il faudrait que je participe un peu non ? :)

Ps à votre Ps : Il me reste minimum 15 ans avant d'y être aussi ( pour la retraite ) et j’espère que j'aurais accumulé autant de connaissances que vous en matière de programmation :)
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
22 avril 2021 à 15:35
Bonjour
Merci pour les réponses .
De mon côté j'ai beaucoup avancé et suis pour ainsi dire arrivé à un code qui devrait être fonctionnel . Mais je ne peux rien tester malheureusement .
Quelques points de détail cependant :
1)
Vous m'avez répondu : 8) Pouvez-vous me mettre le code de CompterNbreData pour en déduire le type correct de Dim ReqMysqlCountCmd as ?????????
- Il est identique la fonction NbreData


Pourquoi ne pas se servir de NbreData directement alors ? Car si vous vous n'en avez pas besoin moi si . Et il ne sert à rien de coder 2 Sub de noms différents qui font la même chose .

2) Vous m'avez répondu : 7) ' rdCmd.Read permet-il de lire les informations contenues dans les différentes tables de la base de données pour un seul et unique rectangle pour une commande client?
- Oui et non il a pour but de lire et récupérer l'id des commandes à afficher, le nom du client , la référence sur une table "commande" et le département du client sur une table "Client"


While rdCmd.Read
        ''' Code pour afficher un conteneur
        ''' etc .....
End While

Le but de ma question était de savoir si dans la boucle While ...... End While on ne traitait qu'un seul conteneur avec les informations à rentrer dans le rectangle adéquat . Et je suppose qu'un conteneur rectangle ne contient qu'une seule commande .

3) Pour la connexion à la BDD pas de souci si elles sont gérées dans un module

4) Pour le Groubox1 j'ai pigé : il sert de conteneur pour les boutons de commandes en haut de la Form . Si vous l'aviez nommé Groupcommandes par exemple j'aurais compris que c'était la Groupbox avec les boutons . Je reviens sur le fait qu'il est primordial de donner un nom parlant aux différents contrôles . Ainsi dans le code on ne se demande pas c'est quoi Textbox1 par exemple .

5) Compris pour le nombre de Forms dans le projet .

6) Visual Basic 2015 Pro est largement suffisant surtout que les mises à jour sont toujours disponibles .

Dès que je reçois votre réponse je fignole le code de la Form PrintTest5 et vous le fais parvenir pour test en croisant les doigts pour que cela fonctionne .

0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
Modifié le 22 avril 2021 à 17:25
Re :)

Pour vos questions :

1) tout à fait il était en doublon donc nous pouvons utiliser celui-ci, au départ j'ai utilisé celui de mon module et je sais pas pourquoi j'ai créé le 2eme qui se trouve sur la Form PrintTest5 ...

2)Oui le conteneur doit contenir une seule et même commande avec ses éléments ex :
( sur le plus grand conteneur, je vous ai représenté ce qu'affiche les ExecuteReader )


3) Pour la gestion des connexions Bd c'est ok donc

4) Oui en effet c'est plus simple et ça fait partie des corrections que je vais apporter à l'ensemble de ma solution.
j'avoue que je finis par m'y perdre aussi, j'ai intérêt à me reprendre au niveau de ce problème !

je testerai avec plaisir tout ça :) et j'avoue que j'en suis impatient.

Merci beaucoup ( je surveille tout ça de près pour aujourd'hui, rien de prévu ce soir, je serais donc réactif si il y a besoin de quoi que ce soit )
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
22 avril 2021 à 18:18
Bien reçu votre réponse
Voici le code pour PrintTest5
Imports MySql.Data.MySqlClient

Public Class PrintTest5

    Private ContenuRectangle As ClassContenuRectangle ' le contenu d'un rectangle
    Private ListContenusRectangle As List(Of ClassContenuRectangle) ' la liste des rectangles 
    Private ListConteneursParPage As List(Of Integer) ' nombre de conteneurs par page
    Private ReadOnly SelectSemaine As Integer = 15 ' la semaine sélectionnée 
    Private ReadOnly SelectAnnee As Integer = 2021 ' l'année sélectionnée
    Private NbreCmd As Integer ' le nombre total de commandes à afficher ( rectangles )
    Private LargPage As Integer ' la largeur de la page à imprimer mode paysage
    Private HautPage As Integer ' la hauteur de la page à imprimer Mode paysage 
    Private ReadOnly SautLigne As Integer = 20 ' hauteur de la ligne du conteneur
    Private BoundTopPage, BoundHeight, BoundWidth As Integer
    Private ReadOnly PoliceEnGras As New Font("Arial", 12, FontStyle.Bold)
    Private ReadOnly PoliceNormale As New Font("Arial", 11)
    Private PageNum As Integer ' numéro de page
    Private TotalPages As Integer ' nombre total de pages 
    Private IdCmde As Integer
    Private PosYConteneur As Single ' position Y du conteneur ( le rectangle qui contient les données ) 
    Private NumeroConteneur As Integer ' numéro conteneur lors du dessin de ceux-ci
    Private XPosTexte, YPosTexte As Single ' position du texte dans le conteneur

    ''' <summary>
    ''' Classe avec le contenu d'un rectangle
    ''' </summary>
    Public Class ClassContenuRectangle
        Public Property ListLignes As List(Of String) ' liste des lignes contenues dans un rectangle
        Public Property ListPolices As List(Of Font) ' la police de caractères de chaque ligne 
        Public Property NbLignes As Integer ' nombre de lignes d'un rectangle
        Public Property Hauteur As Single ' hauteur d'un rectangle conteneur ( selon le nombre de lignes )
        Public Property Largeur As Single ' largeur d'un rectangle conteneur ( ne varie pas )
        Public Property PosY As Single ' position Y d'un rectangle conteneur ( position Y du conteneur sur une page )
        Public Property PosX As Single ' position X d'un rectangle conteneur ( ne varie pas )
    End Class

    ''' <summary>
    ''' Chargement de la Form
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub PrintTest5_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        ' centrage à l'écran
        With GroupBox1
            .Top = (Height - .Height) \ 2
            .Left = (Width - .Width) \ 2
            .Location = New Point(.Left, .Top)
        End With

    End Sub

    ''' <summary>
    ''' Affichage de la Form
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub PrintTest5_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown

        Try
            ' on compte le nombre de commandes
            NbreCmd = NbreData("Select COUNT(*) FROM commande WHERE SemCmd='" & SelectSemaine & "' AND AnnCmd='" & SelectAnnee & "' AND (EtatCmd='Production' OR EtatCmd ='Livraison-Partielle') ")
        Catch ex As Exception
            MessageBox.Show("Erreur: " & ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            NbreCmd = 0
        End Try
        If NbreCmd > 0 Then
            LectureBaseDonnees()
            PageNum = 1 ' la première page est la page 1
            TotalPages = DeterminerNombreTotalPages()
            NumeroConteneur = 0 ' numéro du premier conteneur
        End If

    End Sub

    ''' <summary>
    ''' Détermination du nombre total de pages
    ''' </summary>
    Private Function DeterminerNombreTotalPages() As Integer

        Dim PositionConteneurSuivant As Single
        Dim NombreConteneursPage As Integer
        ListConteneursParPage = New List(Of Integer) ' cette liste contiendra le nombre de conteneurs par page et sa taille correspond au nombre de pages
        NombreConteneursPage = 1 ' premier conteneur de la page
        For i = 1 To ListContenusRectangle.Count - 1
            With ListContenusRectangle(i - 1)
                PositionConteneurSuivant = .PosY + .Hauteur + 10 ' on calcule ici la position du conteneur suivant en tenant compte du conteneur précédent
            End With
            With ListContenusRectangle(i)
                If PositionConteneurSuivant + .PosY + .Hauteur + 10 < 800 Then
                    ' le conteneur suivant tient sur la page
                    NombreConteneursPage += 1
                Else
                    ' le conteneur suivant est sur la prochaine page : évite que des conteneurs soit à cheval sur 2 pages
                    ListConteneursParPage.Add(NombreConteneursPage)
                    NombreConteneursPage = 1 ' premier conteneur de la page suivante
                End If
            End With
        Next
        Return ListConteneursParPage.Count

    End Function

    ''' <summary>
    ''' Impression d'une page et gestion du e.HasMorePages
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim RectEntete, RectPied, RectangleConteneur As RectangleF
        Dim StfTitre, StfSem, StfDate As StringFormat
        Dim FontTitre, FontSem, FontDate As Font
        Dim LeTitre As String = "Liste des départs "
        Dim LaDate As String = DateTime.Now.ToString("dd/MM/yyyy")
        Dim LaSem As String = "Semaine " & "15 " & "Année " & "2021"
        With e.PageSettings
            HautPage = e.PageSettings.PaperSize.Width
            LargPage = e.PageSettings.PaperSize.Height
        End With
        With e.PageBounds
            BoundTopPage = .Top
            BoundHeight = .Height
            BoundWidth = .Width
        End With
        FontTitre = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
        FontSem = New Font("Arial", 15, FontStyle.Bold, GraphicsUnit.Point)
        FontDate = New Font("Arial", 10, FontStyle.Bold, GraphicsUnit.Point)
        StfTitre = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Near}
        StfSem = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Center}
        StfDate = New StringFormat With {.LineAlignment = StringAlignment.Center, .Alignment = StringAlignment.Far}
        RectEntete = New RectangleF(5, BoundTopPage + 5, BoundWidth - 10, 30)
        RectPied = New RectangleF(5, BoundHeight - 25, BoundWidth - 10, 20)
        PosYConteneur = 40 ' position de départ du 1er conteneur
        XPosTexte = 50 ' position du texte sur les X 

        'en-tête de la page
        e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectEntete)) ' on dessine le rectangle d'en-tête
        e.Graphics.DrawString(LeTitre, FontTitre, Brushes.Black, RectEntete, StfTitre) ' on dessine le titre de l'en-tête
        e.Graphics.DrawString(LaSem, FontTitre, Brushes.Black, RectEntete, StfSem) ' on dessine la semaine de l'en-tête
        e.Graphics.DrawString(LaDate & " (Page n° " & PageNum.ToString & " / " & TotalPages.ToString & ")", FontDate, Brushes.Black, RectEntete, StfDate) ' on dessine la date et numéro de page de l'en-tête

        'contenus des conteneurs sur la page
        For i = 0 To ListConteneursParPage(PageNum) - 1
            ' pour chaque conteneur de la page
            With ListContenusRectangle(NumeroConteneur)
                ' on dessine le conteneur
                RectangleConteneur = New RectangleF(.PosX, .PosY, .Largeur, .Hauteur) ' paramètres du conteneur
                e.Graphics.DrawRectangle(Pens.Black, Rectangle.Round(RectangleConteneur)) ' on déssine le conteneur suivant les paramètres 
                ' on affiche les différentes lignes contenus dans ce rectangle
                YPosTexte = RectangleConteneur.Top + 5
                For j = 0 To .ListLignes.Count - 1
                    e.Graphics.DrawString(.ListLignes(i), .ListPolices(i), Brushes.Black, XPosTexte, YPosTexte) ' on déssine unrligne
                    YPosTexte += SautLigne ' on calcule la position pour la ligne suivante du conteneur 
                Next
            End With
            NumeroConteneur += 1 ' numéro conteneur suivant
        Next
        If NumeroConteneur < ListContenusRectangle.Count Then
            ' il reste des conteneurs sur une page suivante
            e.HasMorePages = True
            PageNum = +1
            TextBox1.Text = 1.ToString
            TextBox2.Text = PageNum.ToString
        Else
            ' plus de conteneur : l'impression est finie
            e.HasMorePages = False
        End If

    End Sub

    ''' <summary>
    ''' Lit la base de données et en déduit le contenu de chaque rectangle
    ''' </summary>
    Private Sub LectureBaseDonnees()

        Dim ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv As Integer
        Dim NomClient, RefCmd, CdePostalCli As String
        ListContenusRectangle = New List(Of ClassContenuRectangle)
        Mysqlconn.Open()
        Dim sqlCdeCmd As New MySqlCommand
        Dim rdCmd As MySqlDataReader
        sqlCdeCmd.CommandText = "select * FROM commande,client WHERE commande.SemCmd='" & SelectSemaine & "' AND commande.AnnCmd='" & SelectAnnee & "' AND (commande.EtatCmd='Production' OR commande.EtatCmd ='Livraison-Partielle') AND client.client = commande.ClientCmd ORDER BY  CdePostalLivClient,ClientCmd  " 'ORDER BY ClientCmd "
        sqlCdeCmd.Connection = Mysqlconn
        rdCmd = sqlCdeCmd.ExecuteReader
        While rdCmd.Read
            ' lecture des informations pour un rectangle
            ContenuRectangle = New ClassContenuRectangle With {.ListLignes = New List(Of String), .ListPolices = New List(Of Font)} ' nouveau conteneur
            With ContenuRectangle
                IdCmde = CInt(rdCmd("idCmde"))
                NomClient = rdCmd("ClientCmd").ToString
                RefCmd = rdCmd("RefCmd").ToString
                CdePostalCli = rdCmd("CdePostalLivClient").ToString
                ReSulComptProSimp = NbreData("Select COUNT(*) FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'")
                ReSulComptProComp = NbreData("SELECT COUNT(*) FROM cmdcompos WHERE IdCmd='" & IdCmde & "'")
                ResulComElemCompose = NbreData("SELECT COUNT(*) FROM cmdcompelem WHERE IdCommande='" & IdCmde & "'")
                ReSulComptTmpsDiv = NbreData("SELECT COUNT(*) FROM cmdprotd WHERE IdCmd='" & IdCmde & "'")
                 ' ajoute une ligne
                .ListLignes.Add("CLIENT : " & NomClient & " /  REF : " & RefCmd & " /  DEP : " & CdePostalCli)
                .ListPolices.Add(PoliceEnGras)
                If ReSulComptProSimp > 0 Then
                     ' ajoute une ligne
                    .ListLignes.Add("-Châssis Simple :")
                    .ListPolices.Add(PoliceEnGras)
                    Mysqlconn3.Open()
                    Dim sqlCChasSimple As New MySqlCommand
                    Dim RdChasSimple As MySqlDataReader
                    sqlCChasSimple.CommandText = "select * FROM cmdprodsi WHERE Numcmdprod='" & IdCmde & "'  "
                    sqlCChasSimple.Connection = Mysqlconn3
                    RdChasSimple = sqlCChasSimple.ExecuteReader
                    While RdChasSimple.Read
                        ContenuRectangle.ListLignes.Add("---" & RdChasSimple("NomProdcmdprod").ToString & " Quantité : " & RdChasSimple("QteProdcmdprod").ToString)
                        ContenuRectangle.ListPolices.Add(PoliceNormale)
                    End While
                    RdChasSimple.Close()
                    Mysqlconn3.Close()
                End If
                If ReSulComptProComp > 0 Then
                    ' ajoute une ligne
                    .ListLignes.Add("-Châssis Composé :")
                    .ListPolices.Add(PoliceEnGras)
                    Mysqlconn3.Open()
                    Dim sqlCChasComp As New MySqlCommand
                    Dim RdChasComp As MySqlDataReader
                    sqlCChasComp.CommandText = "select * FROM cmdcompos WHERE IdCmd='" & IdCmde & "' "
                    sqlCChasComp.Connection = Mysqlconn3
                    RdChasComp = sqlCChasComp.ExecuteReader
                    While RdChasComp.Read
                        ContenuRectangle.ListLignes.Add("---" & RdChasComp("NomCmdCompos").ToString & " Quantité : " & RdChasComp("QtecdmComp").ToString)
                        ContenuRectangle.ListPolices.Add(PoliceNormale)
                        Mysqlconn4.Open()
                        Dim sqlCElemComp As New MySqlCommand
                        Dim RdElemComp As MySqlDataReader
                        sqlCElemComp.CommandText = "select * FROM cmdcompelem WHERE IdDuCompose='" & RdChasComp("IdcmdCompos").ToString & "'  "
                        sqlCElemComp.Connection = Mysqlconn4
                        RdElemComp = sqlCElemComp.ExecuteReader
                        While RdElemComp.Read
                             ' ajoute une ligne 
                            .ListLignes.Add("------" & RdElemComp("TypeElement").ToString & " Désignation : " & RdElemComp("DesigElement").ToString & " Quantité : " & RdElemComp("QteProdcmdprod").ToString)
                            .ListPolices.Add(PoliceNormale)
                        End While
                        RdElemComp.Close()
                        Mysqlconn4.Close()
                    End While
                    RdChasComp.Close()
                    Mysqlconn3.Close()
                End If
                If ReSulComptTmpsDiv > 0 Then
                    ' ajoute une ligne 
                    .ListLignes.Add("-Temps Divers :")
                    .ListPolices.Add(PoliceEnGras)
                    Mysqlconn3.Open()
                    Dim sqlCChasTmpDiv As New MySqlCommand
                    Dim RdChasTmpDiv As MySqlDataReader
                    sqlCChasTmpDiv.CommandText = "select * FROM cmdprotd WHERE IdCmd='" & IdCmde & "'  " 'ORDER BY ClientCmd "
                    sqlCChasTmpDiv.Connection = Mysqlconn3
                    RdChasTmpDiv = sqlCChasTmpDiv.ExecuteReader
                    While RdChasTmpDiv.Read
                         ' ajoute une ligne
                        .ListLignes.Add("---" & RdChasTmpDiv("DesiTd").ToString)
                        .ListPolices.Add(PoliceNormale)
                    End While
                    RdChasTmpDiv.Close()
                    Mysqlconn3.Close()
                End If
                .NbLignes = .ListLignes.Count
                .Hauteur = Convert.ToSingle(SautLigne * (.NbLignes + 3)) ' on détermine la hauteur du conteneur suivant le nombre de lignes contenues dans le conteneur
                .Largeur = Convert.ToSingle(LargPage - 100)
                .PosX = 50 ' position X d'un rectangle
                .PosY = PosYConteneur ' position Y d'un rectangle ( sera calculé plus tard pour chaque conteneur rectangle )
            End With
            ListContenusRectangle.Add(ContenuRectangle) ' on ajoute le rectangle à la liste 
        End While
        rdCmd.Close()
        Mysqlconn.Close()

    End Sub

    ''' <summary>
    ''' Pour avoir les valeurs de ReSulComptProSimp, ReSulComptProComp, ResulComElemCompose, ReSulComptTmpsDiv dans la sub LectureBaseDonnees
    ''' Pour avoir le nombre de commandes
    ''' </summary>
    ''' <param name="RequetCompteData"></param>
    ''' <returns></returns>
    Public Function NbreData(RequetCompteData As String) As Integer

        Mysqlconn2.Open()
        Dim Cmd As New MySqlCommand(RequetCompteData, Mysqlconn2)
        Dim Nombre As Integer = CInt(Cmd.ExecuteScalar())
        Mysqlconn2.Close()
        Return Nombre

    End Function

End Class


Je croise les doigts !
Si il y a des dysfonctionnements dîtes moi ce qu'il se passe ?
Si il y a des messages d'erreurs dîtes moi à quelle ligne elle se produit et quel est le message d'erreur .
Si il y a des notions que vous ne comprenez point dîtes le aussi .
Que la chance soit avec nous .
0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
22 avril 2021 à 19:16
Je viens de tester :)

1) pour le centrage du GroupBox il y a un soucis ... mais bon c'est pas important et je l'ai positionné temporairement comme cela :
  ' centrage à l'écran
        With GroupBox1
            .Top = (Panel1.Height - GroupBox1.Height) \ 2 '(Height - .Height) \ 2
            .Left = (Panel1.Width - GroupBox1.Width) \ 2 '(Width - .Width) \ 2
            .Location = New Point(GroupBox1.Left) 'Point(.Left, .Top)
        End With


2) Nous avons par ailleurs une erreur :
L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
Ligne 144 ( si nous prenons comme repère la ligne du code que vous avez posté )


j'essaie de comprendre l'ensemble du code de mon coté et d’où peut provenir cette erreur.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 22 avril 2021 à 21:32
Bonsoir
Réponse un peu tard mais je cassais la croute avec mon fils .
Merci pour le retour des erreurs fait correctement .
1) J'ai modifié ceci pour le centrage de la GroupBox1 :
        ' centrage à l'écran
        With GroupBox1
            .Top = (Panel1.Height - Height) \ 2
            .Left = (Panel1.Width - .Width) \ 2
            .Location = New Point(.Left, .Top)
        End With


2) Pour l'autre erreur remplacez
'contenus des conteneurs sur la page
For i = 0 To ListConteneursParPage(PageNum) - 1


par
' contenus des conteneurs sur la page
For i = 0 To ListConteneursParPage.Count - 1


Il y a juste le PageNum entre parenthèses à supprimer

Difficile alors que je ne puis rien tester . A moins que je puisse disposer du projet et de la base de données .

0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
22 avril 2021 à 21:51
Pas de soucis c'était la même ici, de plus je suis pas pressé et je suis bien content qui vous m'accordez de votre temps.
ce que vais faire je vais créer une solution qui va comporter cette partie et de plus vous envoyer une partie de la base.
je peux vous faire suivre tout ça par Message privé ?
0
spifspaf Messages postés 25 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 26 avril 2021
24 avril 2021 à 16:34
Tout à fait et je tiens particulièrement à vous remercier pour votre colossal travail et de m'avoir aussi éclairé sur la différence en VB6 et VB NET et sur la méthode de travail.
0
Rejoignez-nous