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

VB.NET Discussion :

Pb en fixant la position de départ d'un Autoscroll sur un Dialog [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Pb en fixant la position de départ d'un Autoscroll sur un Dialog
    Bonjour,
    Je commence à m'arracher les cheveux (bien que je pense avoir une vague idée du 'pourquoi') car je ne vois pas comment éviter ce problème.
    J'ai créé une Dialog qui contient 4 boutons (dont précédent suivant et exit) pour visualiser des jpg (à la file)
    J'ajoute lors du load une picturebox qui affiche l'image.
    A la première utilisation tout va bien: les images s'affichent l'une après l'autre (soit précédente soit suivante) et à chaque fois l'autoscroll est bien au point(0,0) comme je l'ai demandé à l'affichage de chaque image.
    Le 'hic' apparait lors de la deuxième utilisation de la Dialog dans la même session (autrement dit sans que j'ai arrêté le programme appelant)
    Là l'autoscroll est toujours présent mais ne se fixe plus à 0 pour chaque image mais reprend sa position précédente.
    Je pense qu'il doit y avoir un problème de ré-initialisation de l'autoscroll lors de la deuxième utilisation... mais je ne trouve pas le moyen de le supprimer.

    Je vous donne le code complet de la Dialog ci-dessous
    Merci de votre aide

    -------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    Imports System.Windows.Forms
     
    Public Class Dialog3
     
        Dim lNumI As Long
        Dim lPsM As Long
        Dim pPt As Point
        Dim PictureBox1 As New PictureBox()
        Dim ImgColl As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
     
        Private Sub AffIm(ByRef NumIm As Long)
     
            Dim dRat As Double
     
            ClearPicture()
     
            Dim ISource As System.Drawing.Bitmap = New System.Drawing.Bitmap(ImgColl.ElementAt(NumIm))
            dRat = ISource.Height / ISource.Width
            Dim IDest As New Bitmap(CInt(PictureBox1.Width), CInt(PictureBox1.Width * dRat))
            Dim GrDest As Graphics = Graphics.FromImage(IDest)
            GrDest.DrawImage(ISource, 0, 0, IDest.Width + 1, IDest.Height + 1)
            PictureBox1.Image = IDest
            Me.AutoScrollPosition = pPt
            Panel1.Location = New Size(Me.PictureBox1.Size.Width - 30, 0)
            PictureBox1.Refresh()
     
        End Sub
     
        Private Sub Dialog3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim sDir As String = ListeFichier.sPrm
            Dim i As Long = 0
     
            pPt.X = 0
            pPt.Y = 0
            lNumI = 0
            lPsM = 4 ' PictureBoxSizeMode.Zoom
            Me.WindowState = FormWindowState.Maximized
     
            Me.Controls.Add(PictureBox1)
            Me.PictureBox1.Size = New System.Drawing.Size(10, 10)
            Me.PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
            Me.AutoScroll = True
     
            Panel1.Location = New Size(Me.PictureBox1.Size.Width - 30, Me.Height - 120)
     
            PictureBox1.Size = New Size(Me.Size.Width - 40, Me.Size.Height * 2)
            PictureBox1.MaximumSize = New Size(Me.Size.Width - 40, Me.Size.Height * 2)
            PictureBox1.Location = New Point(5, 0)
            PictureBox1.SizeMode = lPsM
            PictureBox1.Refresh()
     
            ImgColl = My.Computer.FileSystem.GetFiles(sDir, FileIO.SearchOption.SearchTopLevelOnly, "*.jpg", "*.gif", "*.png")
     
            AffIm(lNumI)
     
        End Sub
     
        Private Sub Dialog3_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles Me.Scroll
            Dim lAsP As Long
     
            lAsP = 0 - Me.AutoScrollPosition.Y
            If lAsP < (Me.Size.Height / 2) Then
                Panel1.Location = New Size(Me.PictureBox1.Size.Width - 30, lAsP)
            Else
                Panel1.Location = New Size(Me.PictureBox1.Size.Width - 30, lAsP - Panel1.Height)
            End If
     
        End Sub
     
        Private Sub ClearPicture()
            Dim img As Image = PictureBox1.Image
            PictureBox1.Image = Nothing
            If Not (img Is Nothing) Then
                img.Dispose()
            End If
        End Sub
     
        Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Me.DialogResult = System.Windows.Forms.DialogResult.OK
            Me.Close()
        End Sub
     
        Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
            Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
            Me.Close()
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click         'Précédent
            lNumI = lNumI - 1
            If lNumI < 0 Then lNumI = ImgColl.Count - 1
            AffIm(lNumI)
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click        'Suivant
            lNumI = lNumI + 1
            If lNumI > ImgColl.Count - 1 Then lNumI = 0
            AffIm(lNumI)
        End Sub
     
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
     
            ClearPicture()
            Me.Controls.Remove(PictureBox1)
            Me.Controls.Add(PictureBox1)
     
            Me.PictureBox1.Size = New Size(Me.Size.Width - 40, Me.Size.Height * 2)
            Me.PictureBox1.MaximumSize = New Size(Me.Size.Width - 40, Me.Size.Height * 2)
            PictureBox1.Location = New Point(5, 0)
     
            lPsM = lPsM + 1
            If lPsM > 4 Then lPsM = 0
            PictureBox1.SizeMode = lPsM
            AffIm(lNumI)
     
        End Sub
     
    End Class
    -------------------------------------------

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Comment ouvres-tu ta fenêtre dialog ? pas en faisant Dialog3.ShowDialog() hein ?

    Est ce que tu définis ta fenêtre dim f as Dialog3 ?
    Et dans ton code
    Tu cré la fenêtre f = new Dialog3, l'ouvre f.ShowDialog() et après la fermeture avec "Close", tu traites/notes le DialogResult, puis fait un dispose f.Dispose() ?
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Euh...
    Euh... http://www.developpez.net/forums/ima...on_redface.gif ben non.

    Je suis vraiment débutant et quand j'ai vu que cela marchait avec la solution simple je n'ai pas cherché plus loin... j'avoue.
    Je vais modifier le code et je teste.

    Je vous tiens au courant.
    Merci

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 31
    Points : 20
    Points
    20
    Par défaut OK !!!
    Cela fonctionne sans problème...

    Comme je l'ai marqué dans mon premier message je me doutais un peu de ce genre de problème mais je cherchais plus du coté de l'AutoScroll (je pensais qu'il fallait le re-créer à chaque fois) que de la Dialog en elle même.

    Je ne fais pas encore vraiment la différence entre la création par défaut Dialog.ShowDialog et cette façon de faire.
    Je pensais qu'une création de ce genre était réservée au Dialog créées de toute pièce ou modeless.
    Dans le cas précis, qu'est-ce qui ne fonctionne pas bien avec la création par défaut ?

    Merci beaucoup pour l'aide, cela m'enlève une sacrée épine du pied.

    Th

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Faire Dialog3.ShowDialog() est une facilité offerte par VB, mis ce n'est pas la bonne manière de procéder.

    En POO, on cré une instance d'une classe et on utilise cette instance.
    Avec un affichage classique par Show le close suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Dim f As Form2
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            f = New Form2 ' cré une instance (obligatoire - le close libère)
            f.Show() ' affiche l'instance, sur close tout sera libéré
        End Sub

    Avec un affichage en modal ShowDialog, sur Close la fenêtre est fermé, mais il n'y a pas de dispose afin de pouvoir récupérer les valeurs de celle-ci. Le DialogResult entre autre, et d'autres données si souhaité.

    Fait un test :
    form1 : 2 boutons un label
    form2 : un bouton, un textBox (le code du bouton, juste "Close")

    le code de form1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Dim f As Form2 = New Form2
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            f.ShowDialog() ' garde les données saisies et on les revoie au 2ème appel - le close n'a pas libéré
            Label1.Text = f.TextBox1.Text
        End Sub
     
        Dim f2 As Form2
        Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
            f2 = New Form2 ' cré une instance
            f2.ShowDialog() ' tout est vide à chaque fois
            Label1.Text = f2.TextBox1.Text
            f2.Dispose() ' libère
        End Sub
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 31
    Points : 20
    Points
    20
    Par défaut OK
    OK Compris
    Merci pour le coup de main et les explications.
    Bonne journée
    Th

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Plugin] ScrollTo, position de départ
    Par vbaguet dans le forum jQuery
    Réponses: 2
    Dernier message: 21/04/2013, 12h24
  2. Réponses: 3
    Dernier message: 04/06/2011, 13h09
  3. [JScrollPane] problème de position de départ
    Par doc dans le forum Composants
    Réponses: 3
    Dernier message: 14/01/2009, 21h03
  4. Position de départ de tir
    Par goutbouyo dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 06/09/2006, 12h21
  5. Réponses: 6
    Dernier message: 15/03/2006, 17h10

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