Construction de classe

Signaler
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
-
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
-
Bonsoir,

J'ai fait un code qui marche bien lorsqu'il se trouve sur une Forme concernant une PictureBox.
Cependant, je voudrais generaliser ce code et le mettre dans une Classe nommee myPictureBox.

Voila le debut de cette classe:
Public Class myPictureBox
    Inherits PictureBox
    Private _pict As PictureBox
    Public Sub New(ByVal pict As PictureBox)
        _pict = pict
        If _pict IsNot Nothing Then
            AddHandler _pict.MouseDown, AddressOf mpbMouseDown
            AddHandler _pict.MouseMove, AddressOf mpbMouseMove
        Else
            MessageBox.Show("...", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub
...etc...


Un des problemes que je rencontre est le suivant:
Private Sub mpbMouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)
            ...
            Cursor = Cursors.SizeAll

Cette ligne de code dans cet Evenement ne marche pas, excepte si j'ecris:
Form1.Cursor = Cursors.SizeAll


Je pense qu'il y a quelquechose de basic que je ne comprend pas.
Car si je veux generaliser, je dois pouvoir utiliser le code dans ma classe sans avoir a mettre devant Form1, SplitContainer1.Panel2 ...
Si quelqu'un peux m'expliquer...

De plus, j'ai aussi un Evenement Paint ou je vais certainement rencontrer d'autres problemes.

A+
JLuc01

8 réponses

Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
Salut
d'abord
tu n'as pas besoin de déclarer dans ta class
Private _pict As PictureBox

et le constructeur avec le le parametre
ByVal pict As PictureBox
puisque ta class herite le picturebox
ou soit je n'ai pas compris la logique
de déclarer une class qui herite la class
picturebox et le constructeur avec comme parametre un picturebox
ta class myPictureBox se comporte comme un
picturebox

Public Class myPictureBox
    Inherits PictureBox
    Private _pict As PictureBox
    Public Sub New()
        
            AddHandler me.MouseDown, AddressOf mpbMouseDown
            AddHandler me.MouseMove, AddressOf mpbMouseMove
       
    End Sub
...etc...
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Salut, et merci de t'interesser a mon cas.

C'est la premiere fois que j'essaye de creer une classe avec des evenements et en utilisant Inherits.

Tes explications paraissent logiques, donc j'ai fait les corrections... et le probleme initial est resolu.
Mais, je n'arrive pas encore a faire marcher mes evenements.

Dans ma Form1, j'utilise le code suivant:
Public Class MyPictureBoxDemo
    'Private pict As myPictureBox
    Private WithEvents pict As myPictureBox
    Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' ADD ONE DYNAMIC PICTUREBOX
        Dim pict As New myPictureBox
        pict.Location = New Point(100, 100)
        pict.Size = New Size(1200, 800)
        pict.Image = My.Resources.Koala
        pict.SizeMode = PictureBoxSizeMode.StretchImage
        Me.Controls.Add(pict)
    End Sub
End Class


Dois-je utiliser le mot "WithEvents"? Ca a l'air de marcher avec ou sans (peut-etre a cause du mot Inherits dans la classe).

A+
JLuc01

Bonjour,

Disons que withevents te permet de retrouver ton objet dans la boîte déroulante de gauche (au dessus de la zone de saisie du code) et d'accéder facilement aux événements de celui-ci dans la liste déroulante de droite. Visual Basic écrira pour toi l'ossature des procédures d'événement.
Une limite à witheveznts cependant : il n'est pas possible de déclarer un array (tableau) avec ce mot clé.
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Bonsoir,

Cela veut-il dire que je dois mettre le AddHandler dans la Form1 (Main) et non dans la classe?
Et d'ailleur, avec le Inherits PictureBox, l'evenement MouseDown existe en double???

OK, je crois que je vais laisser de cote ma classe pour l'instant, car elle doit etre plein d'erreur.
Je dois probablement essayer de comprendre certaine base avant de continuer, de facon a pas tout melanger.
Je crois avoir compris comment mettre des proprietes et des methodes, mais pour les evenements, c'est autre chose.

Pour info, j'essaye de reproduire la PictureBox (vu en Design dans VisualSTudio, PictureBox provenant du ToolBox). Je ne pense pas en etre bien loin, mais en codant dans la forme principale et non dans une classe.

Enfin bref, merci pour vos commentaires.

A+
JLuc01
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
48
Salut

OK, je crois que je vais laisser de cote ma classe pour l'instant, car elle doit etre plein d'erreur.


d'abord ta class mypicturebox que contient elle ?
pas le code je veux dire à part le picturebox
quels controls ?
parceque si ce n'est qu'une class qui herite
le picturebox sans rien d'autre utilise dans ce
cas un picturebox
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Salut,

quels controls ?

je dirais un "PictureBox amelioree".

En fait, j'ai une propriete, deux methodes utilisees pour un de mes evenements et 5 evenements.
C'est la base de la classe, j'ai l'intention d'en ajouter plus si toutefois j'arrive a gerer le debut.

