Как я могу определить, входит ли пользователь в компонент с помощью клавиши tab
или мыши click
?
ОБНОВЛЕНИЕ 1
На самом деле речь идет о TVirtualStringTree
, который в зависимости от того, как он фокусируется, открывает пользовательский редактор, ориентированный на тот или иной столбец.
ОБНОВЛЕНИЕ 2
Проверьте код ниже.
procedure TForm1.Tree1Click(Sender: TObject);
var
Tree: TVirtualStringTree;
Click: THitInfo;
HitNode: PVirtualNode;
HitColumn: TColumnIndex;
col: Integer;
begin
Tree:= Sender as TVirtualStringTree;
Tree.GetHitTestInfoAt(Mouse.CursorPos.X-Tree.ClientOrigin.X, Mouse.CursorPos.Y-Tree.ClientOrigin.Y, True, Click);
HitNode:= Click.HitNode;
if not Assigned(Click.HitNode) and Assigned(Tree.FocusedNode) then
HitNode:= Tree.FocusedNode;
HitColumn:= Click.HitColumn;
//get first visible and editable column
if (HitColumn <= NoColumn) or
((HitColumn > NoColumn) and
(not (coVisible in Tree.Header.Columns.Items[HitColumn].Options) or
not (coEditable in Tree.Header.Columns.Items[HitColumn].Options))) then
if Tree.Header.Columns.Count > 0 then
for col := 0 to Tree.Header.Columns.Count - 1 do
if (coVisible in Tree.Header.Columns.Items[col].Options) and
(coEditable in Tree.Header.Columns.Items[col].Options) then
begin
HitColumn:= col;
Break;
end;
if Assigned(HitNode) and (HitColumn > NoColumn) then
{if (Tree.IsEditing and (HitNode <> Tree.FocusedNode)) or
((not Tree.IsEditing) and (HitNode = Tree.FocusedNode)) then}
Tree.EditNode(HitNode,HitColumn);
end;
procedure TForm1.Tree1Enter(Sender: TObject);
var
Tree: TVirtualStringTree;
Click: THitInfo;
HitNode: PVirtualNode;
HitColumn: TColumnIndex;
col: Integer;
begin
Tree:= Sender as TVirtualStringTree;
HitNode:= Tree.FocusedNode;
if not Assigned(Tree.FocusedNode) then
HitNode:= Tree.GetFirstVisible;
HitColumn:= NoColumn;
//get first visible and editable column
if Tree.Header.Columns.Count > 0 then
for col := 0 to Tree.Header.Columns.Count - 1 do
if (coVisible in Tree.Header.Columns.Items[col].Options) and
(coEditable in Tree.Header.Columns.Items[col].Options) then
begin
HitColumn:= col;
Break;
end;
if Assigned(HitNode) and (HitColumn > NoColumn) then
Tree.EditNode(HitNode,HitColumn);
end;
Что я хотел бы сделать, так это:
- для редактирования первого столбца сфокусированного узла, если пользователь вводит ключ
Tab
или - редактировать соответствующий выбранный столбец при вводе мышью
click
Если я нажимаю на компонент, сначала запускается OnEnter
, а затем OnClick
, поэтому проблема в том, что узел редактирования запускается 2 раза.