PDA

Ver la Versión Completa : ControlCount de un TPanel


salvica
05-09-2007, 15:45:42
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:

{
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...


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:

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)

...
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:

(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
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?...


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;