我在验证对话框中的用户输入失败时调用了一个实用程序例程。它将焦点设置为违规控制,发出蜂鸣声并向用户显示相应的消息。只要不隐藏违规控件,这种方法就可以正常工作。现在我必须适应这种情况,相关的控件是某种可折叠组框的子代(甚至可能是嵌套的),我必须确保在调用SetFocus之前扩展“祖先”框。
现在我有几个可能性:
我有什么想法可以处理这种情况吗?
答案 0 :(得分:4)
EnsureVisible
。EnsureVisible
。如果您不喜欢界面,那么使用自定义Windows消息进行操作,但您可以获得基本想法。
答案 1 :(得分:2)
在我看来,最好的解决方案是建立有关所有容器控件的知识的单独例程,允许对话验证例程保持通用,同时足够集中以便于测试和维护。有点像:
procedure ForceControlVisible(C: TControl);
begin
// Recursive code
if Assigned(C.Parent) then ForceControlVisible(C.Parent);
// Code specific to each container control class
if C is TTabSheet then
begin
// Code that makes sure "C" is the active page in the PageControl
// goes here. We already know the PageControl itself is visible because
// of the recursive call.
end
else if C is TYourCollapsibleBox then
begin
// Code that handles your specific collapsible boxes goes here
end
end;
依赖于虚拟方法或实现接口的OOP方式会更优雅,但需要访问您想要使用的所有控件的源代码:即使您确实可以访问所有必需的源,但最好是不引入任何更改,因为它使升级这些控件变得困难(在从供应商处获取新文件后,您必须重新引入更改)。
答案 2 :(得分:1)
每个组件都知道它的Parent
。您可以在列表中向上走,以使每个父级可见。