Alex1978 Цитата: Но это не то, смена текущего узла к этому моменту произошла и я лишь возвращаю фокус, а нужно запретить выбор неугодного узла. Как решить проблему?
1. Когда MultiSelect = False, понятия Selected и Focused становятся равнозначными. Только один node может быть selected (он становится focused), и, наоборот, focused node автоматически становится selected.
Поэтому, когда кодом:
procedure TMainForm.trlMainFocusedNodeChanged(Sender: TObject;
APrevFocusedNode, AFocusedNode: TcxTreeListNode);
begin
if APrevFocusedNode<> nil then
if (AFocusedNode <> nil) and (AFocusedNode.Level = 0) then
APrevFocusedNode.Focused := True;
end;
фокус возвращается на APrevFocusedNode, он (APrevFocusedNode) автоматически становится selected и других selected больше нет.
2. В самом факте того, что мы даем возможность кратковременно перевести фокус на "нежелательный" node и сразу же убираем его, ничего плохого нет. Для обработчика FocusedNodeChanged это штатная ситуация, то есть он предназначен, в том числе, и для этого. На производительности "нормальной" программы это не сказывается.