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

  1. #1
    Membre éprouvé
    ExécuteTraitement ne réagit pas à l'initialisation de la fenêtre
    Bonsoir
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        // PARAMETRE DE LA REQUETE : 2 DERNIERS CARACTERES DE L'ANNEE EN COURS
        REQ_HFRE.NUMERO_FAC_INI=Milieu(DateSys(),3,2)
        HExécuteRequête(REQ_HFRE, hModifieFichier)
        // LA TABLE SE POSITIONNE SUR LA DERNIERE FACTURE DE CETTE ANNEE
        TableAffiche(TABLE_HFRE,taCourantPremier)
        // CE CODE NE FONCTIONNE PAS
        ExécuteTraitement(TABLE_HFRE,trtSélection)
        // NI CE CODE NE FONCTIONNE PAS POUR EXECUTER LA VISUALISATION DE LA TABLE DETAILS
        ExécuteTraitement(TABLE_HFRE,trtClic)
        // SI JE CLIQUE AVEC LA SOURIS CELA FONCTIONNE

  2. #2
    Membre chevronné
    Bonjour,
    Pourquoi ne pas appeler directement la procédure qui se trouve dans la partie Sélection d'une ligne ?
    Il y a peut être plus simple, mais ça tourne

  3. #3
    Membre habitué
    Bonsoir,

    Il manque quelques informations pour pouvoir aider.

    - La fenêtre est-elle une fenêtre interne ou une fenêtre classique ?
    - A quel endroit est déposé le code ci-dessus ?
    - Les champs de la fenêtre sont-ils initialisés au moment où ce code s'exécute ?

  4. #4
    Rédacteur/Modérateur

    Quand tu cliques avec la souris, ça pointe une des lignes de la table, et ce n° de ligne est utilisable par ta procédure.
    Ce n'est pas le cas dans les autres essais que tu fais.

    Par ailleurs 'Ca ne fonctionne pas', c'est ambigu : la procédure ne se lance pas du tout ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Membre expert
    Bonjour,

    D'après le titre de la discussion, le code mis est celui présent dans l'init de la fenêtre.
    Si je ne m'abuse, l'init de la fenêtre se fait avant celle des champs donc l'appel au traitement de la ligne ne fonctionne pas car à ce moment la table est vide, non ?

  6. #6
    Membre éprouvé
    Merci pour tous les conseils.
    Tous m'ont été utiles.
    Le problème venait d'une procédure appelée par :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    TimerSys(Rafraichir, gnTempo2, 2)

    Au lieu de TableAffiche(TABLE_HFRE, taCourantBandeau)
    j'avais mis :
    TableAffiche(TABLE_HFRE, taCourantEnreg)
    La temporisation était tellement courte que le curseur n'avait pas le temps de sélectionner la ligne de la table.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PROCEDURE Rafraichir()
     
    // Pour détection automatique des modifications faîtes sur les autres postes.
    FinTimerSys(2)
    SI gnVersionFichier <> HVersion(HFRE) ALORS
        // Modification faîte sur un autre poste
        gnVersionFichier = HVersion(HFRE)
        SI Gauche(HFRE.NUMERO_FAC,2)<>"ZZ" ALORS
            TableAffiche(TABLE_HFRE, taCourantBandeau)
        FIN
    FIN
    TimerSys(Rafraichir, gnTempo2, 2)

  7. #7
    Membre éprouvé
    Citation Envoyé par Lo² Voir le message
    Bonjour,

    D'après le titre de la discussion, le code mis est celui présent dans l'init de la fenêtre.
    Si je ne m'abuse, l'init de la fenêtre se fait avant celle des champs donc l'appel au traitement de la ligne ne fonctionne pas car à ce moment la table est vide, non ?
    En regardant l'aide :
    https://doc.pcsoft.fr/?1010021
    J'ai remarqué que l'ordre d'exécution est diférent :
    L'ordre d'exécution des événements est le suivant :
    • Initialisation des champs de la fenêtre (*)
    • Initialisation de la fenêtre
    • Prise de focus

  8. #8
    Membre expert
    C'est l'ordre après l'initialisation de la fenêtre (fin d'initialisation), c'est à dire que les déclarations globales de la fenêtre a été faite (ce que j'appelle initialisation de la fenêtre).

    Je viens de faire un test dans une fenêtre avec des traces et j'ai comme résultat :
    déclarations globales de la fenêtre
    init des champs
    fin d'init de la fenêtre

  9. #9
    Membre habitué
    Un petit test rapide montre ceci :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Declarations globales
    Init  Saisie1
    Init  Bouton1
    Demande Mise à jour
    Fin Init


    Donc les champs sont initialisés entre "Declarations globales" et "Demande Mise à jour"

  10. #10
    Membre chevronné
    Bonjour,
    Une précision :

    Déclarations globales de la fenêtre
    Initialisation des modèles de champs
    Initialisation des champs
    Initialisation du modèle de la fenêtre
    Initialisation de la fenêtre
    et ce pour les version >5.5 avant, les champs étaient initialisés à la fin
    Il y a peut être plus simple, mais ça tourne

  11. #11
    Membre éprouvé
    Dans mon exemple le problême venait de l'emplacement du Timer:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Declarations globales FENETRE // LE TIMER ETAIT DECLENCHE ICI
    Initialisation TABLE_HFRE // AVANT L'INITIALISATION DE LA TABLE
    Initialisation COMBO_BUSCAR
    Prise de focus FENETRE
    FIN Initialisation TABLE_HFRE
    Initialisation FENETRE 
    FIN Initialisation TABLE_HFRE

    Merci pour tout.

  12. #12
    Membre chevronné
    Propos légèrement hors sujet, pourquoi faire tourner un timer plutôt que d'utiliser un trigger ?
    Il y a peut être plus simple, mais ça tourne

  13. #13
    Rédacteur/Modérateur

    Dans Déclarations-Globales de la fenêtre, il faut mettre les déclarations des variables globales, et normalement rien d'autre.
    Les traitements d'Init sont dans la section 'Initialisation de la fenêtre'.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  14. #14
    Membre éprouvé
    Pourtant c'est exactement ce que fait Pcsoft dans l'exemple WD qui bloque :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TitreEnCours(LibelleFichier("CLIENT"))
     
    // Timer permettant de signaler les demandes de libération de blocage envoyés d'autres utilisateurs
    TimerSys(MsgBlocage,500,1)
     
     
    // Pour rafraîchissement automatique
    GLOBAL
        nVersionFichier est un entier  
     
     
        nVersionFichier = HVersion(CLIENT)
        TimerSys(Rafraichir,50,2)

  15. #15
    Membre expert
    Citation Envoyé par tbc92 Voir le message
    Dans Déclarations-Globales de la fenêtre, il faut mettre les déclarations des variables globales, et normalement rien d'autre.
    Les traitements d'Init sont dans la section 'Initialisation de la fenêtre'.
    Bonjour tbc92,

    Ta remarque m'a trotté dans la tête tout le week-end mais j'ai eu la flemme d'ouvrir mon PC pour vérifier ^^

    Globalement, je suis d'accord avec toi mais ce qui m'a fait me poser des questions c'est cette section d'Initialisation de fenêtre.
    Ca fait un bout de temps que je bosse sur Windev et ça ne me disait rien.
    J'ai vérifié ce matin et je n'ai pas cette section sur mes fenêtres.

    Quand je regarde l'aide sur les événements associés à une fenêtre, ça parle d'un ordonnancement initialisation des champs, initialisation de la fenêtre, prise de focus.
    Est-ce que la section Fin d'initialisation correspond à l'initialisation pour toi ?

  16. #16
    Membre habitué
    Citation Envoyé par Lo² Voir le message
    ...Quand je regarde l'aide sur les événements associés à une fenêtre, ça parle d'un ordonnancement initialisation des champs, initialisation de la fenêtre, prise de focus.
    Est-ce que la section Fin d'initialisation correspond à l'initialisation pour toi ?
    Bonjour à tous,

    Je pense, moi aussi, que initialisation de la fenêtre, indiqué par l'aide et tbc92, correspond à l'évènement Fin d'initialisation de la fenêtre.

    L'initialisation de la fenêtre correspond en fait, et ça n'engage que moi, à tout ce qui se passe entre la première instruction de Declarations globales de la fenêtre jusqu'à la dernière instruction de Fin d'initialisation de la fenêtre.

    Dans les déclarations globales, je mets, bien évidemment les déclarations des variables globales à la fenêtre mais aussi, et ça n'engage là encore que moi ( @ tbc92), l'initialisation des éléments qui seront nécessaires aux champs contenus dans ma fenêtre.
    J'initialise, notamment, une classe de <présentation> quasiment systématiquement associée à ma fenêtre (Interne ou normale) qui se charge de diriger l'ensemble. Si cette classe a besoin d'autres éléments extérieurs, c'est aussi à cette étape que cela se passe.

    Je ne vois pas comment faire autrement. Je n'ai aucun autre "évènement" pouvant se substituer aux Declarations globales de la fenêtre avant que mes champs puissent être initialisés.

  17. #17
    Rédacteur/Modérateur

    Est-ce que la section Fin d'initialisation correspond à l'initialisation pour toi ?
    Effectivement, dans l'éditeur de code , cette section s'appelle fin d'initialisation. Initialisation, ou fin d'initialisation : on parle de la même chose. Désolé si je n'ai pas utilisé le mot précis.

    Je ne suis pas complètement d'accord avec PadBrain.
    Mon sentiment (je n'ai pas fait d'expérience pour vérifier, pas relu la doc non plus) :

    -1- Exécution de la section : Déclarations Globales de la fenêtre ; en particulier, si on a des paramètres dans l'appel de la fenêtre, on a besoin de commencer par cette section pour récupérer les paramètres.
    -2- Exécution des codes d'initialisation des champs
    -3- Exécution du code de fin d'initialisation de la fenêtre.

    En particulier, si la section 'Déclarations globales' et 'Fin d'initialisation' étaient exécutées dans la foulée l'une de l'autre, PCSoft n'aurait pas créé 2 sections séparées !

    Dans les faits, je mets très rarement du code dans la partie 'Initialisation des champs', et donc j'ai rarement l'occasion de tester si cette partie s'exécute avant ou après telle autre.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  18. #18
    Membre habitué
    Citation Envoyé par tbc92 Voir le message
    ...
    Je ne suis pas complètement d'accord avec PadBrain.
    Sur tout ou sur ça :


    En particulier, si la section 'Déclarations globales' et 'Fin d'initialisation' étaient exécutées dans la foulée l'une de l'autre, PCSoft n'aurait pas créé 2 sections séparées !
    Je suis d'accord avec ça. Je n'ai pas dis que Déclarations globales et Fin d'initialisation étaient exécutées dans la foulée mais que JE CONSIDÉRAIS que la partie initialisation de la fenêtre englobait les évènements allant de Déclarations globales à Fin d'initialisation

    ceci comprend ce qui suit avec entre le -2- et le -3- l'évènement -2.1-Demande de mise à jour IHM


    Mon sentiment (je n'ai pas fait d'expérience pour vérifier, pas relu la doc non plus) :

    -1- Exécution de la section : Déclarations Globales de la fenêtre ; en particulier, si on a des paramètres dans l'appel de la fenêtre, on a besoin de commencer par cette section pour récupérer les paramètres.
    -2- Exécution des codes d'initialisation des champs
    -3- Exécution du code de fin d'initialisation de la fenêtre.


    Dans les faits, je mets très rarement du code dans la partie 'Initialisation des champs', et donc j'ai rarement l'occasion de tester si cette partie s'exécute avant ou après telle autre.
    Mes champs s'occupent d'initialiser eux même leur contenu. Du coup, lorsque j'ai besoin que leur contenu se mette à jour, je fait un petit :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    monChamp.ExécuteTraitement(TrtInit)