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 :

Comment declarer une variable avec static et WithEvents?


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Points : 111
    Points
    111
    Par défaut Comment declarer une variable avec static et WithEvents?
    Bonsoir,

    Mon problème est que je fait référence à une instance de chart dejà instancié et donc morte (nothing).

    La solution pour prolongé la durée de vie de mon instance serait de la déclarer avec "static", sauf que je doit impérativement la déclarer avec WithEvents et que ces deux options: "Static" et "WithEvents" sont impossble à réaliser en même temps.

    Comment faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim WithEvents YMDChart As Chart

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par Gualino Voir le message
    Bonsoir,

    Mon problème est que je fait référence à une instance de chart dejà instancié et donc morte (nothing).
    Tu ne fournis pas assez d’éléments. Notamment, le "donc" ici laisse perplexe.

    La solution pour prolongé la durée de vie de mon instance serait de la déclarer avec "static", sauf que je doit impérativement la déclarer avec WithEvents et que ces deux options: "Static" et "WithEvents" sont impossble à réaliser en même temps.
    Tiens, c'est curieux. Une curiosité VB.Net ? quelqu'un peut expliquer pourquoi il serait impossible d'associer des handlers d'event à une variable static ?

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Points : 111
    Points
    111
    Par défaut
    J'instancie un chart dans une procédure.
    C'est une fois que la procédure est finie et que je fais référence à cette instance précédemment créer que l'instance est nothing...

    Je voulais dire déclarer, mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Static WithEvents YMDChart As Chart
    Est incorrect.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    C'est un peu plus clair (mais à peine).

    Qu'est ce qui t'empêche de déclarer cet instance au niveau de la classe où se trouve la procédure ? tant que cette classe n'est pas disposée je ne vois pas bien où est le problème.
    En effet, si tu y fais référence après coup c'est que tu disposes quelque part d'une référence (évidence). Or, tant que tu conserves une référence à l'instance de la classe, elle n'est pas éligible au GC.

    Je ne vois pas trop où est ton soucis.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Points : 111
    Points
    111
    Par défaut
    Mon premier soucis est exposer dans ce post:
    http://www.developpez.net/forums/d11...ete-instancie/

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    La magie noire en programmation ça n'existe pas.
    Si tes instances sont à "nothing", c'est que tu as une situation où tu appelles SetYMDToBlack avant d’appeler PlotYMD.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Points : 111
    Points
    111
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    La magie noire en programmation ça n'existe pas.
    Je suis daccord...

    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
        Private Sub PlotYMD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlotYMD_button.Click
     
            Dim YMD As New YawMomentDiagramClass
     
            If FreezeAndOverlay_cbox.Checked = True Then
                Call YMD.SetYMDToBlack()
                Me.MagicNumbers_tbc.SelectedIndex = 1
            Else
                Me.MagicNumbers_tbc.SelectedIndex = 0
                For Each control As Control In Me.MagicNumberOverlay.Controls
                    If TypeOf control Is TextBox Then
                        control.Text = ""
                    End If
                Next
            End If
     
            Call YMD.CalculateYMD()
            Call YMD.PlotYMD()
            Me.ResetGraph_button.Enabled = True
     
            Me.FreezeAndOverlay_cbox.Enabled = True
            Me.DisplayOverlayInRelative_cbox.Enabled = True
     
        End Sub

    Au premier "PlotYMD_button.Click" la condition "If FreezeAndOverlay_cbox.Checked = True" n'est pas vérifié et les 2 sub Call YMD.CalculateYMD(), Call YMD.PlotYMD() sont executé et crée le YMDChart.

    Ensuite je fais en sorte qu'au prochain click la condition soit vérifiée, et là j'ai l'erreur de référencement à une instance qui est nothing. Pourtant ce YMDChart existe...

    Au moment où je fais en sorte que la condition soit vérifié ("If FreezeAndOverlay_cbox.Checked = True") j'ai dejà modifier les valeurs qui sont à l'origine du premier chart et je ne peux donc pas le réinstancier pour afficher les series en noir.

    Alors comment dois-je faire?

  8. #8
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut declarer un control comme variable partage
    bonjour gualino
    Je ne vois pas pourquoi tu as ces difficultes .
    Declarer un controle comme variable shared withevents ne pose pas de probleme comme le montre ce code si c'est au niveau d'un class ou module.......sauf qu'il faut structurer correctement l'appli et mettre cette variable dans un class Gualino bien identifie........sous peine d'erreurs de logique ou oubli fatales......
    L'erreur que tu as commis c'est que tu declare un controle chart comme shared dans une sub ,ce n'est pas admis.
    La corne MSDN doc Fr:
    Règles
    Contexte de déclaration. Vous pouvez utiliser Shared seulement au niveau du module. Cela signifie que le contexte de déclaration d'un élément Shared doit être une classe ou une structure, et ne peut pas être un fichier source, un espace de noms, ou une procédure.
    voici un code ou est inclus un controle microsoft.chart Version 6(com)
    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
     
    Imports AxMSChart20Lib
    Public Class Form1
    	' Declare a WithEvents variable au niveau classe.
    	Shared WithEvents frm As New Form
    	Shared WithEvents myButton As New Button
    	Shared WithEvents myChart As New AxMSChart
    	Private Shared Sub myButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles myButton.Click
     
    	End Sub
     
    	Private Shared Sub frm_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles frm.Click
     
    	End Sub
     
    	Private Shared Sub myChart_DonePainting(ByVal sender As Object, ByVal e As System.EventArgs) Handles myChart.DonePainting
     
    	End Sub
    End Class
    Voici la facon de proceder dans ton cas:
    code...
    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
     
    Public Class Form1
    	' Pas besoin de le declarer car la classe GualinoChart est publique.
    	' et accessible partout dans ton projet et meme à l'exterieur
    	' On n' a besoin d'une instance.Le nom de classe suffit pour les
    	' membres "shared" dans notre cas d'espece "myButton"........ 
    	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    		MessageBox.Show(GualinoChart.myButton.Text)
    	End Sub
    	'la sub ou tu l'utilise
    	Private Shared Sub maSub()
     
    		MessageBox.Show(GualinoChart.myButton.Text)
    	End Sub
     
    	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    		MessageBox.Show(GualinoChart.myButton.Text)
    	End Sub
    End Class
    'classe dedie au controle MSCHART partage
    Public Class GualinoChart
    	' Declare a WithEvents variable(ici c'est mschart qu'il faut mettre).
    	Public Shared WithEvents myButton As New Button
     
    End Class
    bonne soiree et bon code.......

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Points : 111
    Points
    111
    Par défaut
    Bonjour MABROUKI,

    Merci pour votre aide, mais je ne sais pas pourquoi vous me parlez de "Shared", car moi c'est avec "Static" que j'ai des difficultés.

    Effectivement appeler le text d'un bouton ne pose pas de probleme. Mais si vous crez un chart avec un titre sur l'axe X, et que dans une messagebox vous appelez le titre de l'axe:
    La référence d'objet n'est pas définie à une instance d'un objet.

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 317
    Points
    13 317
    Par défaut
    Citation Envoyé par Gualino Voir le message
    Merci pour votre aide, mais je ne sais pas pourquoi vous me parlez de "Shared", car moi c'est avec "Static" que j'ai des difficultés.
    Shared est le mot clef équivalent en VB.Net au concept habituellement appelé static (dans les autres langages).

    Le mot clef "Static" (qui existe en effet en VB) est une bizarrerie permettant de conserver la valeur d'une variable locale à une procédure/fonction entre deux appels (je pensais qu'il avait été supprimé en VB.net d'ailleurs : c'est anti-POO au possible).

    Il n'a pas d'usage pratique "logique".

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 335
    Points : 111
    Points
    111
    Par défaut
    Oui en effet...

    Je viens d'essayer Shared et çà fonctionne.

    Ce n'est pas dans ce sens que jusque là j'utilisais ce mot clef. En tous cas tant mieux, je vais enfin pouvoir avancer.

    Merci à vous deux.

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

Discussions similaires

  1. declarer une variable avec un bon type
    Par awalter1 dans le forum Général Python
    Réponses: 4
    Dernier message: 05/12/2011, 15h34
  2. Réponses: 14
    Dernier message: 23/03/2011, 20h39
  3. Réponses: 2
    Dernier message: 01/12/2008, 14h18
  4. comment declarer une variable de type date ?
    Par MAJIK_ENIS dans le forum JDBC
    Réponses: 1
    Dernier message: 26/05/2006, 00h02
  5. Comment déclarer une variable globale
    Par davkick dans le forum C
    Réponses: 13
    Dernier message: 20/05/2005, 18h50

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