2008-10-13 8 views
2

Mon entreprise a une grande application écrite en VB6, et pour des raisons historiques, l'application est naviguée avec la touche Entrée au lieu de la touche Tab. Je ne connais pas VB6, mais je sais qu'ils définissent actuellement le focus pour chaque contrôle dans une grande instruction select dans l'événement KeyUp du formulaire s'il s'agit d'une clé EnterKey. Maintenant, nous commençons à convertir en .NET, et nous devons garder les choses cohérentes pour que les utilisateurs n'aient pas besoin de TAB sur certains formulaires et d'ENTRER sur d'autres. Je veux écrire des formes d'ancêtre qui entreront automatiquement d'un champ à l'autre au lieu de tabuler. Un collègue m'a dit que la façon dont cela se fait dans VB6 est de traiter les boutons non pas sur l'événement CLICK mais sur l'événement KEYUP. Je dois continuer à le faire afin que je n'aie plus d'événements KeyUp restants à renvoyer à VB6 une fois mon formulaire terminé. L'ordre des événements pour les boutons estComment naviguer entre les champs avec la touche Entrée

  1. button_PreviewKeyDown
  2. Button_Click (remplaçant apparemment l'événement KeyPress)
  3. form_KeyUp
  4. button_KeyUp

J'ai créé des formes comme suit:

  • Dans l'événement KeyUp du formulaire ANCESTOR, c diable pour voir si c'est une clé d'entrée. S'il s'agit d'une touche d'entrée et que le contrôle actif n'est pas un bouton, il passe au champ suivant dans l'ordre des onglets. Sinon, il ignore la clé et laisse le contrôle la gérer. Si c'est un bouton, l'ancêtre ne présume pas de savoir où le bouton veut aller, parce que cela dépendra de ce que le bouton veut faire quand il est "cliqué".
  • Sur les boutons du formulaire CHILD, l'événement click ne fait rien et le traitement est dupliqué dans les événements KeyUp et MouseClick.
  • La forme ANCESTOR a une valeur booléenne protégée, EatKeyUp, qui peut être définie sur True par l'ENFANT. Cela est utilisé lorsque le formulaire enfant doit envoyer un MessageBox, car si l'utilisateur entre via le bouton OK sur le MessageBox, il reste un événement KeyUp restant qui sera consommé par le formulaire ancêtre.

Bien que klugey, cela semble effectivement fonctionner. Ce que je veux savoir, c'est s'il y a un meilleur moyen? Peut-être un réglage quelque part que je peux dire à mon application "Entrez par des formes au lieu de tabulation"? Est-ce que les événements que j'utilise à la place des événements click sont les meilleurs?

Répondre

1

Une meilleure implémentation consiste à utiliser la propriété AcceptButton du formulaire, placez-la sur un bouton caché quelque part dans le formulaire. Ensuite, lorsque l'utilisateur appuie sur la touche, le bouton est cliqué, puis dans l'événement de clic sur le bouton, vous faites le code pour passer au contrôle suivant. Pour sélectionner le contrôle suivant, vous pouvez simplement sélectionner dans la liste des éléments.

La manière la plus simple de le faire est de créer un formulaire de base, puis de le faire avec le bouton et la logique AcceptButton.

+1

Je n'ai pas essayé cela parce que je ne suis plus à ce travail (hourra!). Mais cela semble raisonnable - merci! – CindyH

2

Peut-être maintenant que vous convertissez son temps pour pousser l'idée d'adhérer aux normes Windows.

En réponse directe à votre question, le mécanisme ci-dessus est un moyen assez courant de le faire, une autre façon de le faire est de définir la propriété d'aperçu clé du formulaire et de le gérer directement dans le formulaire. Aucune solution n'est particulièrement bonne car la navigation dans les fenêtres n'est simplement pas faite de cette façon,

+0

Je suis conscient que la navigation dans les fenêtres n'est pas censée être faite de cette façon. BOY suis-je conscient. Mais nous ne pouvons pas avoir un écran parmi des centaines navigué avec des onglets et le reste navigué avec entre.Il ne serait pas judicieux de convertir tous les autres en onglets puis de revenir en arrière et de convertir en .NET. – CindyH

Questions connexes