我如何可以检测如果用户通过tab
键或鼠标click
进入组件得到一个组件的焦点检测?如果用户通过标签或通过点击
更新1
其实是关于其根据的方式是越来越集中在一个TVirtualStringTree
,它打开一个自定义编辑器集中在一个或另一个列。
UPDATE 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
键或 - 进入,如果通过输入编辑相应hited列鼠标
click
如果我点击组件,OnEnter
首先触发和OnClick
后,因此T他的问题是编辑节点被触发2次。
您预计不会在意。毕竟有很多其他的方式来做到这一点。 –
拦截所有鼠标点击,并且如果在获得焦点之前的最后一次点击是在该组件上,那么它可能就是它。但是你真的不应该在意。如果我只是恢复一个最小化的窗口 - 这是另一种获得重点的方法。如果我最小化另一个应用程序的窗口 - 第四种获得焦点的方法。如果我解锁Windows会话或连接到正在运行的终端服务会话,该怎么办?等等等等。 –
看到我的更新...我害怕我太笼统了。 – REALSOFO