Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ControlCount de un TPanel (https://www.clubdelphi.com/foros/showthread.php?t=47707)

salvica 05-09-2007 15:45:42

ControlCount de un TPanel
 
Hola a tod@s, de nuevo por estos barrios ;)

He definido una función que activa/desactiva las etiquetas (TLabel) contenidas en un TPanel, bien una sola o bien todas.

El código es el siguiente:
Código Delphi [-]
{
  activar/desactivar los estados de las TLabel
  - si TODAS = true  entonces Sender es un TPanel
  - si TODAS = false entonces Sender es un TLabel
}
procedure TForm1.ActivarEtiquetas( Sender:TObject; Estado:boolean; Todas:boolean = true );
var
  Contenedor : TPanel;
  Etiqueta   : TLabel;
  i          : integer;
begin
  if Todas then begin
     Contenedor := (Sender as TPanel);
     for i:=0 to Contenedor.ControlCount-1 do
         if( Contenedor.Controls[i] is TLabel ) then begin
             Etiqueta := ( Contenedor.Controls[i] as TLabel ) ;
             Etiqueta.Enabled := Estado;
         end;
  end else (Sender as TLabel).Enabled := Estado;
end;
Bien, el código funciona pero .... (siempre hay un pero), una etiqueta de otro panel se desactiva tambien
¿donde meto la pata? :mad:
He leido por aquí que hay otra propiedad para buscar los elementos contenidos en otro, pero ahora soy incapaz de volver a hacelo. :mad::mad::mad:

Agradecido
Salvador (salvica)

maeyanes 05-09-2007 16:12:44

El procedimiento que muestras, lo envías desde algún manejador de eventos o es un manejador de eventos de algún componente que hayas creado?

A simple vista no le veo nada raro...

Código Delphi [-]
procedure TForm1.ActivarEtiquetas(Sender:TObject; Estado, Todas: Boolean);
var
  Contenedor: TPanel;
  Etiqueta: TLabel;
  I: Integer;

begin
  if Todas then
  begin
    Contenedor := (Sender as TPanel);
    for I := 0 to Contenedor.ControlCount - 1 do
      if Contenedor.Controls[i] is TLabel then
        TLabel(Contenedor.Controls[i]).Enabled := Estado
  end
  else
    (Sender as TLabel).Enabled := Estado
end;

La propiedad ControlCount te dice cuantos controles tienen como Parent al control especificado, entonces, Contenedor.ControlCount te indica cuantos controles tienen a Contenedor como Parent...

Ahora, si te fijas, le hice un pequeño cambio a tu código, y este fue que, luego de verificar que Contenedor.Controls[i] is TLabel, ya no es necesario usar el operador as para convertir el control a un TLabel, ya es seguro hacer TLabel(Contenerdor.Controls[i]).Enabled := Estado.


Saludos...

salvica 05-09-2007 16:44:02

Hola maeyanes, gracias por responder.

Me parece que tantas horas tecleando comienza a jugarme extrañas pasadas :o, el texto original del caption de la etiqueta es "ºC" (el símbolo de la temperatura), la he borrado cuatro o cinco veces, la he vuelto a crear y nada, siempre aparece como desactivada (en modo de diseño inclusive).
Al final he puesto un texto más largo y ya no aparece, por lo que debo creer que son las gafas :rolleyes:

Cita:

Empezado por maeyanes (Mensaje 228538)
El procedimiento que muestras, lo envías desde algún manejador de eventos o es un manejador de eventos de algún componente que hayas creado?

La función la llamo en el OnShow del form.

Se trata de que si al leer una tabla me falta el registro anterior se debe crear con unos datos iniciales y desactivar las entradas del registro actual (por lo que desactivo también las etiquetas para dar mayor realismo)

Cita:

Empezado por maeyanes (Mensaje 228538)
Código Delphi [-]
    ...
    for I := 0 to Contenedor.ControlCount - 1 do
      if Contenedor.Controls[i] is TLabel then
        TLabel(Contenedor.Controls[i]).Enabled := Estado
    ...


No conocía esta forma de hacer casting, yo siempre lo he hecho:
Código Delphi [-]
(Contenedor.Controls[i] as TLabel).Enabled := Estado
Aquí siempre se aprende algo nuevo
Gracias por la ayuda
Salvador (salvica)

delphi.com.ar 05-09-2007 18:53:33

Cita:

Empezado por salvica (Mensaje 228533)
Bien, el código funciona pero .... (siempre hay un pero), una etiqueta de otro panel se desactiva tambien
¿donde meto la pata? :mad:

¿Estas pasando el contenedor correcto?...

Código Delphi [-]
procedure EnableControls(AContainer: TWinControl; AClass: TControlClass; AValue: Boolean);
var
  i: Integer;
begin
  for i := 0 to AContainer.ControlCount -1 do
    if AContainer.Controls[i] is AClass then
      AContainer.Controls[i].Enabled := AValue;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  EnableControls(Panel1, TLabel, CheckBox1.Checked);
end;


La franja horaria es GMT +2. Ahora son las 23:00:54.

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