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 28-06-2022
petercat petercat is offline
Miembro
 
Registrado: feb 2012
Posts: 23
Poder: 0
petercat Va por buen camino
Contar componentes

Buenas necesito contar los componentes creados en tiempo de ejecucuion que a su vez se crean en otro comoponente.
Explico:
En tiempo de ejecucion creo 5 comoponentes "Panel" y luego a su vez creo en 3 de estos componente un Button.
Pues bien, necesitaria saber cuantos button tengo en total en el Form o bien pasar por cada uno de los Panel y que me digan cuantos button existen en cada uno de ellos, pero el resultado final seria saber cuantos button.


Creo los paneles:

Bit := Tpanel.Create(Self);
Bit.Parent := From1;
Bit.Left := 1;
Bit.Top := 1;
Bit.Height := 25 ;
Bit.Width := 25 ;


Creo los Button


Bit := Tbutton.Create(Tpanel);
Bit.Parent := Tpanel;
Bit.Left := 1;
Bit.Top := 1;
Bit.Height := 25 ;
Bit.Width := 25 ;


Cuento los paneles:


for i := 0 to componentCount - 1 do
if components[i] is Tpanel then
ShowMessage(IntToStr(I));


Pero el problema es que no puedo contar los Button que hay dentro de los Paneles


Gracias
Responder Con Cita
  #2  
Antiguo 28-06-2022
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Hola

Seguro hay formas mas elegantes y más fáciles, pero así de repente tal vez te de una mejor idea.

Código Delphi [-]
  for i := 0 to componentCount - 1 do
  begin
    if components[i] is Tpanel then
       ShowMessage(format('Se encontró %s', [components[i].Name]));
    if components[i] is Tbutton then
    begin
       if (components[i] as tbutton).Parent is TPanel then
         ShowMessage(format('Se encontró %s que pertenece a %s', [components[i].Name,
                                             (components[i] as tbutton).Parent.Name]));
    end;
  end;

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 29-06-2022
petercat petercat is offline
Miembro
 
Registrado: feb 2012
Posts: 23
Poder: 0
petercat Va por buen camino
Muchas gracias por la respuesta.
Es cierto que hay formas mas elegantes pero en realidad es un ejemplo y despues de loclacizar los button debo de hacer mas cosas.
De todas formas me localiza los Tpanel pero no me localiza los Tbutton creados dentro de esos Tpanel, quiero recordar que los button se generan en tiempo de ejecucion.


Alguna solucion??
Vamos encaminados
Responder Con Cita
  #4  
Antiguo 29-06-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Hola.
Antes de nada, comentarte que utilices los TAG's cuando añadas código delphi a los mensajes.

Otra cosa (no se si porque has puesto el código de memoria), pero creo que este código (si lo tienes así en el programa) te va a dar problemas. O fallará directamente.

Código Delphi [-]
Bit := Tbutton.Create(Tpanel);
Bit.Parent := Tpanel;
Bit.Left := 1;
Bit.Top := 1;
Bit.Height := 25 ;
Bit.Width := 25 ;

En concreto la línea que asigna el Parent, debe fallar o no funcionará como piensas.

En cuanto a lo que necesitas, para contar los Paneles están utilizando ComponentCount y Components[i].
Para contar los botones en el interior de un TPanel, debes usar lo mismo, pero utilizando esa misma propiedad del contenedor. En este caso del TPanel.

Si utilizas un cóidigo como este:

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  pnl:TPanel;
  Bit: Tbutton;
