none
Comment lancer ContainsFocus sur un élément du ControlBox/SystemMenu d'un form ? RRS feed

  • Question

  • Bonjour,

    j'aimerais savoir s'il était possible d'utiliser ContainsFocus sur les bouton "réduire","agrandir" et surtout "fermer" d'un form.

    J'ai un champs code dans mon form qui est obligatoire et qui affiche un message "champs obligatoire" dans le Validated de ce champs si rien n'est saisi. J'annule déjà l'evenement lorsque Me.ContainsFocus=False ou sur d'autres fonctions accessibles sans taper le code, par contre j'ai quand même le message lorsque je ferme la fenêtre. J'ai tenté de rajouter du code dans le FormClosing mais il ne s'éxécute qu'après mon text_Validated du coup à part le ContainsFocus sur la croix fermer de la form, je ne vois pas comment faire.

    Si vous avez une solution, merci d'avance.

     


    • Modifié YanT mardi 22 novembre 2011 11:24
    mardi 22 novembre 2011 10:35

Réponses

  • donnerait l'occasion à l'utilisateur de saisir tous les champs pour finalement avoir le message "enregistrement existant" 


    Yan, suite...

    Ah ça y est totalement cette fois, je comprends ce que tu veux faire, mais peut être faut-il s'y pendre de façon différente de telle sorte que la clef soit saisie et validée, puis si ça n'existe pas et si elle est conforme ça ouvre le reste :

    Demande de la clef  + vérif d'existance + vérif de conformité + (message de refus //ou// suite (image 2)).

     

     

    Si OK, zone et bouton enabled = false pour inbterdire une modif, puis on déploie la form (bel effet)...

     

     

    Si on annule = état antérieur image 1 (annuler), sinon on valide le reste en fin...

     

    Tu en penses quoi ?

     

    Cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe mercredi 23 novembre 2011 15:17
    • Marqué comme réponse Ciprian Duduiala lundi 28 novembre 2011 07:10
    mercredi 23 novembre 2011 15:17

