Тебе же надо в 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;
...
Таким образом при создании формы будет создан твой компонент, а не тот, который стандартный. И редактор не поломается, и не надо свой компонент полностью писать/устанавливать.
ЗЫ. Может не прокатить, т.к. этот компонент есть просто обертка над стандартным виндовым. Но, по идее, должно.