Как да задействам KeyPreview Event, когато формата има TActionMainMenuBar

Когато задам свойството KeyPreview = TRUE на моя основен формуляр (MDI родител), събитията OnKeyDown, OnKeyUp или OnKeyPress не се задействат. Когато натискам клавиши, мога да навигирам в главното меню (TActionMenuBar). Изглежда лентата с менюта контролира ключовите събития.

Как мога да задействам събитие, когато потребителят натиска клавиш (напр. клавиша VK_RETURN)?

Използвам Delphi 2009


person markus_ja    schedule 23.02.2010    source източник
comment
Това няма да е лесно, защото менютата работят в собствен цикъл на съобщения и формулярът ви е блокиран, докато менюто не бъде затворено. Какво точно се опитваш да направиш? Когато потребителят натисне VK_RETURN, се избира елемент от менюто, менюто се затваря и можете да управлявате OnClick на елемента от менюто или събитието OnExecute на свързаното действие.   -  person Ondrej Kelle    schedule 23.02.2010
comment
Когато натисна клавиша VK_Return, искам да отворя дъщерен формуляр. За бърз достъп (вместо да натискам бутон в лентата с инструменти).   -  person markus_ja    schedule 23.02.2010
comment
Когато натиснете VK_RETURN на конкретен елемент от менюто, предполагам? В такъв случай трябва да използвате събитието OnClick на елемента от менюто. Или, ако вашият елемент от менюто е свързан с действие, използвайте събитието OnExecute на действието. Кодът се изпълнява при избор на елемент от менюто, независимо дали с мишка или клавиатура.   -  person Ondrej Kelle    schedule 23.02.2010
comment
Когато натисна клавиша VK_RETURN, не искам да взаимодействам с менюто. Когато няма отворен дъщерен елемент в главния формуляр на MDI, натискането на клавиша VK_RETURN трябва просто да отвори моя дъщерен прозорец.   -  person markus_ja    schedule 23.02.2010
comment
Проблемът е, че когато менюто е активно, трябва да взаимодействате с него. (По-точно, не можете да взаимодействате с нищо друго в приложението си.)   -  person Ondrej Kelle    schedule 23.02.2010


Отговори (1)


От коментарите виждам, че искате да извършите определено действие (напр. отваряне на формуляр), когато се натисне определен клавиш.

За целта можете да зададете своя клавиш за бърз достъп на TAction и да напишете подходящия код в TAction.OnExecute

стъпки:

  1. Пуснете TActionManager (или TActionList)
  2. Кликнете два пъти върху него (появява се редакторът на TActionManager). Натиснете бутона "Ново действие".
  3. Задайте свойството ShortCut на желаната стойност.
  4. Напишете съответния код в OnExecute събитие.

Обърнете внимание, че на стъпка 3. (може би) вие (и най-вероятно вашите потребители) ще имате проблеми с присвояването на клавиша Enter на нещо толкова необичайно като отваряне на формуляр. „Enter“ има много дефинирано значение в Windows.

Бих предложил да зададете функционален клавиш (обикновено F2-F9) и/или Ctrl+[първата буква от името на вашия формуляр]

HTH

person John Thomas    schedule 23.02.2010
comment
Възможно ли е да зададете клавиша ENTER като пряк път? Не мога да го видя в списъка TAction.ShortCut. FYI: В нашето приложение ние използваме много клавиша ENTER. - person markus_ja; 23.02.2010
comment
да Просто го напиши. :-) Отидете до свойството Shortcut и въведете 'Enter' (без кавичките). Натиснете [Enter] (клавиша). За да го тествате, отидете на OnExecute събитие и напишете тестов код като ShowMessage('Boo!'); или подобен. Ще видите как този код се изпълнява. Причината, поради която 'Enter' не е включен в този списък е, че, както казах, използването му не се препоръчва за персонализирани действия. Това не е (не)за съжаление мой избор или избор на Delphi, а конвенция на Windows. Но ако е подходящо за вашето приложение, продължете, дори ако понякога Windows ще го закачи. Тествай и ако работи... - person John Thomas; 23.02.2010
comment
хм ... Не мога да задам клавиша ENTER в свойството ShortCut в D2009. Получавам грешката Inalid Property Value. Но работи ли в D7? - person markus_ja; 24.02.2010
comment
Не знам за D7 Просто въвеждането на Enter в D2010 работи. И imho трябва да работи и в D2009 TextToShortCut (основният двигател за това) е доста стара функция на Delphi. Опитайте да въведете например A+Ctrl вътре в свойството ShortCut. Работи? (IDE трябва да го приеме и да го промени на Ctrl+A) - person John Thomas; 24.02.2010