gpt4 book ai didi

delphi - 我怎么知道何时可以集中控制?

转载 作者:行者123 更新时间:2023-12-03 19:30:51 25 4
gpt4 key购买 nike

我有自己的从TCustomTreeView派生的Treeview控件。

我在类中添加了一些自己的过程,例如添加节点。在运行时调用此过程时,我希望选择新添加的节点,并使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;


但这达不到目的,我讨厌这样处理错误。

因此,基本上我想知道是否有一种方法可以确定控件是否可以接收焦点,以便我们可以将焦点设置为焦点?

最佳答案

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

该控件不应自行调用SetFocus。我无法想象这是正确的行为。形式,应用程序或框架应确定重点。不是控件。

想象一下,当您有一个带有两个这样的控件的表单时会发生什么?想象一下使用键盘聚焦一个按钮,然后用空格键将其按下。如果按钮上附加的操作调用了控件的方法,该方法随后更改了焦点,则说明您违反了平台UI准则。现在,您的控制权给尝试使用它的任何应用程序带来了沉重负担。

关于delphi - 我怎么知道何时可以集中控制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24653063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com