Что-то не видно желающих написать пост про 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