2009-12-11 1 views
3

Я разрабатываю Word addin, и как-то ярлыки, определенные в TAction.ShortCut, всегда срабатывают более одного раза, и это сложно для меня и трудно решить, поэтому я прибегаю к событию TForm.OnKeyDown и очищает все TAction .ShortCut, этот подход работает хорошо, за исключением того, что ярлыки не отображаются в соответствующих пунктах меню, но я хочу, чтобы они отображались в этих пунктах меню.

Как отключить TAction.Shortcut или TMenuItem.Shortcut?

Так что я придумал эту идею: Установите значения для TMenuItem.Shortcut так, что программа может показать контекстную подсказку к конечному пользователю, и не позволяет VCL обрабатывать эти ярлыки, вместо этого, обрабатывать их в TForm. OnKeyDown. Поэтому мой вопрос заключается в том, как отключить TAction.Shortcut или TMenuItem.Shortcut? Заранее спасибо.

ответ

1

Для начала у вас есть Enabled недвижимость на обоих TAction и TMenuItem. Просто установите его на False.

Далее одна из возможных причин срабатывания вашего события более одного раза заключается в том, что вы можете использовать Application.ProcessMessages; или, по крайней мере, плохо написанный компонент, который вы используете, делает это. Следует быть очень осторожным в использовании этой функции Delphi, поскольку она может вызвать код «повторного входа» (непреднамеренная рекурсия).

+0

Привет, Крэйг, спасибо. Поскольку я разрабатываю Word addin на основе сложной структуры, поэтому мне трудно найти источник проблемы и почему я скомпрометирован. –

+0

Привет Эдвину, у нас возникла аналогичная проблема; и также выбрал один и тот же способ обхода. Мы знаем, что наша проблема связана с пакетом сторонних компонентов, который вызывает «Application.ProcessMessages». Этот конкретный набор компонентов вообще плохо написан (т. Е. Это не единственная проблема); поэтому мы решили поэтапно завершить набор компонентов из наших систем. (Вероятно, мы оставим «обходной путь» в plaec, потому что на самом деле не должно быть возможности запускать пользовательский интерфейс, пока тот же самый занят обработкой. - Независимо от причины!) –

+0

Привет, Крэйг, еще раз спасибо! Наконец я обнаружил, что это (нежелательные вызовы Application.ProcessMessages) именно то, что вызвало проблему! –

0

Основная причина вашей проблемы - это события, которые запускаются более одного раза. Вы могли бы попытаться решить эту проблему, но я бы предложил:

  • Место контрольной точки в вашем обработчике событий.
  • Скопируйте содержимое стека вызовов [CTRL+ALT+S] в любой редактор, который вам нравится каждый раз, когда вы нажимаете точку останова.
  • Начните мозговой штурм относительно того, почему вызовы ведут к удару события несколько раз.
  • Исправьте свой код, если это ваш код для исправления.
+0

Привет, Ливен, спасибо. Вы правы, но поскольку я основываю свое развитие на очень сложной структуре разработки приложений Office, для меня слишком сложно решить эту причину, поэтому я скомпрометировал.
Возможно, использование пользовательского рисования элементов меню будет работать, у кого-нибудь есть образец кода?Я имею в виду отображение текста меню и подсказки с правой стороны. –

0

Хакерский способ (обычно не рекомендуется): блок копирования, который содержит TAction в отдельной папке, изменяет источник TAction, который делает метод ShortCut ничего не делать. Поместите эту папку в путь поиска как первый элемент. перестройте свое приложение.

Я использую эту технику для исправления ошибок в VCL, но после установки исправлений Delphi вы не должны забывать обновлять «взломанную» версию модифицированных модулей.

+0

Спасибо. Я посмотрел на источник, но не смог найти, где изменить источник ... –

+1

Это абсолютно неправильно. Вы должны * никогда * не изменять источник VCL, потому что вы можете вызвать обрывы в других вещах, о которых вы не знаете. Почти в 100% случаев, есть лучшие способы делать вещи. –

+1

Кен, похоже, вы не внимательно прочитали мой ответ. Я пишу, что это путь HACKER и НЕ РЕКОМЕНДУЕТСЯ, но в некоторых критических ситуациях это единственный способ решить проблему. В качестве превосходного примера - исправления, которые Andreas Hausladen (http://andy.jgknet.de/) сделал для библиотеки Delphi IDE и VCL. VCL написана людьми не богом :) – kuaw26

Смежные вопросы