[VB6] Sauvegarde de référance à des objets (pour Set). Possible ??? [Résolu]

Signaler
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
Bonjour,

Déjà mon but ^^:
Je voudrais sauvegardé dans une collection (ou un tableau dynamique, ou autre ce n'est pas trop le problème) des RÉFÉRENCES à des variables. Mon but étant de pouvoir "seter" ces variables à nothing à certain moment.

Le problème à résoudre :
Je travail actuellement à la mise à jours d'un "GROS" programme codé par des ........ Comment dire. Gents pas toujours très propre. Résultat au bout d'un certain temps ce programme atteint le Go d'occupation mémoire alors que 50 Mo suffise largement :/

Ce que je voudrais donc c'est me crée un truc du genre de MyFreeAll (ici) mais cette foix en VB6

Possible ?

Pour les programmeur C (notion de pointeur) :
Je veut donc une collection (ou autre) de void* pointant sur la variable pas sur l'objet !
Par exemple :

Public Sub MySet(ByRef Variable As Object, ByRef Valeur As Object)
    Set Variable = Valeur       'Ici je set bien ma variable
    ObjetSeter.add Variable   'Ici je voudrais stocké un pointeur sur cette varaible
End Sub

Public Sub MyFreeAll()
Dim Variable As Object
    For Each Variable In ObjetSeter
        Set Variable = Nothing '<- Raté ici je passe la variable "Variable" à nothing et non la variable pointé (enfin si je pointe réelement cette dite varaible car en final j'ai un doute)
    Next
    VideCollection ObjetSeter
End Sub

J'ésapire avoir été claire

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa

1 réponse

Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Bonjour,
Déjà la bonne nouvelle : j'ai trouvé comment faire
Ensuite la mauvaise : Je ne peut pas posté ma solution toute faite (une semaine de travail quasi exclusif dessus donc ma hiérarchie ne serais pas très complante de re-trouvé sa sur le net )

Je peut quand même expliquer ma démarche

Alors déjà la sauvegarde d'adresse, j'ai laisser tombé (j'ai cherché tout zazimute des infos sur le passage par adresse et j'ai trouvé, je ne sait plus où exactement par contre , que le VB6 ne fait pas de vrais passage par référence mais TOUJOURS du passage par valeur (dans le cas de ByRef la valeur de la copie est écrite dans la source au moment de la fin de la fonction), j'avouais que je n'es pas vérifier cette affirmation, néanmoins sa m'a fait un peut peur. Vue que je pensais sauvegardé les adresses des variables grasse à une DLL C, du coup j'ai laisser tombé cette idée)

J'ai crée une classe d'analyse de projet
Elle me permet en passant par le VBP de connaitre tout les fichiers du projet (plus quelque info tel que les fonctions public ce qui m'aidera à codé avec ce source )
Je lit donc ces fichiers et en extrais différente info
  La liste de toute les variable déclarer dans ce fichier (pas dans les fonction mais en haut du fichier)
  La liste de toute les structures (une pour les structure public et une autre pour les structure private, cette dernière vidangé à chaque changement de fichier)
-> Dans le cas de Class, Form, et user control j'ajoute (ou je crée suivant le cas) à l'évènement terminate :
  *- Pour les variable de type objet (soit ni type de base ni variant ni structure) set Variable = Nothing pour toute les variable objet.  "erase"
  *- Pour tout les tableaux d'objet
  * Si le tableau est défini (si non risque de bug, testé graçe à Not(Not(Varaible))
  *   Pour tout élément du table (For Compteur = LBound(Variable) to UBound(Variable))
  *     Vidange de l'objet (Set Variable(Compteur) = Nothing)
  * Erase du tableau (Erase Variable)
  *- Pour tout les autres tableaux
  * Erase du tableau (Erase Variable)

-> Dans les module
  *- Pour les variable private (ou dim )

  * Création d'une fonction clear_private_all (passe à nothing les
objets) erase_private_all (détruit tout les tableaux dynamique),
sauvegarde du nom de module dans une collection pour la suite
  *- Pour les variable public (ou global )
  * Création d'une fonction clear_all (passe à nothing les objets, appel pour chaque module ou c'est nésésaire NomModule.clear_private_all) erase_all (détruit tout les tableaux dynamique, idem avec NomModule.erase_private_all)

Et voila tout vas maintenant pour le mieux dans le meilleur des mondes (clear_all erase_all étant appelé à la fin du programme mais c'est ésentiélement les événements terminate des form et classes qui on hue un impacte )
(même si pour réellement bien faire il faudrait que je fasse maintenant la même chose avec toute les variables déclaré dans les fonctions/procédures/propriétés )

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa