IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VB.Net] Problème sur (re)dessin d'une feuille


Sujet :

Windows Forms

  1. #1
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut [VB.Net] Problème sur (re)dessin d'une feuille
    Bonjour,
    je developpe, pour un projet perso, une application de scan d'image (locale ou distante).
    J'ai une erreur in-interceptable de paramètre non valide dont le message est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    System.ArgumentException: Paramètre non valide utilisé.
       at System.Drawing.Image.get_Width()
       at System.Drawing.Image.get_Size()
       at System.Windows.Forms.PictureBox.get_ImageRectangle()
       at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
       at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
       at System.Windows.Forms.Control.WmPaint(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    Il m'est arrivé que la pile d'appel soit plus grande mais c'est souvent celle la.
    Le probleme survient sur la mise en barre de tache, un agrandissment (ou reduction) de la taille de la fenetre, un passage par l'ecran de veille, enfin bref tout ce qui oblige à redessiner la feuille.

    sur ma feuille se trouve un tabcontrol et une picturebox.

    Il semble que le probleme vienne de la picture box.

    Toutes les idées pour résoudre le probleme sont les bienvenues...

    Merci à tous.
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  2. #2
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    C'est pas ton image qui pose problème ?
    Si tu enlève le code qui colle l'image dans ta PictureBox, t'as encore le problème ?
    T'as pas un autre morceau de code qui jouerait avec l'image ?

  3. #3
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Pour ce qui est de l'image cela se passe ainsi:
    - une fonction qui récupère l'image physique
    - une fonction qui affiche l'image dans le picture box
    - on efface l'image physique pour écrire la prochaine et laissé le répertoire propre

    -> l'image physique est stocké dans tmp.ext

    j'ai une image à afficher en cas de problème avec l'image récupérer, et avec cette image, cela fonctionne très bien.

    les images défilent, donc je me suis dit que cela pouvait jouer, ainsi j'ai affiché une image, arrêter le défilement et agrandit, cela a planté de la même facon ...
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  4. #4
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par tomnie
    j'ai une image à afficher en cas de problème avec l'image récupérer, et avec cette image, cela fonctionne très bien.
    Bah ouais, forcément.

    Tu peut montrer ton code qui modifie l'image ? paske je comprend pas bien ce que tu fais, mais c'est sûr qu'il y a qqch de pas bien dedans

    Tu dois jouer avec la référence à l'image au mauvais moment... Tient, t'as essayé de mettre l'image de ta PictureBox à null, AVANT de toucher à l'instance de ton image ?

  5. #5
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    Voici le code d'affichage de l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Private Function afficheImage(Optional ByVal nomFichier As String = "tmp.jpg") As Boolean
            Dim img As Bitmap
            Dim retour As Boolean
            If IO.File.Exists(nomFichier) Then
                If New IO.FileInfo(nomFichier).Length <> 0 Then
                    img = New Bitmap(nomFichier)
                    If img.Width <= 0 Or img.Height <= 0 Then
                        Me.AffImg.SizeMode = PictureBoxSizeMode.CenterImage
                        Me.AffImg.Image = CType(New Bitmap("pb.jpg"), Image)
                        Me.AffImg.Update()
                        Me.AffImg.Show()
                        Application.DoEvents()
                        retour = False
                    Else
                        Dim imgW As Integer = img.Width, imgH As Integer = img.Height
                        Dim coef As Decimal = 0
                        If imgW > imgH Then
                            coef = CDec(imgW / Me.AffImg.Width)
                        Else
                            coef = CDec(imgH / Me.AffImg.Height)
                        End If
                        Try
                            Me.AffImg.SizeMode = PictureBoxSizeMode.CenterImage
                            Me.AffImg.Hide()
                            'Me.AffImg.ClientSize = New Size(img.Width, img.Height)
                            Me.AffImg.Image = CType(img, Image)
                            Me.AffImg.Show()
                            Me.AffImg.Update()
                            Application.DoEvents()
                            retour = True
                        Catch e As Exception
                            log.Log(e, FichierLog.LogLevel.Debug Or FichierLog.LogLevel.Info)
                            retour = False
                        End Try
                        'If coef > 1 Then
                        '    Me.AffImg.ClientSize = New Size(CInt(imgW / coef), CInt(imgH / coef))
                        'Else
                        '    Me.PictureBox1.ClientSize = New Size(CInt(coef * imgW), CInt(coef * imgH))
                        'End If
                        img.Dispose()
                    End If
                Else
                    Me.AffImg.SizeMode = PictureBoxSizeMode.CenterImage
                    Me.AffImg.Image = CType(New Bitmap("pb.jpg"), Image)
                    Me.AffImg.Update()
                    Me.AffImg.Show()
                    Application.DoEvents()
                    retour = False
                End If
            Else
                Me.AffImg.SizeMode = PictureBoxSizeMode.CenterImage
                Me.AffImg.Image = CType(New Bitmap("pb.jpg"), Image)
                Me.AffImg.Update()
                Me.AffImg.Show()
                Application.DoEvents()
                retour = False
            End If
            Return retour
        End Function
    Le code qui gere l'ensemble chargement-affichage de l'image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    Private Sub timeDwl_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timeDwl.Tick
            Me.timeDwl.Enabled = False 'Arrete l etimer le temps de charger l'image
            Me.sbAction.Text = "Timer Action"
            Cursor.Current = Cursors.WaitCursor
            Me.sbAction.Text = "Construit l'url"
            Dim urlimg As String = fabriqueURL(Me.tvSites.SelectedNode.Text) 'fabrique l'url de  l'image à telecharger
            Me.sbAction.Text = "Recupere l'image"
            While Not chargeImage(urlimg) 'tant qu'une image n'a pas pu etre telecharger
                Me.sbAction.Text = "Cherche une image..."
                urlimg = fabriqueURL(Me.tvSites.SelectedNode.Text) 'on cherche l'image 'apres
            End While
            Me.sbImage.Text = nomImg
            Me.sbAction.Text = "Affiche l'image"
            afficheImage() 'on affiche l'image telecharger
            Me.sbAction.Text = "Efface le fichier temporaire"
            If IO.File.Exists("tmp.jpg") Then 'on efface le fichier temporaire si il existe
                IO.File.Delete("tmp.jpg")
            End If
            Cursor.Current = Cursors.Default
            Me.sbAction.Text = "Attend l'image suivante"
            Me.timeDwl.Enabled = True 'on relance le timer pour l'image suivante
        End Sub
    J'ai deja essayé en ne supprimant pas tmp.jpg mais cela n'a rien chagé ...

    Je ne vois vraiment pas ou est mon erreur ...
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  6. #6
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Dsl, VB c'est vraiment imbitable (pour moi), je laisse la main a un spécialiste.

    En plus y'a des trucs que je comprends pas. Genre pourquoi tu fait un Update() sur la picture box et pourquoi tu appelles Application.DoEvents().

  7. #7
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Cela me sert juste à être sur que l'image est bien mise à jour. J'informe que l'image est modifié puis je permet à l'application d'éxecuter les message en attente pour le cas ou...

    Merci quand meme de l'interet porté sur ma question.
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  8. #8
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Et si tu les enlève tes Update et DoEvents ? Ca marche mieux ?

  9. #9
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Non au contraire.
    Je viens de faire des tests:
    -sans le update
    -sans le doevents
    -sans les deux

    Il n'y a pas de chagement sauf avec les deux en moins ou j'ai l'erreur tout de suite.
    Je vais donc continuer d'explorer cette idée en faisant d'autre test.

    Merci de la piste.
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  10. #10
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Je viens de resoudre le probleme en passant par une feinte qui consiste à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    me.affimg.image=ctype(new bitmap(monfichier),image)
    en lieu et place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dim monbitmap as new bitmap(monfichier)
    me.affimg.image=ctype(monbitmap,image)
    Merci de votre attention, surtout à Mose.
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  11. #11
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Euh... je sais pas en VB, mais en C#, les type Bitmap et Image sont liée.

    Bitamp EST une image (il en hérite quoi)
    Donc le crois pas que le ctype serve à qqch. Tu confirmes ?

  12. #12
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Ok, merci pour l'info.

    Mais cette solution avait juste pour but de ne plus utilisé l'objet img comme au debut pensant que l'erreur venait de lui (du fait qu'il etait detruit a la fin de la fonction.)

    En fait l'objet bitmap est lié au fichier physique sur le disque. Cela empeche toute modification ou supression sur ce fichier. Or dans mon programme une fois l'image chargé je détruit le fichier et continu mon programme. Ce qui etait la réelle cause du problème. Je passe donc par un autre fichier temporaire pour l'affichage que je remplace juste avant l'affichage et ainsi plus de probleme.

    Je cherche une solution pour ne plus avoir le 2eme fichier temporaire, mais pour le moment cela fonctionne tres bien comme cela.

    Si jamais tu as une idée pour que l'image du programme ne soit plus lié au fichier physique je suis preneur.

    Encore merci de ton aide.
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  13. #13
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par tomnie
    Si jamais tu as une idée pour que l'image du programme ne soit plus lié au fichier physique je suis preneur.
    Bah il ne faut pas utiliser Bitmap, ou alors juste le temps de charger l'image et d'en faire un Clone()
    Ceci dit, je ne comprend pas très bien comment ta solution peut marcher... je suis sur le cul. Le Ctype c'est juste un cast en VB non ? donc ton instance de Bitmap elle et toujours là ? .......

  14. #14
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    ba oui j'avoue que c'est bizarre mais je pense que le image du picturebox pointe vers la memoire du bitmap et donc lorssque mon objet est detruit la memoire de l'objet reste pour le picturebox qui s'en sert.
    C'est pour cela que je cherche une autre solution.
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  15. #15
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Nan c pas possible ça. On n'est pas en C++, tu peux pas pointer vers qqch de détruit. T'aurais une grosse exception.

    On a l'impression que le fait de caster le Bitmap en Image modifie le type sous jacent, et que le runtime supprime le spécifique au Bitmap (donc le lien vers le fichier). Mais franchement, un truc aussi fin me paraît beaucoup trop beau pour être vrai. D'autant que ça peut poser des pb en cas de cast inverse...
    Bref, je suis sur le cul.

  16. #16
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Ba je sais pas mais cela marche comme cela et c'est un peu tout ce qui m'interesse.

    Si cela t'interesse je peux poser le code de la fonction sur le forum pour que tu regardes. On sait jamais si cela peut te donner des idées.
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  17. #17
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    T'es fou, ça va briser un mythe !

    Nan ça ira, le VB je le lis pas

  18. #18
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    Sinon j'aurais voulu savoir en passant par system.graphics (qui fait appel a GDI+ je crois) il n'y aurais pas moyen de ne plus utilisé l'image physique ???
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

  19. #19
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    En clonant ton image ça marche pas ?
    Je vois pas bien ce que GDI+ (librairie d'affichage) viens faire là dedans...

  20. #20
    Membre régulier Avatar de tomnie
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 71
    Points
    71
    Par défaut
    ba le clone garde le lien vers le fichier physique et gdi+ gere des graphiques et peut permettre de travailler sur des images créées en memoire. donc je m'etais que peut etre...
    mais bon c'est pas grave ca marche.
    MERCI à vous tous qui me répondez !
    Sans maîtrise, la puissance n'est rien !
    Se battre avec les meilleurs, crever avec les autres

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème sur la copie d'une feuille Excel
    Par narutoe dans le forum Excel
    Réponses: 5
    Dernier message: 11/10/2013, 12h44
  2. Réponses: 3
    Dernier message: 07/07/2006, 16h47
  3. problème sur l'enregistrement d'une instance
    Par Génie dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 12/05/2006, 10h48
  4. Problème sur la réalisation d'une requête
    Par soso78 dans le forum Access
    Réponses: 1
    Dernier message: 06/10/2005, 13h17
  5. [VB.NET] Problème sur composant comboBox hérité
    Par SergeF dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/06/2004, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo