Как я могу предотвратить захват основной формы клавишами TMemo в другой немодальной форме? - PullRequest
0 голосов
/ 21 апреля 2010

У меня есть приложение, которое открывает немодальную форму из основной формы. Немодальная форма имеет TMemo. Главное меню формы использует «пробел» в качестве одного из символов ускорителя.

Когда немодальная форма открыта и заметка находится в фокусе, каждый раз, когда я пытаюсь ввести пробел в заметку на немодальной форме, происходит главное событие формы для ярлыка «пробел»!

Я попытался включить MainForm.KeyPreview: = false, когда другая форма открыта, но без кубиков.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 06 мая 2014

Это может быть старая тема, но у меня была такая же проблема минуту назад и я искал подходящее решение. Ваша тема возникла, но не найдено решение, которое я хотел бы использовать.

Моя проблема заключалась в том, что у меня есть основная форма с множеством ярлыков (Backspace, Delete и т. Д.) И вторая форма с полем для редактирования. Поле ввода не получило никаких ключевых действий, которые обрабатываются ярлыками основной формы.

Мое решение: Установите дочерние формы OnShortCut, которые будут перехватывать ярлыки, прежде чем они будут интерпретированы основной формой с помощью:

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

Это помогло мне, дочерняя форма ловит ярлыки и обрабатывает их как общие ключевые сообщения. Поле редактирования можно использовать по назначению.

1 голос
/ 21 апреля 2010

Отключите пункт меню в главной форме, когда заметка находится в фокусе, и включите его снова, когда заметка потеряет его.Вы можете сделать это из событий TMemo.OnEnter и 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;

Использование Application.MainForm и typecast предназначены для предотвращения жесткого кодирования имени переменной формы в дочерней форме.1007 *

...