Показать сообщение отдельно
  #5  
Старый 05.04.2020, 08:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Тебе же надо в Memo?
Попробуй так.
Сабклассим TMemo. У нашего класса отлавливаем сообщение нажатия и отпускания клавиш. Проверяем KeyboardState. Если Alt зажат, то сразу ставим, что сообщение мы обработали (что бы оно не шло дальше) и уже думаем - нужна нам нажатая комбинация или нет.
Т.е. сообщение нажатия клавиш (не событие, которое от VCL, а именно сообщение Windows) ловим прямо в компоненте, который его получает. Там идеология такая, что сначала компонент (окно) получает сообщение и смотрит, нужно ли ему на него реагировать, если не нужно то он дальше отдает ему окну приложения, а уж оно начинает разбираться по всему стеку оконных компонентов. Т.е. наша задача что бы если Alt зажат, то это все остановилось на копоненте, который получил нажатие. Тогда, если нажали в Memo, то обработаем только мы, если в другом месте формы, то уже пойдет стандартная обработка сообщения.
Как засаблассить компонент - в юните, где у тебя Memo делаем примерно так:
Код:
type
  TMemo=class(StdCtrls.TMemo)
  protected
    procedure WmKeyDown(var Message : TMessage); message WM_KEYDOWN;
    ...
  end;

  TForm1 = class(TForm)
    Memo1 : TMemo;
    ...
Таким образом при создании формы будет создан твой компонент, а не тот, который стандартный. И редактор не поломается, и не надо свой компонент полностью писать/устанавливать.

ЗЫ. Может не прокатить, т.к. этот компонент есть просто обертка над стандартным виндовым. Но, по идее, должно.
Ответить с цитированием