【问题标题】:Disable all objects/components on a panel禁用面板上的所有对象/组件
【发布时间】:2022-09-24 16:29:32
【问题描述】:

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

我希望单独禁用组件(而不仅仅是禁用面板本身)以向使用我的程序的人显示对象存在但无法使用(它们是变灰因为Enabled 属性为假)。

有没有更快的方法来禁用所有这些立刻,而不是将每个组件的 Enabled 属性更改为 false?

    标签: delphi delphi-2010 vcl


    【解决方案1】:

    如果您不希望禁用面板的选项,另一个选项是使用ControlsCountControls[i] 循环通过面板内的所有组件。

    使用这样的代码,您可以做到:

    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):

      for i := 0 to (pnl.ControlCount - 1) do
        if Assigned(GetPropInfo(pnl.Controls[i],  'Enabled')) then
          SetPropValue(pnl.Controls[i],  'Enabled', False);
      
    

    也可以有另一个TPanel(面板2)里面原来的TPanel面板1) 具有更多组件,如图所示。在这种情况下,此代码只会禁用第一个代码,并且面板2(不是里面的组件面板2)。 如图所示。

    如果你想让它运行递归地,您需要运行该函数递归地.像这样的东西:

    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;
    

    结果将是这样的:

    【讨论】:

      【解决方案2】:

      有没有更快的方法来禁用所有这些立刻,而不是将每个组件的 Enabled 属性更改为 false?

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

      【讨论】:

        猜你喜欢
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 2015-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多