Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-12-2020
AlejandroCalica AlejandroCalica is offline
Miembro
 
Registrado: nov 2020
Posts: 37
Poder: 0
AlejandroCalica Va por buen camino
Muy buenas tardes, hice una mescolanza de codigos que me funcionaron, pero me gustaria saber si existe forma de reducir el codigo, este es el codigo que gracias a todos ustedes agrupe de esta forma, espero tengan tiempo para echarme la mano.

Código Delphi [-]

procedure TForm1.SomePanelsVisible(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;

y de esta forma llamo el proceso,con estas opciones

Código Delphi [-]

procedure TForm1.Button1Click(Sender: TObject);
begin
SomePanelsVisible(False,[],True);   //ocultar todos
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
SomePanelsVisible(False,[],False);    //mostrar todos
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
SomePanelsVisible(False,[Panel1, Panel10],true);   //mostrar 1 y 10
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
SomePanelsVisible(False,[Panel1,Panel3,Panel5,Panel7],true); //Mostrar 1,3,5 y 7
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
SomePanelsVisible(True,[Panel1, Panel10],False);  //ocultar 1 y 10
end;
Responder Con Cita
  #2  
Antiguo 30-12-2020
AlejandroCalica AlejandroCalica is offline
Miembro
 
Registrado: nov 2020
Posts: 37
Poder: 0
AlejandroCalica Va por buen camino
que tal pues ste es el final del codigo, creen que se puede comprimir mas o ya no se puede, algun aporte para optimizarlo un poco mas, gracias a todos y felices fiestas

Código Delphi [-]
procedure TForm1.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;

y de esta forma lo ejecuto, sus distintas variantes

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
Paneles(False,[],True);   //ocultar todos
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Paneles(False,[],False);    //mostrar todos
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Paneles(False,[Panel1, Panel10],true);   //mostrar 1 y 10
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Paneles(False,[Panel1,Panel3,Panel5,Panel7],true); //Mostrar 1,3,5 y 7
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
Paneles(True,[Panel1, Panel10],False);  //ocultar 1 y 10
end;
Responder Con Cita
  #3  
Antiguo 30-12-2020
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
doble pantalla con doble from emeritos Varios 0 17-12-2013 14:17:57
llamar a procedure desde otra procedure anubis Varios 23 04-03-2010 18:44:37
puntero a un procedure en un procedure como parametro fcios Varios 2 14-03-2009 03:41:22
Escanear Doble Cara, Doble Lector karenthyuliana Gráficos 2 11-04-2008 17:29:42
boolean nulo Sick boy Conexión con bases de datos 7 05-12-2003 16:40:37


La franja horaria es GMT +2. Ahora son las 05:02:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi