Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Componentes en un panel (https://www.clubdelphi.com/foros/showthread.php?t=71680)

GustavoCruz 03-01-2011 16:57:51

Componentes en un panel
 
Hola amigos del foro, Un feliz y próspero nuevo año para todos.

Me gustaría saber cómo se puede hacer para obtener los componentes que se encuentran en un TPanel.


Gustavo Cruz

ecfisa 03-01-2011 18:21:00

Hola Gustavo.

Creo que podés echar mano de la función GetParentComponent.

Te pongo un ejemplo de uso teniendo a 'Panel1' con varios componentes dentro:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  Caption:= '';
  for i:= ComponentCount - 1 downto 0 do
   if Components[i].GetParentComponent.Name = 'Panel1' then
    Caption:= Caption +' '+ Components[i].ClassName;
end;

Saludos.

GustavoCruz 03-01-2011 18:26:24

Gracias por tu respuesta ecfisa.

Probaré y te cuento, pues tengo planeado realizar una serie de tareas con los componente de un TPanel. es algo como borrar contenidos y cosas así

Gustavocruz

ecfisa 03-01-2011 19:46:01

Hola Gustavo.

Una opción más elaborada de manejar los componentes es utilizando TComponenList. Tenés que incluir la unit Contnrs.

Un ejemplo:
Código Delphi [-]
uses ..., Contnrs.
...
 TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure FormShow(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    FCmpList: TComponentList;
    function ObtenerComponentes(const ParentName: string): TComponentList;
  public
  end;

....

{ Devuelve Lista de componentes con un determinado Parent }
function TForm1.ObtenerComponentes(const ParentName: string): TComponentList;
var
  i: Integer;
begin
  Result:= TComponentList.Create;
  for i:= ComponentCount - 1 downto 0 do
   if Components[i].GetParentComponent.Name = ParentName then
    Result.Add(Components[i])
end;

{ Cargar Lista }
procedure TForm1.FormShow(Sender: TObject);
begin
  FCmpList:= TComponentList.Create(True);
  FCmpList:= ObtenerComponentes('Panel1');
end;

{ Hacer algunas operaciones sobre la lista }
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  // desactivar los controles de Panel1
  for i:= 0 to FCmpList.Count -1 do
    (FCmpList.Items[i] as TControl).Enabled:= False;
  // activar Label1
  (FCmpList.Items[FCmpList.IndexOf(Label1)] as TControl).Enabled:= True;
  // Borrar un elemento
  FCmpList.Items[FCmpList.IndexOf(Memo1)].Free;
end;
...

{ Liberar lista }
procedure TForm1.FormDestroy(Sender: TObject);
begin
  FCmpList.Free;
end;


Saludos.

Aleca 03-01-2011 20:30:27

el TPanel tiene las siguientes propiedades :
Código Delphi [-]
  Panel1.ComponentCount;
  Panel1.Components[];
combinalo con los ejemplos anteriores (por lo que vi te muestran los componentes en general).

Enan0 03-01-2011 20:53:14

Simplemente un comentario sobre algo que he leido hace algun tiempo en algun manual de delphi

en este decia que la utilizacion de "AS" no era muy conviente porque producia un consumo de memoria, talves excesivo

en su defecto recomendaba usar

Código Delphi [-]

  TControl(FCmpList.Items[i]).Enabled:= False;
  // activar Label1
  TControl(FCmpList.Items[FCmpList.IndexOf(Label1)]).Enabled:= True;

ecfisa, no es a modo de corrección (no estoy a la altura de semejante cosa) y perdon si estoy diciendo algo que es incorrecto.

saludos

Cita:

Empezado por ecfisa (Mensaje 386510)

Un ejemplo:
Código Delphi [-]

{ Hacer algunas operaciones sobre la lista }
procedure TForm1.Button2Click(Sender: TObject);
var
  i: Integer;
begin
  // desactivar los controles de Panel1
  for i:= 0 to FCmpList.Count -1 do
    (FCmpList.Items[i] as TControl).Enabled:= False;
  // activar Label1
  (FCmpList.Items[FCmpList.IndexOf(Label1)] as TControl).Enabled:= True;
  // Borrar un elemento
  FCmpList.Items[FCmpList.IndexOf(Memo1)].Free;
end;
...


Saludos.


ecfisa 03-01-2011 21:04:10

Cita:

Empezado por Aleca (Mensaje 386515)
el TPanel tiene las siguientes propiedades :
Código Delphi [-]
  Panel1.ComponentCount;
  Panel1.Components[];
combinalo con los ejemplos anteriores (por lo que vi te muestran los componentes en general).

Hola Aleca.

En realidad para que funcione como en el código superior el propietario de los componentes debería ser el Panel ya que eso podemos evaluar con esas propiedades. Pero si fue creado en tiempo de diseño el propietario es el Form por lo que no va a funcionar.
Lo que sí funcionaría es :
Código Delphi [-]
var
  i: Integer;
begin
  for i:= 0 to Panel1.ControlCount - 1 do
    Caption:= Caption + Panel1.Controls[i].Name;
...
Ya que el Parent de los controles, al estar dentro del TPanel es el Panel y estas propiedades evaluan el Parent.

Pero en ese caso estaríamos evaluando por TControl y no TComponent como pidió GustavoCruz.


Un saludo.

ecfisa 03-01-2011 21:41:50

Cita:

Empezado por Enan0 (Mensaje 386517)
Simplemente un comentario sobre algo que he leido hace algun tiempo en algun manual de delphi en este decia que la utilizacion de "AS" no era muy conviente porque producia un consumo de memoria, talves excesivo en su defecto recomendaba usar

Hola Enan0.

Si tenés razón, en este caso es más eficiente usar el cast en forma directa, gracias por la observación.
Pero hay que aclarar que no siempre es "seguro" ese tipo de conversión directa, hay casos en que nos
conviene asegurarnos el tipo antes de realizar la conversión.

Algo que leí sobre el operador 'as':

"El operador as se puede descomponer en instrucciones más simples..." (Ian Marteens)

Por ejemplo:
Código Delphi [-]
(ActiveControl as TButton).Click
Es equivalente a:
Código Delphi [-]
  if ActiveControl is TButton then
    TButton(ActiveControl).Click  
  else
    raise EInvalidCast.Create('Tipo inválido');

En cambio este código es redundante y por tanto ineficiente:
Código Delphi [-]
   if ActiveControl is TButton then
      (ActiveControl as TButton).Click  // redundante, se sabe que es TButton

Lo correcto sería:
Código Delphi [-]
     if ActiveControl is TButton then  // verificar si es seguro el cast
       TButton(ActiveControl).Click;


Un saludo.

Aleca 04-01-2011 16:30:44

Hola ecfisa, cuando tenes razon tenes razon, gracias por la aclaración, me habia confundido
Saludos :)

Aleca 05-01-2011 01:47:40

no se porque pero no puedo ponerlo en forma de cita.
gracias Enan0 por la aclaración de AS y la verdad que lo estaba usando de las dos formas, asi que voy a ir revisando y sacar el AS.
Saludos :)

viveba 19-02-2013 18:21:05

La verdad es que este material es invaluable, muchas gracias a todos!!!

aquí están las respuestas que buscaba.


La franja horaria es GMT +2. Ahora son las 03:10:18.

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