Toutes les réponses

  • Bonjour YanT,

    Je suis incertain d'avoir tout compris...

    Tu voudrais faire quoi au juste comme action quand il se passe quoi ?

    Cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mardi 22 novembre 2011 14:35
  • J'ai un form de saisie avec un champ textbox qui est le code (PK) de l'enregistrement puis plusieurs champs textbox et en dessous des boutons enregistrer, supprimer, liste, précedent, suivant.

    Sur l'evenement validated du textbox code, je lis dans une base de donnée si le code existe pour afficher les données de l'enregistrement du champs.

    Lors du chargement du form, le focus est mis directement sur le champ code pour que l'utilisateur le saisisse. S'il ne saisit rien dans ce champs l'evenement validated affiche un msgbox "Code obligatoire"

    Seulement il faudrait que ce msgbox ne s'affiche que dans le cas ou l'utilisateur ne saisit pas de code et essaye d’accéder à un autres champs, au bouton enregistrer ou au bouton supprimer. Dans les autres cas (boutons précedent / suivant / liste / fermeture du programme), ne pas afficher le message.

    Pour se faire j'ai mis au début de l'evenement validated du textbox code :

    if btunListe.ContainsFocus OrElse _ 
    btunPrec.ContainsFocus OrElse  _
    btunSuivant.ContainsFocus _ 
    Then Exit Sub
    


    Avec ce code, j'obtiens le résultat voulu pour les boutons liste / précédent / suivant. Par contre je n'arrive pas à gérer la fermeture de la fenêtre via le bouton X.

    ps : j'ai également testé d'autres méthodes mais il semblerait que les contrôles qui ont le focus ne le perdent pas lorsque la fermeture du form se fait

     

     

     

    mardi 22 novembre 2011 15:18
  • Suite,

    Si j'ai compris, le message de saisie obligatoire, tu veux que dans certains cas seulement il s'affiche, alors on peut par exemple faire une variable boolean globale :

     

    dim affiche as boolean = false
    


    Et dans chaque procédure où il y a besoin, on va indiquer à cette variable s'il faut ou pas (si besoin) affichier le fameux message avec

     

    True ou False
    

     

    Et in fine, devant ton fameux msgbox tu mets :

     

    If affiche = True Then MsgBox("ton message")
    

     

    Est-ce que cette manipulation permet de résoudre ton problème ?

    Au plaisir, cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mardi 22 novembre 2011 15:44
  • Merci EhJoe mais je ne pense pas que ça résolve mon problème.

    Le msgBox est appelé dans le validated de mon textbox "code" et c'est à ce moment là je dois savoir si j'affiche ou non ce message suivant l'action suivante de l'utilisateur.

    Ta méthode avec le booleen marcherait dans le cas ou le form_closing s'éxécuterait avant mon validated au moment ou je clique sur la croix mais ce n'est pas le cas.

     

    mardi 22 novembre 2011 17:17
  • Suite,

    Ah.... je crois que j'ai compris, tu utilises :

     

    Sub TextBox1_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Validated
        MsgBox("validé")
    End Sub
    
    

    C'est la première fois de ma vie que je vois quelqu'un qui utilise cette procédure, mais il y a un début à tout...

     

    C'est spécial comme procédure évènementielle, si le texte a eu le focus ça réagit sur un <Tab> depuis l'objet ou la prise de focus d'un autre objet ou de la form (closing pour toi en l'espèce)...

    Ah ben... et pourquoi tu ne fais pas une saisie classique, c'est-à-dire qu'on saisit tout, puis qu'on valide en fin, ou dans la procédure du bouton de validation ou effectue l'ensemble des tests et des renvois aux objets si besoin, pourquoi tu ne fais pas ça ?

    Dans ton cas je ne vois pas, sauf à faire une form sans bandeau et à fermer par ton propre bouton.

    Ce type de procédure exeptionnelle permet d'attirer l'attention sur une opération obligatoire qui n'aurait pas été effectué (à condition d'avoir néanmoins été dans l'objet, je présume en forçant le focus), alors tu l'utilises dans ce but e signalement, tout en ne voulant pas qu'elle fasse son travail selon les cas, c'est difficile.

    En théorie il faudrait attraper l'évènement avant exécution, l'empiler, attendre une seconde, puis si la form se ferme, supprimer l'évènement, et passer à la fermeture, sinon, dépiler l'évènement de signalement piour l'exécuter, puis dépiler la fermeture de la form.

    Peut être qu'il est possible d'accéder aux évènements par des fonctions spécifiques, mais je ne connais pas, et je ne sais même pas si c'est réalisable... Il faudrait ici pouvoir intercepter les évènements avant qu'ils ne se produisent, puis les gérer selon les besoin, hum...

    Cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire

    • Modifié EhJoe mardi 22 novembre 2011 22:30 un rajout
    mardi 22 novembre 2011 19:54
  • Oui c'est bien ça.

    Le code n'étant pas un auto_increment, une "saisie normale" donnerait l'occasion à l'utilisateur de saisir tous les champs pour finalement avoir le message "enregistrement existant" en fin de saisie. La fiche doit donc être rappelée dès la saisie du code et comme c'est bien souvent le cas l'utilisateur ne valide pas le champs avec "enter", les événements validating & validated me semblaient adaptés (pour ne pas avoir à revérifier partout ailleurs dans le code la bonne saisie du code).

    Cacher la barre systeme et gérer soit même la fermeture semble être une astuce qui pourrait fonctionner pour contourner le problème vu que le containfocus a un comportement normal sur tous les contrôles génériques.

    Seulement mon form faisant partie d'un mdiParent, cela risque difficile de faire un faux bandeau de fermeture dont l'utilisateur ne se rendrait pas compte.

    Merci en tout cas pour votre aide, je vais voir comment je peux gerer une file d'attente sur l'evenement validated

     

    mercredi 23 novembre 2011 14:13
  • Bonsoir Yan,

     

    Tu sais, comme ça, ça me dit quelque chose vaguement la captation des évènements, il existe peut être des mécanismes, faudrait tomber sur quelqu'un de très bon en vbNet ou C#, y en a ici, peut être en posant la question "Comment intercepter un évènement ?"...

     

    Bon courage, cordialement.

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    mercredi 23 novembre 2011 14:54
  • donnerait l'occasion à l'utilisateur de saisir tous les champs pour finalement avoir le message "enregistrement existant" 


    Yan, suite...

    Ah ça y est totalement cette fois, je comprends ce que tu veux faire, mais peut être faut-il s'y pendre de façon différente de telle sorte que la clef soit saisie et validée, puis si ça n'existe pas et si elle est conforme ça ouvre le reste :

    Demande de la clef  + vérif d'existance + vérif de conformité + (message de refus //ou// suite (image 2)).

     

     

    Si OK, zone et bouton enabled = false pour inbterdire une modif, puis on déploie la form (bel effet)...

     

     

    Si on annule = état antérieur image 1 (annuler), sinon on valide le reste en fin...

     

    Tu en penses quoi ?

     

    Cordialement :o)

     



    Joseph Attila PUSZTAY
    EhJoe       Logiciels       Romans       Ecrire
    • Proposé comme réponse EhJoe mercredi 23 novembre 2011 15:17
    • Marqué comme réponse Ciprian Duduiala lundi 28 novembre 2011 07:10
    mercredi 23 novembre 2011 15:17
  • Bonjour, YanT,

     

    Est-ce que la solution d’EhJoe réponde à vos besoins ? Merci de tenir la communauté informée sur la suite de vos démarches.

     

    Cordialement,

     

    Cipri


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    Ciprian DUDUIALA, MSFT  
    •Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.

    jeudi 24 novembre 2011 14:52
  • En effet, c'est une solution, merci EhJoe.

    Je vais tout de même voir ce dont tu parlais avant sur la captation des evenements sinon j'utiliserai cette solution.

     

    Merci encore

     

    lundi 28 novembre 2011 08:43