Ver Mensaje Individual
  #18  
Antiguo 30-12-2020
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Reputación: 13
bucanero Va camino a la fama
hola!

En tu código veo que hay una estructura begin/end que queda fuera de todos los bucles, y se puede eliminar (lo he marcado con //* *//), salvo que sea un error y pertenezca a alguno de los bucles.

Código Delphi [-]
procedure TForm2.Paneles(TSN: Boolean; const Panels: array of TPanel; SiNo: Boolean);
var
  i, ii: Integer;
begin
  // arreglo 1
  // Ocultar todos  o Mostrar Todos los Panel
  // independientemente del arreglo 2
  for ii := 0 to ComponentCount - 1 do
    if Components[ii] is TPanel then
      TPanel(Components[ii]).Visible := TSN;  //todos visibles o no
  //* begin *//
     //arreglo 2
     //independiente al arreglo 1
     //este arreglo sera lo contrario al arreglo 3
    for i := 0 to ComponentCount - 1 do
      if Components[i] is TPanel then
        TPanel(Components[i]).Visible := not SiNo; //False
    // Mostrar los deseados
    //arreglo 3 el cual sera para nostrar o no un grupo determinado
    //de controles TPanel
    for i := Low(Panels) to High(Panels) do
      Panels[i].Visible := SiNo;
//* end *//
end;

Por otra parte el primer for ii establece todos los paneles con el valor Visible a TSN, e inmediatamente el segundo for i establece de nuevo los valores Visible a not SiNo, con lo que al final el primer for sería innecesario.

En cuanto a la parte lógica del proceso veo lo siguiente:

-Si no pasas una lista de paneles, (array de paneles esta vacío), estas actuando sobre todos los paneles y entonces el valor del campo SiNo es irrelevante, puesto que solo se aplica al array de paneles, y en este caso al estar vacío no se va aplicar a ningún panel.
-Si por el contrario si se pasa una lista de Paneles, entonces la opción donde el valor de TSN y el valor de SiNo son iguales, es lo mismo que aplicar el valor a todos los paneles, independientemente de la lista que se ha pasado. Por tanto lo ideal es que TSN sea distinto de SiNO y al ser de tipo boolean la única opción es que TSN:=not SiNO y de esta forma solo necesitas pasar una variable con el valor deseado al procedimiento.


Y el código puede quedar de esta forma:
Código Delphi [-]
procedure TForm2.SetPanelsVisible(const Panels: array of TPanel; const Value: Boolean = true);
var
  i: Integer;
begin
  // Ocultar todos  o Mostrar Todos los Panel
  for i := 0 to ComponentCount - 1 do
    if Components[i] is TPanel then
      TPanel(Components[i]).Visible := Not Value;  //todos visibles o no

  // Mostrar los deseados
  // arreglo 3 el cual sera para nostrar o no un grupo determinado
  // de controles TPanel
  for i := Low(Panels) to High(Panels) do
    Panels[i].Visible := Value;
end;

y yo añadiría un overload al procedimiento para poder utilizarlo de forma mas fácil cuando no quieras pasar el array:

Código Delphi [-]
  TForm2 = class(Tform)
  ...  
  public
    procedure SetPanelsVisible(const Value: Boolean); overload;
    procedure SetPanelsVisible(const Panels: array of TPanel; const Value: Boolean = true); overload;
    ...
  end;
...

procedure TForm2.SetPanelsVisible(const Value: Boolean);
begin
  // establecer el valor a todos los paneles
  SetPanelsVisible([], not Value);
end;


Y la forma de uso es muy similar a la que ya tenias anteriormente:
Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
begin
  SetPanelsVisible(False);   //ocultar todos
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  SetPanelsVisible(true);    //mostrar todos
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  SetPanelsVisible([Panel1, Panel5], true);   //mostrar 1 y 10
end;

procedure TForm2.Button4Click(Sender: TObject);
begin
  SetPanelsVisible([Panel1, Panel5], False);  //ocultar 1 y 10
end;

Última edición por bucanero fecha: 30-12-2020 a las 17:33:22. Razón: modificar un error en el texto
Responder Con Cita