Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-01-2011
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 03-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 03-01-2011
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 03-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 03-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 22
Aleca Va por buen camino
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).
__________________
Aleca
Responder Con Cita
  #6  
Antiguo 03-01-2011
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
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 Ver Mensaje

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.
Responder Con Cita
  #7  
Antiguo 03-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Aleca Ver Mensaje
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 03-01-2011 a las 21:08:35.
Responder Con Cita
  #8  
Antiguo 03-01-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Enan0 Ver Mensaje
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 03-01-2011 a las 21:57:51.
Responder Con Cita
  #9  
Antiguo 04-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 22
Aleca Va por buen camino
Hola ecfisa, cuando tenes razon tenes razon, gracias por la aclaración, me habia confundido
Saludos
__________________
Aleca
Responder Con Cita
  #10  
Antiguo 05-01-2011
Avatar de Aleca
Aleca Aleca is offline
Miembro
 
Registrado: may 2003
Ubicación: Venado Tuerto, Argentina
Posts: 277
Poder: 22
Aleca Va por buen camino
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
__________________
Aleca
Responder Con Cita
  #11  
Antiguo 19-02-2013
viveba viveba is offline
Miembro
 
Registrado: nov 2006
Posts: 24
Poder: 0
viveba Va por buen camino
La verdad es que este material es invaluable, muchas gracias a todos!!!

aquí están las respuestas que buscaba.
Responder Con Cita
Respuesta



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
Panel y scrollbar EITB OOP 3 16-02-2011 06:23:03
Insertar un Panel dentro de otro panel edgwin OOP 3 22-11-2008 17:22:16
No funcionan componentes TSelectOnRuntime cuando estan controles dentro de un panel gulder API de Windows 6 11-08-2006 09:58:50
Panel Tranpsarente Descendents OOP 4 21-11-2004 16:33:35
Un panel transparente yusnerqui Varios 2 23-03-2004 16:33:32


La franja horaria es GMT +2. Ahora son las 21:53:27.


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
Copyright 1996-2007 Club Delphi