首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >禁用面板上的所有对象/组件

禁用面板上的所有对象/组件
EN

Stack Overflow用户
提问于 2022-09-21 09:10:48
回答 2查看 125关注 0票数 1

我有一个面板,包括标签,按钮,备忘录等,我希望每个组件在该面板上被禁用,单独(即,Enabled是假的)。

我希望单独禁用组件(而不仅仅是禁用面板本身),以向使用我的程序的人显示对象在那里,但不能使用(由于Enabled属性为false),这些对象是灰色的。

是否有一种更快捷的方法同时禁用所有这些组件,而不是将每个组件的Enabled属性更改为false?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-22 00:07:44

如果不希望该选项禁用面板,则另一个选项是使用ControlsCountControls[i]遍历面板中的所有组件。

有了这样的代码,您就可以做到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
procedure TForm3.DisableAll(pnl: TPanel);
var
   i:integer;
begin
   for i := 0 to (pnl.ControlCount - 1) do
     SetPropValue(pnl.Controls[i], 'Enabled', False);

可能有一些组件没有Enabled属性(例如TBevel),在这种情况下,它会产生一个错误;要做到这一点,您可以检查运行的每个组件是否包含它(GetPropInfo):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  for i := 0 to (pnl.ControlCount - 1) do
    if Assigned(GetPropInfo(pnl.Controls[i],  'Enabled')) then
      SetPropValue(pnl.Controls[i],  'Enabled', False);

在原始的TPanel(panel2) (panel1)中也可以有另一个组件,如在图像中。在这种情况下,这段代码只会禁用第一个代码和Panel2 (而不是panel2中的组件)。从图像中可以看到。

如果您希望它运行recursively,,则需要运行函数recursively.就像这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
procedure TForm3.DisableAll(pnl: TPanel);
var
  i:integer;
  info:PPropInfo;
begin
  for i := 0 to (pnl.ControlCount - 1) do
    if (pnl.Controls[i] is TPanel) then
      DisableAll(TPanel(pnl.Controls[i]))
    else
      if Assigned(GetPropInfo(pnl.Controls[i], 'Enabled')) then
        SetPropValue(pnl.Controls[i], 'Enabled', False);
end;

结果会是这样的:

票数 3
EN

Stack Overflow用户

发布于 2022-09-21 09:49:10

是否有更快的方法同时禁用所有这些组件,而不是将每个组件的Enabled属性更改为false?

最快的方法是仅仅禁用面板本身,但你排除了这种可能性。所以没有别的办法了。您必须循环遍历面板的组件,并一次禁用它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73804597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文