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 :

Passage de paramètres et appel de propriété


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 88
    Par défaut Passage de paramètres et appel de propriété
    Bonjour tout le monde, j'ai deux petites questions qui me taraudent alors que je suis en train de développer...
    Au vu des réponses de qualité que j'ai déjà pu avoir ici je me permet de vous les poser, je sais que la réponse sera rapide.

    1) Quand dans une fonction je passe un paramètre objet par "Byval", doit je le décharger explicitement de la mémoire ou est ce que VB s'en occupe tout seul comme un grand ?
    Par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Public Function getValues(ByVal objRefresher As Object, ByVal colIndex As Collection) As String
    .............
     
        set objRefresher = nothing 'est-ce utile ? indispensable ? inutile ?
        set colIndex = nothing 'pendant qu'on y est :mrgreen:. Ca je pense que c'est pas utile mais on sait jamais !
    End Function
    2) La deuxième question est plus bizarroïde si vous me passez l'expression.
    Mettons que je veuille récupérer une propriété d'un objet en fonction d'un argument. Je peux faire un truc dans ce style :
    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
     
    'toujours la même, on change pas une équipe qui gagne (enfin je schématise à chaque fois) !
    Public Function getValues(ByVal objRefresher As Object, byval paramStr as string) As String
             Select case paramStr
                   case "PercentProcessorTime"
                       getValues = objRefresher.PercentProcessorTime     
     
                   case "UserProcessorTime"
                       getValues = objRefresher.UserProcessorTime 
     
                   case "C1ProcessorTime"
                       getValues = objRefresher.C1ProcessorTime
     
                   etc.....
             End select
    End Function
    Mais est ce que il n'existerait pas un moyen quelconque (honnetement je n'ai aucune idée la dessus) pour faire un truc dans ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Function getValues(ByVal objRefresher As Object, byval paramStr as string) As String
             getValues = objRefresher.paramStr
    End Function
    Ca existe pas ça non Ca serait bien cool pourtant parce sinon que des "case" y'en aurait une centaine....
    Je précise que objRefresher c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")

    Mesdames, messieurs, merci de votre attention !!

  2. #2
    Membre Expert
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Par défaut
    1. Non, il n'est pas nécessaire de détruire les variables de paramètres, elle n'appartienne qu'à la procédure et son automatiquement virées de la mémoire quand on sort de ladite procédure. Ce n'est pas comme les variables objets créées à l'intérieur d'une procédures qui, elles, doivent être explicitement détruites.
    2. Heu... là vraiment... t'exagères pas un peu ? À quoi te sert une telle fonction si tu dois entrer à la main en paramètre le résultat à retourner ? Pourquoi alors ne pas y aller directement et au besoin ? Exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      maVariable = objRefresher.PercentProcessorTime
      si c'est le pourcentage d'utilisation du temps-processeur que tu cherche à obtenir... et ainsi de suite...

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Par défaut
    1. Ce que dit zaza est vrai si et seulement si le paramètre est passé en BYVAL

    En ByRef, c'est un pointeur externe qui ne sera donc pas détruit à la fin de la procédure SAUF en cas d'utilisation d'un serveur d'application externe (hébergement d'un ocx sur une machine, et tu y fais appel par par exemple ladite fonction depuis une autre machine. Là tu pourras mettre byref il dupliquera le pointeur de toute façon et donc, le détruira en sortie de fonction)

    2. CallByName(objet,methodname)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 88
    Par défaut
    1 ) Ok pour moi au vu des deux réponses. A priori il n’y a pas de problèmes puisque je passe bien mes paramètres par Byval.
    Dans le même sens si je passe un paramètre objet en ByRef et que je fais set leParam = nothing alors il me détruit l’objet original? Il me semble bien que c’est quelque chose dans ce gout là mais j’en suis pas sur ! Merci d’avoir éclairé ma lanterne.

    2) @ Zazaraignee : A trop vouloir simplifier on en oublie d’être compréhensible. L’exemple que je donnais n’étais là qu’a titre d’illustration. Si c’était réellement ce que je voulais faire je ne me serais pas pris la tête outre mesure ! Je vais essayer de replacer la problématique dans un contexte pour que ça devienne plus clair .

    Mon projet à pour but de récupérer des informations grâce à WMI. J’utilise dans ce cas de figure un objet refresher WMI qui permet de rafraichir et d’extraire des infos de classe WMI.


    Voici maintenant une façon de récupérer une information concernant le processeur et la mémoire depuis l’objet refresher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
             msgbox objRefresher.object(colIndex("Proc")).ProcessorTime 'temps processeur
             msgbox objRefresher.object(colIndex("Memory")).FreeMemory 'memoire libre
    Maintenant imaginons que je fasse ça :
    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
     
             private infosARecup as collection
     
             sub From_Load()
              'Création d’une collection de propriété à récupérer
              set infosARecup = new collection
              infosARecup.add "Proc|ProcessorTime"
              infosARecup.add "Proc|UserTime"
              infosARecup.add "Proc|C1Time"
              infosARecup.add "Proc|C2Time"
              infosARecup.add "Memory|UsedMemory"
              infosARecup.add "Memory|FreeMemory"
             end sub          
     
              sub Timer_timer
                   Dim i as byte, dim msg as string, dim classe as string, propriete as string
              'initialisation du message à afficher
              msg = ""  
     
                     for i = 1 to infosARecup.count
                             'Récup des paramètres
                            classe = split(infosARecup(i),"|")(0)
                            propriete = split(infosARecup(i),"|")(1)
                            'et construction du message
                            select case propriete
                                       case  "ProcessorTime"
           		          	msg = msg & propriete & "=" & objRefresher.object(colIndex(classe)).ProcessorTime      	          
                                       case "UserTime"
    			msg = msg & propriete & "=" & objRefresher.object(colIndex(classe)).UserTime       
                                       case "C1Time"
    			msg = msg & propriete & "=" & objRefresher.object(colIndex(classe)).C1Time       
     		                   case "C2Time"
    			msg = msg & propriete & "=" & objRefresher.object(colIndex(classe)).C2Time     
    		                   case "UsedMemory"
    			msg = msg & propriete & "=" & objRefresher.object(colIndex(classe)).UsedMemory      
    		                   case "FreeMemory"
    			msg = msg & propriete & "=" & objRefresher.object(colIndex(classe)).FreeMemory    
                            end select
                     next
                     msgBox msg
             end sub
    il faut avouer que ça à quand même plus de « gueule » avec la méthode (au demeurant géniale !, merci beaucoup) de Vld44 :
    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
     
              sub Timer_timer
                   Dim i as byte, dim msg as string, dim classe as string, propriete as string
              'initialisation du message
              msg = ""   
     
                     for i = 1 to infosARecup.count
                             'Récup des paramètres
                            classe = split(infosARecup(i),"|")(0)
                            propriete = split(infosARecup(i),"|")(1)
                            'et construction du message
                            msg = msg & propriete & "=" & CallByName(objRefresher(colIndex(classe)).object, propriete, VbGet)
                     next
                     msgBox msg
             end sub
    Voilà j’éspères que c’est plus clair même si ça n’a toujours rien à voir avec le vrai projet un peu plus complexe. En fait la collection infosARecup est en réalité une collection de classes mais bon l’esprit est le même !!!
    Je t’invite si ça t’intéresse à consulter cette source ce soir quand j’aurais fais ma nouvelle mise à jour. Elle devrait intégrer les notions évoquées au dessus.
    http://www.developpez.net/forums/sho...d.php?t=535238

    Vld44 merci beaucoup pour ton aide, j’en apprend tout les jours c’est excellent, je pensais même pas que ma deuxième demande était possible !! ZazAraignée merci aussi pour ta réponse bien entendu.

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

Discussions similaires

  1. [AC-2010] Passage de paramètre pour appel de procédure
    Par Pago283 dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/01/2013, 15h48
  2. Passage de paramètre et appel de fonction de dessin
    Par Naezys dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 28/10/2012, 18h02
  3. Passage de paramètre à l'appel d'un Forms
    Par sibama dans le forum VB.NET
    Réponses: 7
    Dernier message: 13/12/2008, 21h15
  4. Réponses: 13
    Dernier message: 22/10/2008, 16h20
  5. Réponses: 2
    Dernier message: 09/01/2006, 09h38

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