begin
  Randomize;
  // Crear paneles
  for var i:integer := 0 to 4 do begin
    pnl := Tpanel.Create(Self);
    pnl.Name := 'Panel_' + i.ToString;
    pnl.Parent := Self;
    pnl.Left := 1;
    pnl.Top := 1;
    pnl.Height := 75 ;
    pnl.Width := 25 ;
    pnl.Align := alTop;
    pnl.Caption := pnl.Name;
    // Crear botones
    for var j:integer := 0 to Random(5) do begin
      Bit := Tbutton.Create(pnl);
      bit.Name := 'Button_' + i.ToString + '_' + j.ToString;
      Bit.Parent := pnl;
      Bit.Left := (26*j);
      Bit.Top := 1;
      Bit.Height := 25 ;
      Bit.Width := 25 ;
      Bit.Caption := j.ToString;
    end;
  end;

  // contar paneles
  var c:integer := 0;
  var b:integer := 0;
  for var i:integer := 0 to (ComponentCount -1)  do begin
    if (Components[i] is TPanel) then begin
      pnl := TPanel(Components[i]);
      Inc(c);
      // contar botones
      b := 0;
      for var j:integer := 0 to (pnl.ComponentCount -1)  do
        if (pnl.Components[j] is TButton) then
          Inc(b);
      // Botones dentro de ese panel
      pnl.Caption := 'Este panel tiene ' + b.ToString + ' botones';
    end;
  end;
  Self.Caption := 'Se han encontrado ' + c.ToString+ ' paneles';
end;

Tienes como contar los paneles (aparece en el caption del form) y como contar los botones de cada panel (que aparece en el caption del propio Panel).
El resultado será algo similar a esto:

__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 30-06-2022
petercat petercat is offline
Miembro
 
Registrado: feb 2012
Posts: 23
Poder: 0
petercat Va por buen camino
Muchas gracias Neftali, ya he aprendido bastante con el tema de lod botones dentro de paneles.
Ahora queiro resolver otro problema que se me esta dando.


Resulta que una vez creado varios paneles voy creando poco a poco botones en algunos panles pero a su vez quiero eliminar algunos de esos botones que he creado (como si fuera un .visible true o false). Consigo poner en .visible :False el ultimo boton que he creado pero no consigo cojer el boton que este dentro del panel elegido.


Un saludo y espero haberme explicado.


Gracias
Responder Con Cita
  #6  
Antiguo 30-06-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por petercat Ver Mensaje
Resulta que una vez creado varios paneles voy creando poco a poco botones en algunos panles pero a su vez quiero eliminar algunos de esos botones que he creado (como si fuera un .visible true o false). Consigo poner en .visible :False el ultimo boton que he creado pero no consigo cojer el boton que este dentro del panel elegido.
Al final todo se trata de poder identificar cada botón creado de forma única. Y la forma más fácil de hacerlo es a través del nombre que le asignes al crearlo (propiedad NAME).

Una vez que cada elemento tiene un nombre que puedes identificar de forma única, lo más sencillo es encontrarlo. Puedes hacerlo:
  • Utilizando Components[i] para hacer un recorrido por todos.
  • Utilizando FindComponent(Nombre) para buscar un componente por su nombre.
  • Utilizando TObjectList para almacenar una referencia a los componentes creados.

La más sencilla es utilizar FindComponent con un código similar a este:


Código Delphi [-]
  var c:TComponent := FindComponent('Button1');
  if Assigned(c) then
    if (c is TButton) then
      TButton(c).Caption := 'Encontrado';
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 01-07-2022
petercat petercat is offline
Miembro
 
Registrado: feb 2012
Posts: 23
Poder: 0
petercat Va por buen camino
Muchisimas gracias, ya lo he resuelto y he aprendido algo mas.


Gracias de Nuevo.
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
Contar registros en FB Angel.Matilla Firebird e Interbase 4 17-04-2018 19:37:44
GroupBox es un contenedor...? entonces porque no puedo contar los componentes....? Kenobi Varios 1 25-03-2009 14:49:12
contar subdirectorios... Jorghino reyes Varios 2 26-09-2005 16:33:21
contar caracteres Cosgaya Varios 1 04-06-2005 17:40:54
Contar Caracteres Nuria Varios 2 29-12-2003 10:36:46


La franja horaria es GMT +2. Ahora son las 21:51:24.


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