我怎么知道控件何时可以聚焦?

时间:2014-07-09 11:57:14

标签: delphi delphi-xe

我有自己的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;

但是这会破坏目的,我讨厌以这种方式处理错误。

所以基本上我想知道是否有办法确定控件是否可以获得焦点,以便我们可以将焦点设置为它?

1 个答案:

答案 0 :(得分:4)

我不会回答你提出的问题,因为我认为你做错了。

控件不应自行调用SetFocus。我可以想象没有这种情况是正确的行为。表格或应用程序或框架应确定重点。不是控制。

想象一下当你有一个带有两个这样的控件的表单时会发生什么?想象一下,使用键盘对焦按钮,然后按 SPACE 栏。如果附加到按钮的操作调用了您的控件的方法然后更改了焦点,那么您刚刚违反了平台UI指南。您现在可以控制任何试图使用它的应用程序。