2010-04-21 21 views
0

J'ai une application qui ouvre un formulaire non-modal à partir du formulaire principal. La forme non-modale a un TMemo dessus. Le menu principal du formulaire utilise "espace" comme l'un de ses caractères d'accélérateur.Delphi - Comment empêcher le formulaire principal de capturer des frappes dans un TMemo sur un autre formulaire non-modal?

Lorsque le formulaire non-modal est ouvert et que le mémo est actif, chaque fois que j'essaie d'entrer un espace dans le mémo sur la forme non-modale, l'événement de forme principal du raccourci "espace" se déclenche!

J'ai essayé d'activer MainForm.KeyPreview: = false alors que l'autre formulaire est ouvert mais pas de dés.

Des idées?

TIA

+0

Je pense que le même sujet est ici: http://stackoverflow.com/questions/1104380/tmenuitem-shortcuts-overwrite-shortcuts-from-controls-tmemo – SimaWB

Répondre

1

Désactiver l'option de menu sur le formulaire principal alors que le mémo a mise au point, et réactiver lorsque le mémo perd. Vous pouvez le faire à partir des événements TMemo.OnEnter et TMemo.OnExit.

procedure TOtherForm.Memo1Enter(Sender: TObject); 
begin 
    if Application.MainForm is TYourMainForm then 
    TYourMainForm(Application.MainForm).MenuItemWithSpace. Enabled := False; 
end; 

procedure TOtherForm.Memo1Exit(Sender: TObject); 
begin 
    if Application.MainForm is TYourMainForm then 
    TYourMainForm(Application.MainForm).MenuItemWithSpace. Enabled := True; 
end; 

L'utilisation de Application.MainForm et transtypage doivent éviter de coder en dur dans une Nae forme variable sous la forme de l'enfant.

+1

Je n'aime pas que votre demande TOtherForm de contrôler TYourMainForm . Cela ressemble à un couplage serré. Le problème est dans les événements clés quelque part. – Preston

+0

Je suis d'accord, c'est un peu inélégant, mais je viens de mettre: MyMainForm.MenuEntry1.Enabled: = false; dans l'événement OnShow et MainForm.MenuEntry1.Enabled: = true; dans l'événement OnClose. Semble fonctionner un régal. – rossmcm

+0

@Preston: Moi non plus. Le problème, cependant, est que l'OP veut utiliser un formulaire non-modal et désactiver un raccourci seulement quand un * contrôle * spécifique sur cette forme non-modale est actif. La forme non-modale est le seul endroit pour le faire, sauf si vous désactivez le raccourci pour toute la période où le formulaire enfant existe (ce que le PO a dit n'était pas souhaité). –

2

Cela peut être un sujet ancien, mais j'ai eu le même problème il y a un moment et j'ai cherché une solution appropriée. Votre sujet est venu mais pas avec une solution que je voudrais utiliser.

Mon problème était: J'ai un formulaire principal avec beaucoup de raccourcis (Backspace, Delete, etc) et un second formulaire avec une zone d'édition. La zone d'édition n'a reçu aucune action clé, qui est gérée par les raccourcis du formulaire principal.

Ma solution: Définissez les formulaires enfants OnShortCut, Wich va attraper les raccourcis avant qu'ils ne soient interprétés par la forme principale avec:

procedure ChildForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean); 
begin 
    Handled := True; 
    Self.DefaultHandler(Msg); 
end; 

qui a fait l'affaire pour moi, la forme de l'enfant attrape les raccourcis et les poignées les comme des messages clés communs. La zone d'édition peut être utilisée comme prévu.

+0

Il convient d'ajouter que je n'ai pas besoin de raccourcis dans le formulaire enfant. Cette solution peut donc ne pas fonctionner comme prévu pour les fenêtres enfants avec leurs propres raccourcis. – Hugie