Comme j'ai dit auparavant, j'essaye de mimer la PictureBox qu'on peut voir avec Visual Studio en Design.
En d'autres termes, j'ai un rectangle autour de la PictureBox (contenant une image) avec 8 petits carres pour agrandir ou retrecir et l'evenement Move bouge la PictureBox...
Le but etant d'instancier myPictureBox avec les evenements apropries, et de pouvoir la bouger, l'agrandir...

Explique autrement: j'ai un code qui marche sur ma Form principale, et je voudrais mettre ce code dans une Classe, ce qui me permetrait d'instancier myPictureBox avec le minimum de code sur ma Form principale.

Je crois que mon probleme principal, c'est de gerer un evenement dans une classe.
En esperant avoir ete un peu plus clair...
A+
JLuc01

Je t'ai fait un exemple commenté d'un picturebox représentant une barre de progression. Celle-ci possède un événement 'Progress' qui renvoie une donnée au formulaire principal. Bien sûr, il faut gérer les opérations inter-thread à cause d'un timer interne à la classe (ceci te permettra d'observer aussi ce phénomène).

Voici le code à rajouter dans un projet vierge pour le tester :
Option Strict On
Public Class Form1
    'déclaration et instanciation de la classe
    Dim MyPictureBox As New clsMyPictureBox
    'label devant afficher des informations issues d'un événement perso de MyPictureBox
    Dim MonLabel As New Label With {.Location New Point(5, 60), .Font New Font("Arial", 22), .AutoSize = True}

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'abonnement à mon événement de mon picturebox
        AddHandler MyPictureBox.Progress, AddressOf MyPictureBox_Progress
        'ajout des contrôles au formulaire
        Me.Controls.AddRange({MyPictureBox, MonLabel})
        'démarrage d'une commande sur mon picturebox
        MyPictureBox.Start()
    End Sub

    Private Sub MyPictureBox_Progress(ByVal sender As Object, ByVal e As clsMyPictureBox.ProgressArgs)
        'affichage de la progression récupéré sur le paramètre e  (voir classe ProgressArgs plus bas)
        MonLabel.Text = e.X.ToString
    End Sub

End Class



Public Class clsMyPictureBox
    Inherits PictureBox

    'déclaration d'un événement personnalisé
    Event Progress(ByVal sender As Object, ByVal e As ProgressArgs)
    'ici nous devrons gérer des opérations inter-thread à cause du timer
    'on doit donc intégrer un délégué
    Delegate Sub DelegateTimer(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs)
    'déclaration d'un timer
    Dim MonTimer As New Timers.Timer(100)
    Dim i As Integer = 0

    Sub New()
        'j'abonne mon timer à un événement
        AddHandler MonTimer.Elapsed, AddressOf MonTimer_Elapsed
        'je dimensionne mon picturebox
        Me.Width = 102
    End Sub

    Sub Start()
        'je démarre le timer
        MonTimer.Start()
    End Sub

    Private Sub MonTimer_Elapsed(ByVal sender As Object, ByVal e As Timers.ElapsedEventArgs)
        'nous devons tester si l'invocation du délégué est nécéssaire
        'je lui fournis l'objet sender et l'argument e en paramètre
        If Me.InvokeRequired Then
            Me.Invoke(New DelegateTimer(AddressOf MonTimer_Elapsed), sender, e)
        Else
            i += 1
            'ici je déclenche l'événement en fournissant un paramètre (i) 
            'à une nouvelle instance de la classe d'argument ProgressArg (voir plus bas)
            RaiseEvent Progress(Me, New ProgressArgs(i))
            'dessins graphiques sur le picturebox
            Me.CreateGraphics.FillRectangle(Brushes.SteelBlue, New Rectangle(0, 0, 100, 25))
            Me.CreateGraphics.FillRectangle(Brushes.Blue, New Rectangle(0, 0, i, 25))
            Me.CreateGraphics.DrawString(i.ToString & " %", New Font("Arial", 10), Brushes.White, New Point(40, 3))
            Me.CreateGraphics.DrawRectangle(Pens.Black, New Rectangle(0, 0, 100, 25))
            If i >= 100 Then MonTimer.Stop()
        End If
    End Sub

    'classe d'argument d'événement
    Public Class ProgressArgs
        'elle hérite de EventArgs (ceci pour avoir access aux méthodes et fonction
        'd'un argument d'événement standard )
        Inherits EventArgs
        Dim _x As Integer
        'on fourni la donnée dans le constructeur
        Sub New(ByVal x As Integer)
            _x = x
        End Sub
        'elle est accessible par sa propriété
        ReadOnly Property X As Integer
            Get
                Return _x
            End Get
        End Property
    End Class
End Class
Messages postés
206
Date d'inscription
samedi 17 janvier 2009
Statut
Membre
Dernière intervention
5 mars 2013
1
Salut Banana32,

Tout d'abord, merci pour cet exemple, et en plus bien commente. Personnellement, j'apprend en general beaucoup avec des exemples courts.
Je vais regarder ce week-end de pres le code pour le comprendre, cela pourra m'etre utile pour mon objectif.

Si toutefois, je coince sur quelquechose, je reviendrais sur ce post.

Une remarque: il y avait une petite erreur, corrigee comme ci-dessous:
Me.Controls.AddRange(New Control() {MyPictureBox, MonLabel})


Merci encore,
A+
JLuc01