Search code examples
delphidelphi-2010vcl

Disable all objects/components on a panel


I have a panel containing labels, buttons, memo's, etc. and I want every component to be disabled on that panel, individually (i.e., Enabled is false).

I want the components to be disabled individually (and not just the panel itself to be disabled) to show the person using my program that the objects are there but cannot be used (they are greyed out because the Enabled property is false).

Is there a quicker way of disabling all of them at once, instead of changing the Enabled property to false for each component?


Solution

  • If you don't want the option to disable the panel, the other option is use ControlsCount and Controls[i] to loop through all the components inside the Panel.

    With code like this you can do it:

    procedure TForm3.DisableAll(pnl: TPanel);
    var
       i:integer;
    begin
       for i := 0 to (pnl.ControlCount - 1) do
         SetPropValue(pnl.Controls[i], 'Enabled', False);
    

    There may be components that do not have the Enabled property (such as a TBevel) and in that case it would give an error; To do this you can check if each component you run has it (GetPropInfo):

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

    There can also be another TPanel(panel2) inside the original TPanel (panel1) with more components, as in the image. In that case this code would only disable the first ones and Panel2 (not the components inside the panel2). As seen in the image.

    enter image description here

    If you want it to run recursively, you'll need to run the function recursively. Something like this:

    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;
    

    And the result will be something like this: enter image description here