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 :

[WD12] Paramètre à une procédure qui change tout seul de valeur


Sujet :

WinDev

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut [WD12] Paramètre à une procédure qui change tout seul de valeur
    Bonjour

    J'ai remarqué un comportement assez inhabituel chez Windev (comparé aux autres languages, s'entend) et j'aimerais savoir si c'est "normal" ou pas.

    Une fenêtre A ouvre une fenêtre B en lui passant en paramètre la valeur d'un champ d'une table T.

    Dans ma fenêtre appelée "B" j'ai besoin de lire aussi d'autres enregistrements de la table T (hFiltre, HLit ....). Et ce faisant j'ai remarqué que mon paramètre change également de valeur !

    Exemple concret :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Fenêtre "A"
    ------------
    Ouvre("B", T.CHAMP)  // ici T.CHAMP vaut 1
     
    Fenêtre "B"
    -----------
    Procédure B(p_parametre)
     
    [...]
     
    HFiltre(T,CHAMP,2)
    HLit(T)
    et à partir d'ici p_parametre ne vaut plus 1 mais 2, cad qu'il semble qu'il ne soit pas statique mais évolue dynamiquement en fonction du champ à partir duquel il a eu sa valeur.

    La solution est facile : transvaser mon parametre dans une variable locale et ne travaille qu'avec cette variable locale, mais je trouve cela relou.

    Pouvez-vous me confirmez que c'est un comportement normal ?

    Merci
    Loko

  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,

    Windev gère les enregistrements de champs de l'analyse comme des variables composées globales au projet.

    CAD que si tu as un fichier "T_USER" avec les champs "Id", "Nom" et "Prenom"
    alors Windev déclare une variable comme ceci (en simplifiant, bien sur)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       T_USER est composée de 
           Id est un entier
           Nom est une chaine
           Prenom est une chaine
    Cette variable contient les valeurs de l'enreigstrement en cours dans le fichier T_USER.

    Maintenant, il faut savoir que les paramètres des procédures dans Windev sont, par défaut, passés par variable et non par valeur. Ce qui donne ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Procedure P_FaitQuelqueChose( Param1)
    Param1 = Param1 + 10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Local
        MaVariable est un entier
     
    MaVariable = 10
    P_FaitQuelqueChose( MaVariable)
    Info( MaVariable) // donne 20
    Le mieux est d'employer la méthode relou, ou alors de se repositionner au bon endroit de la base, grace à HSauvePosition et HRetourPosition

    Je voudrais quand signaler, qu'il n'est pas nécessaire de passer en parametre les champs d'un fichier, puisqu'ils sont "global" au projet.

  3. #3
    Membre confirmé
    Profil pro
    Freelance
    Inscrit en
    Avril 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Avril 2003
    Messages : 393
    Points : 492
    Points
    492
    Par défaut
    Cela vient peut etre du passage par adresse et non pas par valeur.

    Essaye de mettre des parentheses autour de T.CHAMP:

    Dans ce cas, tu n'as plus besoin de créer une variable locale. Tu travailles juste avec ta variable p_parametre

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Merci pour tes explications.

    Citation Envoyé par kwasin Voir le message
    Je voudrais quand signaler, qu'il n'est pas nécessaire de passer en parametre les champs d'un fichier, puisqu'ils sont "global" au projet.
    Justement, comme je savais que j'allais avoir besoin de refiltrer autrement mon fichier j'ai voulu passer par parametre afin de garder la valeur initiale. Mais ce n'était donc pas suffisant.

    A bientot

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Bonjour

    Citation Envoyé par VincentRoy Voir le message
    Cela vient peut etre du passage par adresse et non pas par valeur.

    Essaye de mettre des parentheses autour de T.CHAMP:

    Dans ce cas, tu n'as plus besoin de créer une variable locale. Tu travailles juste avec ta variable p_parametre
    Ok. Mais peux tu stp m'expliquer ce que les parenthses changent d'une manière generale ? Elles "forcent" un passage par valeur et non par adresse ?

  6. #6
    Firetox
    Invité(e)
    Par défaut
    Bonjour,

    comme en c par exemple le passage par adresse se fait par *variable
    et le pasage par valeur avec variable

    en windev le passage par adresse variable
    et le passage par valeur (variable)

    par defaut on remarque que windev passe tout en adresse et non en valeur et donc il faut faire tres attention a ce qu'on fait par exemple

    une fonction AjouteUn(A est un entier)
    A = A+1
    renvoyer A

    dans les differents appels

    toto est une entier = 2
    trace(AjouteUn(tot))
    affichera 3 et toto vaudra alors 3

    mais si on fait
    toto est une entier = 2
    trace(AjouteUn((Toto))
    affichera 3 et toto vaudra alors 2

    donc bien comprendre comment windev fonctionne evite aussi de chercher pendant des heures des choses qui sont en fait normales

  7. #7
    Membre confirmé
    Profil pro
    Freelance
    Inscrit en
    Avril 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Avril 2003
    Messages : 393
    Points : 492
    Points
    492
    Par défaut
    Tu peux en plus rechercher dans l'aide de windev à "Paramètre d'une procédure / une fonction".

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Merci pour ta réponse

    Citation Envoyé par Firetox Voir le message
    donc bien comprendre comment windev fonctionne evite aussi de chercher pendant des heures des choses qui sont en fait normales
    Effectivement, cependant Windev est franchement compliqué et avec ses tonnes de fonctions et de syntaxes différentes pour faire la meme chose on est loin de développer "10 fois plus vite" :-(

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par VincentRoy Voir le message
    Tu peux en plus rechercher dans l'aide de windev à "Paramètre d'une procédure / une fonction".
    Je suis pas le dernier à chercher dans l'aide, crois-moi bien ! Mais meme en cherchant cela tu récuperes un million de résultats ^^

    C'aurait également été bien si cela avait été expliqué dans le guide de formation, vu que c'est qd meme un truc de base important.

    PS : on peut également préciser Ma_Procedure (LOCAL mon_parametre). Je préfère largement cette notation explicite, ca se rapproche bcp d'un bon vieux "IN" ou "IN OUT".

    L.

Discussions similaires

  1. une commande qui change tout!
    Par GR3lh442kR dans le forum SDL
    Réponses: 4
    Dernier message: 02/09/2009, 20h28
  2. Réponses: 3
    Dernier message: 12/11/2008, 18h38
  3. Réponses: 16
    Dernier message: 19/02/2008, 14h10
  4. Variable de session qui change toute seule
    Par mijean dans le forum Langage
    Réponses: 5
    Dernier message: 21/05/2007, 14h42
  5. Ip qui change toute seul , je veux stoper..?
    Par loobstyle dans le forum Windows XP
    Réponses: 2
    Dernier message: 19/06/2006, 08h25

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