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 6 et antérieur Discussion :

Le compteur de référence [Trucs & Astuces]


Sujet :

VB 6 et antérieur

  1. #1
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut Le compteur de référence
    Sous VB la gestion des objects passe par un compteur de référence qui s'incrémente
    ou se décrémente automatiquement en fonction de la durée de vie de l'object -
    la durée de vie de l'object est liée
    - soit à la copie de l'object
    - soit au déférencement par l'utilisation d'une affectation à Nothing de l'object
    - soit à la sortie de la portée de l'object

    La gestion des pointeurs sous VB permet de lire ce compteur qui se situe à l'offset+3,
    ce qui peut être utile pour identifier les objects non déférencés.

    Exemple:
    ' 1 Formulaire AutoRedraw:true - 3 commandbuttons à utiliser dans l'ordre de création en mode Runtime
    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
     
    Private Sub Command1_Click()
        Me.Cls
     
        oPtr = ObjPtr(obj1) '   Adresse de l'object initial
        Me.Print "Le compteur est initialisé à la création de l'object et conservé suivant sa portée"
        Me.Print vbTab & "Object initial => " & GetCounter()
    End Sub
     
    Private Sub Command2_Click()
        Dim obj2 As Object
     
        Set obj2 = obj1
     
        Me.Print "Une copie est ajoutée"
        Me.Print vbTab & "Ajout d'une référence locale => " & GetCounter()
    End Sub
     
    Private Sub Command3_Click()
        Dim obj2 As Object
     
        Me.Print "Dès la sortie de la portée de Obj2 dans Command2 : "
        Me.Print vbTab & "Le compteur a été automatiquement décrémenté => " & GetCounter()
     
        Me.Print
        Me.Print "Une copie est à nouveau ajoutée"
        Set obj2 = obj1
        Me.Print vbTab & "Ajout d'une référence locale => " & GetCounter()
     
        Me.Print "La copie est déférencée par l'utilisation de Nothing"
        Set obj2 = Nothing
        Me.Print vbTab & "Le compteur est à nouveau décrémenté => " & GetCounter()
    End Sub
     
     
    Private Sub Form_Terminate()
        MsgBox "dans Form_Terminate => " & GetCounter() & vbCrLf & "L'object n'est toujours pas détruit !"
        Debug.Print GetCounter()
    End Sub
    ' Dans un Module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Declare Sub GetMem4 Lib "MSVBVM60.DLL" (ByVal inSrc As Any, inDst As Long)
    Public obj1 As New Collection
    Public oPtr As Long
     
    Public Function GetCounter(Optional Adr As Long = 0) As Long
        If Adr = 0 Then Adr = oPtr + (3 * 4)
        If Adr <> 0 Then GetMem4 Adr, GetCounter
    End Function
    Dans la fenêtre d'Exécution, on exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? GetCounter(CLng(xxxxxx))
    en remplacant 'xxxxxx' par le handle du compteur qui a été retourné à la fermeture du formulaire ...
    Le compteur a bien été décrémenté en fin d'exécution.

  2. #2
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Whaou !
    Va me falloir un peu de temps pour bien piger le truc

  3. #3
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonsoir Delbeke,
    Il n'y a rien à comprendre - les pointeurs de variables comme ceux d'objects
    référencent un ensemble de données spécifiques; ici, est détaillé l'offset utilisé pour comptabiliser les références à un object, rien d'autre.

    Je vais finir par me demander si mon esprit tortueux ne rend pas compliqué ce qui est simple

Discussions similaires

  1. Référence à un compteur personnel
    Par zeddiccus dans le forum Erreurs - Avertissements
    Réponses: 2
    Dernier message: 12/06/2015, 15h27
  2. levée d'exception et compteur de références
    Par plxpy dans le forum Général Python
    Réponses: 5
    Dernier message: 30/05/2011, 23h19
  3. Compteur de références dans biblatex
    Par degun dans le forum Bibliographies - Index - Glossaires
    Réponses: 5
    Dernier message: 26/01/2011, 08h30
  4. Compteur de référence et pointeurs communs
    Par Montor dans le forum Contribuez
    Réponses: 2
    Dernier message: 04/12/2009, 19h40
  5. compteur de mois+création d'une référence
    Par dado91400 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/07/2007, 15h23

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