我有自己的Treeview控件派生自TCustomTreeView
。
我已经在课程中添加了一些自己的程序,例如添加节点。在运行时调用此过程时,我希望选择新添加的节点,并使Treeview成为焦点,以便突出显示新节点。
以下是摘录:
procedure TMyTreeView.AddGroup(AName: string);
var
Node: TTreeNode;
Obj: TGroup;
procedure AddToTree;
begin
Obj := TGroup.Create(AName);
FGroups.Add(Obj);
Node := Items.AddObject(Node, AName, Obj);
with Node do
begin
ImageIndex := 0;
SelectedIndex := 0;
end;
Selected := Node;
SetFocus;
end;
begin
Node := nil;
AddToTree;
end;
上述方法有效但我在使用Forms OnCreate
事件调用时遇到常见错误消息:
无法对已禁用或不可见的窗口进行聚焦
我知道您可以使用OnActivate
事件或根本不使用OnCreate
但不会导致错误,但是其他任何可能使用该组件的人可能都没有意识到这一点
所以我想知道是否有办法确定我的Treeview(或任何控件)是否能够获得焦点,然后我可以添加一些我自己的检查,例如:
if ControlIsFocusable then
begin
Selected := Node;
SetFocus;
end;
我知道你可以覆盖的Loaded
过程告诉我们加载控件的时间,然后只能在第一次运行时使用。如果控件在运行时被用户隐藏(或者在开始时不可见),则Cannot focus a disabled or invisible window
错误仍会出现。
不在调试器中运行时执行此操作的脏方法是:
try
Selected := Node;
SetFocus;
except
end;
但是这会破坏目的,我讨厌以这种方式处理错误。
所以基本上我想知道是否有办法确定控件是否可以获得焦点,以便我们可以将焦点设置为它?
答案 0 :(得分:4)
我不会回答你提出的问题,因为我认为你做错了。
控件不应自行调用SetFocus
。我可以想象没有这种情况是正确的行为。表格或应用程序或框架应确定重点。不是控制。
想象一下当你有一个带有两个这样的控件的表单时会发生什么?想象一下,使用键盘对焦按钮,然后按 SPACE 栏。如果附加到按钮的操作调用了您的控件的方法然后更改了焦点,那么您刚刚违反了平台UI指南。您现在可以控制任何试图使用它的应用程序。