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 :

[VB6]Passage par référence d'une prop. d'objet à une fct


Sujet :

VB 6 et antérieur

  1. #1
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut [VB6]Passage par référence d'une prop. d'objet à une fct
    Salut à tous...

    Je suis débutant en VB alors si les explications sont pas très clair ou s'il vous manque des infos, n'hésitez pas à me poser des questions.

    Alors voilà, j'ai rencontré un problème et ça va faire un moment que je penche dessus. J'ai créé une classe Ligne avec 4 propriétées : les 4 coordonnées X1, Y1, X2, Y2 d'une ligne, et je souhaite passer ces valeurs par référence à une fonction Rotation_Point qui en modifira ces valeurs

    J'ai simplifié volontairement le code pour cibler le problème.
    Voilà le code que j'ai tapé et qui ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ' Obj est l'objet que je passe en paramètre (ici c'est une Ligne) 
    ' XO, YO est le point de rotation autour duquel va tourner la ligne 
    ' Angle_Rot est l'Angle de Rotation que va effectuer la ligne 
    Private Sub Rotation_Forme(Obj As Object, ByVal XO As Single, ByVal YO As Single, ByVal Angle_Rot As Single) 
    With Obj 
       If TypeOf Obj Is Ligne Then
          Rotation_Point .X1, .Y1, XO, YO, Angle_Rot 
          Rotation_Point .X2, .Y2, XO, YO, Angle_Rot 
       End If 
    End With 
    End Sub
    Pour info, la fonction Rotation_Point recoit bien les valeurs des Points X1, Y1 et X2, Y2, elle les modifie mais une fois sorti de la fonction, les valeurs des 4 propriétées (X1, Y1, X2, Y2) reste inchangées.

    Celui-là marche. Mais pour faire tourner une figure avec bcp de point, chose même pas imaginer le tps que ça va mettre s'il faut que je fasse à chaque fois 4 affectations par point. C'est pour ça que je souhaite faire à tout prix un passage par référence.

    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
    Private Sub Rotation_Forme(Obj As Object, ByVal XO As Single, ByVal YO As Single, ByVal Angle_Rot As Single) 
    Dim X As Single 
    Dim Y As Single 
    With Obj 
    If TypeOf Obj Is Ligne Then 
    X = .X1 
    Y = .Y1 
    Rotation_Point X, Y, XO, YO, Angle_Rot 
    .X1 = X 
    .Y1 = Y 
    X = .X2 
    Y = .Y2 
    Rotation_Point X, Y, XO, YO, Angle_Rot 
    .X2 = X 
    .Y2 = Y 
    End If 
    End With 
    End Sub
    Voilà c tout, j'espère que j'ai pas oublié d'explication.
    Merci d'avance....

  2. #2
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    En fait voilà la déclaration de ma fonction Rotation_Point :

    Private Sub Rotation_Point(ByRef X As Single, ByRef Y As Single, ByVal XO As Single, ByVal YO As Single, ByVal Angle_Rot As Single)

    Le problème c'est qu'il marche très bien dans le deuxième cas (cf. ci-dessus) mais pas dans le premier. Je voit pas pourquoi je suis obligé de faire une affectation à une variable avant de la passé en paramètre dans la fonction et de récupérer la valeur de cette variable.
    Le passage par référence ne s'applique pas à une propriété d'objet ???

  3. #3
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Avant tout, je voudrais te signaler que ce n'est pas une fonction que tu fais. C'est une Sub, une routine toute simple.

    Ensuite, tu as essayé de le Declarer AS LIGNE ton objet ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Rotation_Forme(Byref Obj As Ligne, ByVal XO As Single, ByVal YO As Single, ByVal Angle_Rot As Single)
    Pour voir un peu ce que ca faisait ?

  4. #4
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Je vient de relire mon sujet et c vrai que j'ai pas été très clair.
    Je reprend donc :
    J'ai deux routine Sub dont j'ai gardé que les paramètres qui pose problème pour pas tout compliquer :

    - La première, Private Sub Rotation_Forme(Obj as Object)
    qui prend en paramètre un objet, ca peut-être n'importe quoi, une Ligne, un Rectangle, une Ellipse, c'est pour ca que j'ai déclaré ma variable Obj comme un type object. C'est pour ca aussi que j'ai laissé la condition :
    If Typeof Obj Is Ligne Then parce qu'il y en a plusieur après. J'ai juste prit un cas vu que c le même problème pour les autres.

    - La deuxième routine, Private Sub Rotation_Point(X as Single, Y as Single)
    qui prend en paramètre deux Single, X et Y dont je veux modifier ces valeurs dans cette fonction.

    Tous les paramètres de ces routines sont passés pas références.

    Donc la première routine Rotation_Forme passe en paramètre à la deuxième routine Rotation_Point ces propriétés X1, Y1 par référence que la fonction Rotation_Point doit modifier.

    Ce que je souhaite c que à la sortit de la deuxième routine Rotation_Point, les valeurs des propriétés X1 et Y1 de l'objet Obj soit modifier sans passé par des affectations auparavant.

    Le cas qui marche :
    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
    -------------------------------------------------------------------------------------
    Private Sub Rotation_Forme(ByRef Obj As Object)
    Dim X As Single
    Dim Y As Single
    With Obj
        If TypeOf Obj Is Ligne Then
            X = .X1
            Y = .Y1
            Rotation_Point X, Y
            .X1 = X
            .Y1 = Y
       End If
    End With
    End Sub
    -------------------------------------------------------------------------------------
    Le Cas qui ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    -------------------------------------------------------------------------------------
    Private Sub Rotation_Forme(ByRef Obj As Object)
    With Obj
        If TypeOf Obj Is Ligne Then
            Rotation_Point .X1, .Y1
       End If
    End With
    End Sub
    -------------------------------------------------------------------------------------
    J'ai Testé les deux cas simplifié comme cela, le premier marche pas le deuxième.
    Je veut que ma routine Rotation_Point modifie les propriétés Obj.X1 et Obj.Y1 que je lui passe en paramètre dans le corps de ma routine Rotation_Forme.

    J'espère que j'aurais été plus clair cette fois ci.
    Merci à vous...

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 608
    Points : 1 561
    Points
    1 561
    Par défaut
    Oui mais ce serait quand même bien de savoir si c'est la même chose en déclarant ta procédure comme l'a suggéré Zemenass, même si on a compris pourquoi tu as mis Object:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub Rotation_Point(Byref Obj As Ligne, ByVal XO As Single, ByVal YO As Single, ByVal Angle_Rot As Single)

  6. #6
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Oui j'ai essayé est c'est exactement le même problème

  7. #7
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Avant la routine Rotation_Point :
    X1 = 20
    Y1 = 30

    Valeur des paramètres de la routine et avant affectation :
    X = 20
    Y = 30
    mvarX1 = 20
    mvarY1 = 30

    Après affectation et avant de sortir de la procédure :
    X = 2500
    Y = 7500
    mvarX1 = 20
    mvarY1 = 30

    Dans la routine Rotation_Point, le code ne s'exécute pas dans les propriétés de l'objet. Il ne va à aucun moment dans une de mes propriétés de ma classe.

  8. #8
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut
    Bon, bin j'ai fait un petit test, j'aurais pu le faire avant vous allez me dire, mais c'était sans doute la clarté du sujet qui ne m'y a pas obligé ....

    Merci gys de m'apprendre cela, il est impossible de passer par référence des propriétés de classes (perso ou pas). Il les passe par valeur car il est incapable d'affecter la propriété vu qu'il gère bizarement ces histoires e pointeur, je ne sais pas comment d'ailleurs .....

    Vive VB !!!!!!!

  9. #9
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Ah bon, bah je vient d'apprendre quelquechose aussi alors. J'ai cherché aussi de mon coté pour comprendre comment marchait les pointeurs en VB (ca peut pas être plus chiant que le C de toute manière :-))) ), mais j'ai rien trouvé dans l'aide, ni dans les bouquins que j'avais. Est-ce que tu connaîtrai un site ZuZu qui expliquerai cela ou pas ?
    Va bien falloir que je trouve une autre solution moins bourrin que les affectations et qui m'évite la redondance dans le code...


    Voilà c'était la dernière chose que je te demandai, maintenant je te laisse tranquille.

    Merci quand même de t'être donné tout ce mal. Merci aux autres aussi...

  10. #10
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut
    Tu 'nas rien trouvé sur les pointeurs en VB et tu ne trouveras rien car cette notion n'existe tout simplement pas !!!

    Il existe le passage de variables par référence qui s'y rapproche, c'est tout !!! C'est la seule notion qui s'y aparente, mais valable seulement pour des variables de types simple, on vient de le voir.

    Et ne cherche pas, il n'y a pas d'autres moyens !!!!! Si tu ne peux passer par référence une proriété d'un objet, tu ne peux pas, il va bien falloir qu'à un moment ou un autre tu fasses tes affectations, ou alors tu passes tout l'objet à la fonction, et c'est débile je sais, tu arrives souvent en VB à certaines limites qu'il est difficile de contourner, peut-etre pourrais-tu revoir l'architecture de cette partie de ton appli pour qu'elle s'adapte plus à cette contrainte.

    Voila, bonne journée.

  11. #11
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Oui j'ai déjà trouvé la solution : LA REDONDANCE du code, mais c pas grave, ce qui compte c que le programme soit efficace non ?
    J'aime pas trop ca, mais bon quand y a pas le choix...

    Ok merci à toi...

  12. #12
    Expert éminent

    Avatar de Maxence HUBICHE
    Homme Profil pro
    Développeur SQLServer/Access
    Inscrit en
    Juin 2002
    Messages
    3 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur SQLServer/Access

    Informations forums :
    Inscription : Juin 2002
    Messages : 3 842
    Points : 9 197
    Points
    9 197
    Par défaut
    Ben moi je te ferai bien une suggestion:
    Tu fais une classe clsPoint
    Avec 2 propriétés X et Y
    Tu fais ta classe ligne qui implemente 2 clsPoint (debut,Fin)
    Et tu passes tes clsPoints par référence. Comme ca, ca devrait marcher non ?

  13. #13
    Membre régulier
    Inscrit en
    Mai 2002
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 117
    Points : 97
    Points
    97
    Par défaut
    Bin oui, il faut décomposer, plutot que de passer tout ton objet à ta fonction, tu découpe ton objet en sous-classe point, et tu passes cette sous-classe.

  14. #14
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Effectivement l'idée est pas bête du tout. Je fait essayé de le faire comme vous me l'avez proposé.

    Merci à vous...

  15. #15
    Candidat au Club
    Inscrit en
    Août 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci à tous, ça marche sans problème même avec bcp de point !!!!

  16. #16
    Rédacteur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 608
    Points : 1 561
    Points
    1 561
    Par défaut
    J'avais fait aussi des tests, et même avec de simples variables publiques ça ne marche pas. Le pire, c'est que l'on peut vérifier qu'il passe bien l'adresse de la variable en comparant les adresses avec VarPtr(variable).

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

Discussions similaires

  1. passage par zéro du laplacien
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/06/2005, 09h58
  2. Réponses: 2
    Dernier message: 05/10/2004, 22h43
  3. [Debutant(e)]passage par adresse?
    Par cap2fosse dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2004, 10h05
  4. passage par session_OnEnd
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 06/05/2004, 11h28
  5. [VB6]Passage d'un tableau dans une DLL écrite en delphi
    Par flash dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 20/09/2002, 10h15

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