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

WinDev Discussion :

[WD10]Passage d'objet en paramètres de methode


Sujet :

WinDev

  1. #1
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut [WD10]Passage d'objet en paramètres de methode
    Bonjour à tous,

    Je suis confronté à un comportement étrange sous Windev.
    Je souhaite passer un objet en paramètre du constructeur d'un autres objet.
    Je declare le premier objet, et le passe en paramètre du second, et je m'aperçois qu'au moment de la construction, le premier objet est instancié une seconde fois.

    Comment faire pour eviter ce problème ?
    merci de votre aide.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Bonjour,

    Qu'entends-tu par "instancié une seconde fois" ?

  3. #3
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    On peut voir un peu de code ?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par Isildur
    Bonjour à tous,

    Je suis confronté à un comportement étrange sous Windev.
    Je souhaite passer un objet en paramètre du constructeur d'un autres objet.
    Je declare le premier objet, et le passe en paramètre du second, et je m'aperçois qu'au moment de la construction, le premier objet est instancié une seconde fois.

    Comment faire pour eviter ce problème ?
    merci de votre aide.
    Ce serait bien d'utiliser les bons termes.

    J'essaie de reformuler :
    Je suis confronté à un comportement étrange sous Windev.
    Je souhaite passer un objet X en paramètre du constructeur d'une class Y.
    Je declare le premier objet X, et le passe en paramètre au constructeur de la class Y, et je m'aperçois qu'au moment de la construction, le premier objet (X?)est instancié une seconde fois.

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Il s'agit d'une recopie de l'objet, ce n'est pas l'adresse de l'objet que tu veux passer mais bien l'objet donc recopie. Rien d'anormal à première vue.

  6. #6
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par hegros
    Il s'agit d'une recopie de l'objet, ce n'est pas l'adresse de l'objet que tu veux passer mais bien l'objet donc recopie. Rien d'anormal à première vue.

    Autant pour moi pour cette formulation inexacte alors, le fait est que je ne veux pas qu'il y ait deux objets, mais un seul. Comment dois je m'y prendre selon vous ?

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Montre le code qui pose probléme en réduisant au minimum sur la partie qui cause probléme.

  8. #8
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Voici les deux objets en question :

    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
     
    Connection_API est une classe
    PROTÉGÉ
     
    	Control_Connection est un booléen = Faux
    	Reponse est un chaîne = ""
    PRIVÉ
    	Host est un chaîne = ""
    	Port est un chaîne = ""
    	User est un chaîne = ""
    	Password est un chaîne = ""
    	Control_Composant est un booléen = Faux
    	Control_Host est un booléen = Faux
    	Control_Port est un booléen = Faux
    	Control_User est un booléen = Faux
    	Control_Password est un booléen = Faux
    FIN
     
     
    PROCEDURE Constructeur(Host= "", port= "", user= "", Password= "" )
     
    SI :Control_Connection = Faux ALORS 
    	SI :Control_Composant = Faux ALORS
    		:Control_Composant = Vrai
    		SI RegistreExiste("HKEY_CLASSES_ROOT\TypeLib\{CAD60D2F-90DF-11D1-8DF6-0004AC6568DE}\1.0\0\win32","") = Faux ALORS :Control_Composant = Faux;:Reponse = "MvxSock.dll n'est pas présent dans C:\Windows."
    		SI fFichierExiste("C:\WINDOWS\MvxSockX_SVR.dll") = Faux ALORS :Control_Composant = Faux;:Reponse = "MvxSock.dll n'est pas présent dans C:\Windows."
    		SI fFichierExiste("C:\WINDOWS\MvxSock.dll") = Faux ALORS :Control_Composant = Faux;:Reponse = "MvxSock.dll n'est pas présent dans C:\Windows."
    		SI :Control_Composant = Faux ALORS Erreur(:Reponse)
    	FIN
    	SI :Control_Host = Faux ALORS :Set_Host(Host)
    	SI :Control_Port = Faux ALORS :Set_Port(port)
    	SI :Control_User = Faux ALORS :Set_User(user)
    	SI :Control_Password = Faux ALORS :Set_Password(Password)
    FIN
    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
     
    API_Mvx est une classe
     
    		More est un entier
    		Err est un chaîne = ""
    		TransName est un chaîne = ""
    		DATE est un chaîne = ""
    		TIME est un chaîne = ""
    		ZZUSID est un chaîne = ""
    		ZDCONO est un chaîne = ""
    		ZDDIVI est un chaîne = ""
    		ZDFACI est un chaîne = ""
    		ZZWHLO est un chaîne = ""
    		ZDAUPF est un chaîne = ""
    		ZDREPF est un chaîne = ""
    		ZDLANC est un chaîne = ""
    		ZDDTFM est un chaîne = ""
    		DTFM est un chaîne = ""
    		DSEP est un chaîne = ""
    		MRCD est un chaîne = ""
    		DUMM est un chaîne = ""
    PROTÉGÉ	
    		MvxCx est un objet Connection_API
    		Reponse est un chaîne = ""	
    PRIVÉ
    		APIname est un chaîne = ""
    		Cx est un objet Automation  "MvxSockX_SVR.MvxSockX"
    FIN
     
    PROCEDURE Constructeur(MvxCx est Connection_API, MINM = "")
    :APIname = MINM
    :MvxCx = MvxCx		
    SI :MvxCx:Get_Control_Connection() = Vrai ALORS
    	:Reponse = :Cx>>MvxSockConnect(:MvxCx:get_host(),:MvxCx:get_port(),:MvxCx:get_user(),:MvxCx:get_password(),MINM,"")
    	:APIname = MINM
    	SI :Reponse <> "0" ALORS :Err = "Impossible de se connecter"
    FIN
    Maintenant le code ou j'appelle ces classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    MvxAPIcx est un objet dynamique = allouer une Connection_API ( variable IP , variable port , variable user, variable port)
    LG est API_Mvx (MvxAPIcx ,"GENERAL")
    Sur cette seconde ligne de code le constructeur de Connection_API est appellé à nouveau. J'ai bien essayé de passer MvxAPIcx par valeur :
    LG est API_Mvx ((MvxAPIcx) ,"GENERAL")
    mais cela ne change rien à mon problème.
    merci de votre aide.

  9. #9
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    A priori c'est normal. Par contre dans la class API_Mvx je mettrais que MvxCx est un objet dynamique et c'est à l'instanciation de LG (dans le code du constructeur) que j'allouerai MvxCx puis que je ferais la copie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MvxCx est un objet dynamique

    Puis au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    :MvxCx = allouer 1 Connection_API
    :MvxCx = MvxCx
    C'est comme cela que je procéde en tout cas. Cependant j'avais déja posté un message sur comment Windev gére les copies d'objet mais resté sans trop de réponse

  10. #10
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    et bien ça ne marche pas non plus, le code constructeur de Connection_API est appellé lors de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    :MvxCx = allouer une Connection_API

  11. #11
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par Isildur
    et bien ça ne marche pas non plus, le code constructeur de Connection_API est appellé lors de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    :MvxCx = allouer une Connection_API
    Oui c'est normal qu'il soit appelé puisque tu fais une allocation Quand tu déclares une variable ou que tu en alloues le code du constructeur est automatiquement appelé.

    Tu devrais lire un peu de doc sur le paradigme OO

  12. #12
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    Donc en somme ce que je veux obtenir n'est pas possible ? Cela me surprend un peu quand même.
    Quant au paradigme OO, il est clair que je suis un peu novice sur ce point, mais renseignement pris auprés d'un ami qui travaille en Delphi, lui n'est pas confronté à ce type de fonctionnement.
    De fait je trouve que cela reduit fortement l'intérêt de la POO sous windev (bon j'imagine qu'il y a d'autres interêts), mais ici à la limite ce n'est pas dramatique, ma classe Connection_API n'est la que pour vérifier la présence d'un composant et s'assurer que la machine en question est en mesure d'exploiter le reste du programme, mais je suis en train de faire un autre projet avec le même genre de fonctionnement ou l'objet que je souhaite passer est une connection à une base de données (par sqlconnecte), si à chaque fois que je fais appel à ce genre d'objet, le programme va se connecter à la base de données, en terme de performance c'est pas terrible.

    Néanmoins merci de votre aide

  13. #13
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Tu n'arrives pas à obtenir ce que tu veux ? Ce qu'il faut comprendre c'est que ce que tu souhaites (ne pas rappeler le constructeur) n'est pas possible. Essaie d'implémenter ton code en C++ tu verras si le constructeur (ou celui de recopie) n'est pas sollicité

  14. #14
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    je comprend tout à fait, je suppose que pour obtenir ce que je souhaite, je dois sortir mon code du constructeur, et le placer dans une autre méthode que j'appelle à mon initiative.

  15. #15
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Je ne sais pas ce qui te pose probléme exactement. C'est vraiment la recopie de l'objet qui pose souci ?

  16. #16
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    non, ce qui me pose problème, c'est que du code superflu, et potentiellement gourmand en temps soit executé plusieurs fois.

  17. #17
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    En Delphi c'est complètement différent, mais pas forcement mieux

    Maintenant, le tout est de comprendre le mécanisme de Windev, puisqu'apres tout c'est en Windev que tu programmes !

    Bon alors je vais essayer d'être clair.

    Si tu ecris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaConnexion est une Connection_API
    Tu déclares un objet statique, de type Connexion_API. Windev appelles alors le constructeur de Connexion_API afin d'initialiser correctement ton objet.

    si tu ecris

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaConnexion est une Connection_API dynamique
    tu déclares alors un objet dynamique de type Connection_API. Windev alloues alors la mémoire nécessaire pour ton objet, MAIS ne l'initialises pas. Donc pas d'appel à un constructeur.

    Dans le premier cas MaConnexion est un Objet
    Dans le second cas MaConnexion représente une addresse mémoire pointant sur un objet.

    C'est donc tres différent.

    Maintenant dans ta classe tu déclares
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MvxCx est un objet Connection_API
    Donc Windev attend un Objet.

    Et toi tu lui passes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MvxAPIcx est un objet dynamique = allouer une Connection_API ( variable IP , variable port , variable user, variable port)
    Soit une adresse ! Donc il plante et c'est parfaitement normal.
    Tu peux faire un test simple. Dans ton constructeur de Connexion_API, tu vires les valeurs par défaut, tu va constater que la déclaration de ta classe API_Mvx ne passe pas à la compile.

    Tu as 2 solutions.

    Soit tu déclares, dans API_Mvx, l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MvxCx est un objet Connection_API dynamique
    En n'oubliant pas de modifier ton code constructeur de API_Mvx en signalant que le paramètre est dynamique !

    et là ça devrait fonctionner.

    Soit, dans ta procedure d'appel tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MvxAPIcx est un Connection_API ( variable IP , variable port , variable user, variable port)
    LG est API_Mvx (MvxAPIcx ,"GENERAL")
    Note : Perso je choisirais la 1ere solution !

    Voila, j'espere avoir été clair. Et surtout, n'imagine pas qu'en Delphi c'est mieux. Borland à simplifier à outrance les objets, allocations & co, mais ca entraine des complications ailleurs !

  18. #18
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    on ne peux plus clair... ça fonctionne exactement comme je le voulais , merci donc à kwasin et hegros pour votre précieuse aide, avant de mettre [Resolu] sur ce topic, pourriez vous me conseillez des ressources me permettant d'eviter ces ecueils de débutant ?

  19. #19
    Inactif  
    Profil pro
    Inscrit en
    Février 2003
    Messages
    4 341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 4 341
    Points : 5 953
    Points
    5 953
    Par défaut
    Citation Envoyé par Isildur
    on ne peux plus clair... ça fonctionne exactement comme je le voulais , merci donc à kwasin et hegros pour votre précieuse aide, avant de mettre [Resolu] sur ce topic, pourriez vous me conseillez des ressources me permettant d'eviter ces ecueils de débutant ?
    Ben, oui..
    Poses-tes questions !

  20. #20
    Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Avril 2003
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Avril 2003
    Messages : 70
    Points : 50
    Points
    50
    Par défaut
    bien alors, j'en pose une...
    maintenant que j'ai pu passé un objet en paramètre sans en instancier un nouveau, est il possible pour un objet de se passer lui meme en paramètre lorsqu'il instancie un autre objet ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [POO] Passage d'objet en paramètre
    Par tintin72 dans le forum Langage
    Réponses: 6
    Dernier message: 13/08/2008, 21h06
  2. Passage d'Objet en paramètre d'un formulaire
    Par wadoo dans le forum IHM
    Réponses: 9
    Dernier message: 03/07/2008, 10h54
  3. Passage d'objet en paramètre de DLL
    Par nek_kro_kvlt dans le forum Langage
    Réponses: 22
    Dernier message: 22/07/2007, 20h50
  4. passage d'objet en paramètre
    Par chilokan dans le forum Delphi
    Réponses: 6
    Dernier message: 07/05/2007, 22h29
  5. [DLL] Passage d'objet en paramètre
    Par TitiFr dans le forum Langage
    Réponses: 4
    Dernier message: 21/08/2005, 00h18

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