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 :

Mystères de la syntaxe Windev


Sujet :

WinDev

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut Mystères de la syntaxe Windev
    Bonjour,

    Une petite interrogation toute simple pour les experts en W-Langage par ici.

    Soit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ChronoDébut(1)
    // Un traitement quelconque
    d est une Durée = ChronoFin(1)
    Trace("Durée totale :", d.EnSecondes, "seconde(s)")
    => ça fonctionne bien

    Soit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ChronoDébut(1)
    // Un traitement quelconque
    Trace("Durée totale :", ChronoFin(1).EnSecondes, "seconde(s)")
    => ça plante, avec le message suivant : L'opérateur '.' est interdit sur un élément de type durée.

    Question 1 : pourquoi obtient-on ce message, qui est de toute évidence faux (l'opérateur '.' est autorisé sur un élément de type durée.) ?

    Question 2 : y a-t-il une syntaxe qui permette d'éviter de déclarer la variable d ?

    J'ai volontairement mis un exemple simple mais je suis régulièrement confronté à ce type de limitation de Windev et je me demande s'il existe une subtilité pour contourner ce problème.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 857
    Points : 5 402
    Points
    5 402
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Lorsque l'on regardes les propriétés associées à la fonction ChronoFin on n'en trouve aucune. Donc la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ChronoFin(1)..EnSeconde
    est interdite.
    On est donc obligé de passer par une variable intermédiaire.

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 069
    Points : 9 510
    Points
    9 510
    Par défaut
    hello,
    il y a un truc louche pour la fonction ChronoFin : Dans la doc c'est écrit :
    <Résultat> = ChronoFin(<Chronomètre>)
    <Résultat> : Durée
    Temps passé (en millisecondes) depuis le dernier appel à la fonction ChronoDébut pour le chronomètre spécifié.
    Le résultat ne serait pas de type Durée . D'ailleurs pour la fonction ChaîneVersDurée c'est écrit :

    <Résultat> = ChaîneVersDurée(<Chaîne> , <Format>)
    <Résultat> : Variable de type Durée
    Durée au format reconnu par les variables de type Durée.

    Ami calmant, J.P

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    hello,
    Le résultat ne serait pas de type Durée .
    Etrange, je ne connais pas le type renvoyé par ChronoFin(), mais en tout cas une conversion implicite vers une variable de type Durée fonctionne.
    Parfois, le W-Langage, c'est vraiment les mystères de l'ouest.
    Bref, je vais continuer à utiliser une variable intermédiaire

    Merci pour votre aide.

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 069
    Points : 9 510
    Points
    9 510
    Par défaut
    En effet même en utilisant ChaîneVersDurée il y a la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trace("Durée totale :", ChaîneVersDurée("2000",duréeMillième).EnSecondes, "seconde(s)")
    donne aussi le message suivant : opérateur '.' interdit

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    En effet même en utilisant ChaîneVersDurée il y a la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Trace("Durée totale :", ChaîneVersDurée("2000",duréeMillième).EnSecondes, "seconde(s)")
    donne aussi le message suivant : opérateur '.' interdit
    Exact, bien vu !

    En fait, cela rejoint un problème récurrent dans Windev : lorsque une fonction renvoie un type "complexe" (comme un objet), on ne peut pas toujours travailler directement dessus (via l'opérateur '.') et on est obligé de passer par une variable temporaire.
    C'est assez pénible car cela empêche de chaîner les appels et cela multiplie les variables temporaires inutiles.

    Ce n'est (malheureusement) pas spécifique aux fonctions qui retournent une durée
    C'est aussi le cas (par exemple) pour les fonctions qui manipulent des tableaux...

    Mais si quelqu'un a une solution de contournement, je suis preneur !

    Merci

  7. #7
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 857
    Points : 5 402
    Points
    5 402
    Billets dans le blog
    1
    Par défaut
    ChronoFin et ChronoValeur renvoient bien une durée.
    Une solution tordue, (je les aime bien celles là) serait de te créer une collection de fonctions qui surchargerait ces deux fonctions.
    Déclaration de la collection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    EUnité est une Enumération
    	chMilliseconde
    	chSeconde
    	chMinute
    	chHeure
    	chJour
    FIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FONCTION ChronoFin(nNoChrono est entier=0,eUnité est EUnité=chMilliseconde):réel
    duRes est une Durée
     
    duRes=WL.ChronoFin(nNoChrono)
     
    RENVOYER Convertir(duRes,eUnité)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    FONCTION ChronoValeur(nNoChrono est entier=0,eUnité est EUnité=chMilliseconde):réel
    duRes est une Durée
     
    duRes=WL.ChronoValeur(nNoChrono)
     
    RENVOYER Convertir(duRes,eUnité)
    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
     
    FONCTION PRIVÉE Convertir(duRes,eUnité) :réel
     
    SELON eUnité
    	CAS chMilliseconde
    		RENVOYER duRes
    	CAS chSeconde
    		RENVOYER duRes..EnSecondes
    	CAS chMinute
    		RENVOYER duRes..EnMinutes
    	CAS chHeure
    		RENVOYER duRes..EnHeures
    	CAS chJour
    		RENVOYER duRes..EnJours	
    FIN
    Attention La valeur renvoyée n'est plus une durée mais un réel

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 122
    Points : 9 547
    Points
    9 547
    Par défaut
    De manière plus générale, j'ai une question.
    J'ai une fonction , qui renvoie une durée , ou une date, ou une structure un peu plus complexe qu'un entier ou une chaine.
    A partir d'une duree D, on peut faire D.ensecondes.
    A partir d'une date A, on peut faire A.année par exemple.
    Jusque là, ok.

    Mais on peut faire f(x).Année, ou plus généralement f(x).Propriété ??? Il y a des cas où ça marche ?

    Je crois que je n'avais jamais imaginé utiliser l'opérateur <.> directement sur le résultat d'une fonction. Peut-être en utilisant des indirections ?

    Dailleurs, dans l'éditeur de Windev, si je tape D..année, l'éditeur reconnait le mot, et met un A majuscule et une police noire, si je tape f(x)..annee, il refuse (souligné rouge), et si je tape f(x).année, il laisse passer au bénéfice du doute, il laisse le mot année en vert , et plante à l'exécution. Le fait qu'il laisse année sans A majuscule m'annonce plus ou moins que ça va planter.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 122
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par Voroltinquo Voir le message
    ChronoFin et ChronoValeur renvoient bien une durée.
    Une solution tordue, (je les aime bien celles là) serait de te créer une collection de fonctions qui surchargerait ces deux fonctions.
    Merci, bel effort Effectivement ça marcherait ... mais uniquement dans ce cas précis. Or le problème est malheureusement plus général et si je commence à surcharger toutes les fonctions qui renvoient des structures sur lesquelles je veux utiliser l'opérateur ".", ça va être l'enfer


    Citation Envoyé par tbc92
    Mais on peut faire f(x).Année, ou plus généralement f(x).Propriété ??? Il y a des cas où ça marche ?
    Tu as bien résumé le problème... Non, je ne sais pas dans quels cas cela marche, j'en viens à utiliser systématiquement des variables temporaires.
    Ça n'a l'air de rien mais c'est de plus en plus problématique, surtout avec le (timide) virage pris par Windev afin d'autoriser une approche fonctionnelle (avec l'utilisation des expressions lambda).
    La possibilité de chaîner les appels via l'opérateur "." manque cruellement

    On en revient toujours au problème du support de "l'objet" dans Windev, qui a été ajouté sur le tard, au forceps, sur un langage qui demeure fondamentalement un langage purement procédural.

  10. #10
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 857
    Points : 5 402
    Points
    5 402
    Billets dans le blog
    1
    Par défaut
    Le fait que les propriété soient accessible via "." est récent (V26). C'est une modification syntaxiue plutôt que fonctionnelle. Dans ce cas, il faut lire ".." au lieu de "." et ".." ne permet d'accéder qu'aux propriétés
    d'un champ, d'une fenêtre, d'un état, d'un fichier, d'une rubrique, d'une variable
    (cf doc) Les fonctions (intégrées ou créées) ne rentrent pas dans ce cas de figure.

Discussions similaires

  1. [WD20] Problème de syntaxe : Vba --> Windev
    Par sebinator dans le forum WinDev
    Réponses: 4
    Dernier message: 15/06/2015, 23h59
  2. Syntaxe requete
    Par Chipolata dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/03/2003, 14h22
  3. [Syntaxe] Action simultanée sur plusieurs élements
    Par FranT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 20h20
  4. Syntaxe TASM <-> MASM
    Par LFC dans le forum Assembleur
    Réponses: 3
    Dernier message: 28/02/2003, 15h56
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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