Jun 14

ShortCuts vs VirtualTreeView Editors

Что-то не видно желающих написать пост про VirtualTreeView для конкурса. Жаль...

Ну тогда я сам попробую ;). Тем более, что нашелся подходящий повод.

Суть в следующем: если создать свой редактор для VT и использовать TActionManager (возможно и просто TActionList, не проверял), то могут возникнуть некоторые проблемы. Например, следующая - если для одного из TAction задан ShortCut равный Del, то в редакторе не будет работать клавиша Delete.

Я думаю, всем понятно, почему так. Для тех, кому не понятно - TActionManager перехватывает все нажатия клавиш и проверяет, есть ли обработчик для данного сочетания.

Чем это грозит? Представьте ситуацию - Del настроен на удаление какого-то нода. Теперь, если нажать Delete в редакторе, будет вызываться удаление нода, а не символа в редакторе.

Бороться с этим можно очень просто. В обработчике OnExecute компонента ActionManager надо прописать что-то похожее на следующий код:

procedure TfrmMain.ActionManagerExecute(Action: TBasicAction;
var Handled: Boolean);
var
lMsg: TMessage;
begin
if vtMain.IsEditing then
case TAction(Action).ShortCut of
46: // Del
begin
lMsg.Msg := WM_CHAR;
lMsg.WParam := 46;
lMsg.LParam := 0;
vtMain.EditLink.ProcessMessage(lMsg);
Handled := True;
end
else
vtMain.EndEditNode;
end;
end;

vtMain.EndEditNode - задано для того, чтобы при выборе любого пункта меню редактор закрывался. Не обязательно, но мне так удобнее.

Далее, в редакторе пишем примерно следующее:

procedure TVTRecordEditor.ProcessMessage(var Message: TMessage);
begin
if Message.Msg = WM_CHAR then
begin
SendMessage(FEdit.Handle, WM_KEYDOWN, Message.WParam, Message.LParam);
SendMessage(FEdit.Handle, WM_KEYUP, Message.WParam, Message.LParam);
end
else
FEdit.WindowProc(Message);
end;

Все, теперь кнопка Delete, в режиме редактирования, будет передаваться в редактор. В ином случае, будет срабатывать TAction, на который настроена кнопка Delete.

Спасибо за внимание ;).


  1. AnalogXP
     Add karma Subtract karma  +1
    Цитировать.

    Ну вот, наконец-то решу эту проблему. Мне приходилось избавлятся от ShortCut в меню чтобы все работало.
    Спасибо!

    1
  2. AnalogXP
     Add karma Subtract karma  +1
    Цитировать.

    А как прицепить эту процедуру к VT?
    procedure TVTRecordEditor.ProcessMessage(var Message: TMessage);
    Чет не врубаюсь. Или нужно создать редактор?

    2
  3. aktuba
     Add karma Subtract karma  --1
    Цитировать.
    Комментарий автора

    Да, необходимо создать редактор и в нем использовать данную функцию.

    3
  4. Aligre
     Add karma Subtract karma  --2
    Цитировать.

    Проблема которая останавливает меня от того что-бы подписаться на feed. ну очень медленно грузится сайт

    4
  5. AnalogXP
     Add karma Subtract karma  +0
    Цитировать.

    А как ловить CTRL+C, CTRL+V, и т.д.?

    5

Поделитесь вашими мыслями



Ссылки в комментариях будут свободны от nofollow.

Поддерживаемые теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Ссылки в комментариях будут свободны от nofollow.

aternos хостинг
-->