Cómo modificar el aspecto de los controles según un estado

4970 vistas

Podemos usar esta función para indicar si un formulario es o no modificable (cambiando el color de los componentes y su propiedad ReadOnly o Enabled)

Ejemplo de llamada a la función:



delphi
  1. setAspectControl(self, true);



Código de la función



delphi
  1. uses
  2.   Graphics, Controls, StdCtrls, TypInfo;
  3.  
  4. { Parámetros  :                                                                }
  5. {  container  : contenedor de los componentes a modificar en función del estado}
  6. {  estado      : si true, los componentes del contenedor son modificables      }
  7. {                si false, los componentes del contenedor serán de sólo lectura }
  8. {  trueColor  : color dado en caso de que los componentes estén activos        }
  9. {  falseColor  : color dado en caso de que los componentes estén inactivos      }
  10. {  testTagValue: si true, sólo se tratarán los componentes que tengan su Tag a 0}
  11. {                si false, se tratarán todos los componentes                    }
  12. procedure setAspectControl(Container: TWinControl; Estado: boolean;
  13.     trueColor: TColor = clWindow; falseColor: TColor = clBtnFace;
  14.     testTagValue: boolean = true);
  15. var
  16.   i: integer;
  17.   color: array[boolean] of TColor;
  18. begin
  19.   color[false] := falseColor;
  20.   color[true]  := trueColor;
  21.  
  22.   for i:= 0 to Container.ControlCount - 1 do
  23.   begin
  24.     { si testTagValue, sólo controlamos los componentes que tengan la propiedad Tag a 0 }
  25.     { esto permite no tratar algunos controles sólo modificando su Tag }
  26.     if (not (Container.Controls[i] is TLabel)) and
  27.       ((not testTagValue) or (Container.Controls[i].Tag = 0)) then
  28.     begin
  29.       { Si el componente contiene otros componentes, hacemos llamada recursiva }
  30.       if (Container.Controls[i] is TWinControl)
  31.       and ((Container.Controls[i] as TWinControl).ControlCount > 0) then
  32.       begin
  33.         setAspectControl(Container.Controls[i] as TWinControl,
  34.                         Estado, trueColor, falseColor, testTagValue)
  35.       end
  36.       else
  37.       begin
  38.         { modificamos la propiedad ReadOnly o Enabled }
  39.         if GetPropInfo(Container.Controls[i].ClassInfo,'ReadOnly') <> nil then
  40.           SetPropValue(Container.Controls[i],'ReadOnly', not Estado)
  41.         else if GetPropInfo(Container.Controls[i].ClassInfo,'Enabled') <> nil then
  42.           SetPropValue(Container.Controls[i],'Enabled', Estado);
  43.         { modificamos el color }
  44.         if not (Container.Controls[i] is TButtonControl)
  45.         and (GetPropInfo(Container.Controls[i].ClassInfo, 'Color') <> nil) then
  46.           SetPropValue(Container.Controls[i],'Color', Couleur[Estado]);
  47.       end;
  48.     end; { control de Tag }
  49.   end;
  50. end;