Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-11-2010
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Question Manejo de Componentes en Tiempo de ejecución

Hola a todos, si bien hay varias cosas dando vueltas acerca de este tema me quedan un par de dudas al respecto y de paso por si alguien tiene las mismas dudas planteo este hilo para globalizar un poco el tema del manejo de componentes en tiempo de ejecución.
Baso el ejemplo en los Labels:
- Crear Labels:
Código Delphi [-]
var
  Favorito: TLabel;
  cant_favoritos: integer;
begin
          cant_favoritos: =0;
          Favorito := TLabel.Create(Self);
          //Ubicación del componente, color, etc...
          Favorito.Parent := sScrollBox_favorito;
          Favorito.Align := alTop;
          Favorito.Cursor:=crHandPoint;
          Favorito.Font.Color:=$00B23D00;
          Favorito.Caption:=DM.IBDataSet_favoritoNOMBRE.Value;
          Favorito.Name := 'Favorito_'+IntToStr(cant_favoritos);
          Favorito.PopupMenu:=PopupMenu_elim_favorito;
end;
Bueno, en este caso uso la variable cant_favoritos para controlar el nombre del componente

-Eliminar Labels:
Código Delphi [-]
var
  i:Integer;
begin
  for i:=ComponentCount -1 downto 0 do
    begin
      if (Components[i] is TLabel)then
        Components[i].free;
    end;
end;
Con este codigo (obtenido de otro hilo) elimino los componentes Labels.

Hasta ahí todo bien, las dudas que me surgen ahora son las siguientes:
-¿Cómo borrar un único componente que fue creado en tiempo de ejecución?
-¿Cómo borrar todos los componentes que fueron creados en tiempo de ejecución?
-¿Cómo asignarle eventos (como por ejemplo el OnClick) a cada componente que voy creando en tiempo de ejecución?
-¿Como referenciar componentes creados en tiempo de ejecucion para cambiarles sus propiedades como por ejemplo el color, fuente, etc.?

Bien, creo que esas son las cosas basicas que podemos hacer con los componentes creados en tiempo de ejecución, o al menos es lo que yo estoy necesitando hacer.

Desde ya se agradece cualquier aporte a la causa...
Saludos!!!
Responder Con Cita
  #2  
Antiguo 25-11-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola rruffino, para aceder a un componente creado en tiempo de ejecución, puedes utilizar FindCompoenent:

Eliminamos el Label con nombre "Favorito_2"

Código Delphi [-]
var
 aLabel : TComponent;
begin
 aLabel := FindComponent('Favorito_2');
 if Assigned(aLabel) then
  aLabel.Free;

Parar borrar todos los componentes lo haces con el codigo que ya tienes, pero mejor si los creas dentro de un contenedor (Panel...) y asi borras solo lo que tienes en el contenedor, porque si no tendrías que guardar en algún lado los creados en ejecución para así solo borrar esos componentes o ponerle Tag=-1 y borras solo los que tienen ese valor (esto recorriendo tus componentes).

Para asignar eventos:

Código Delphi [-]
 
//Mostramos su Caption al hacer click
procedure TForm1.ClickLabels(Sender: TObject);
begin
 Showmessage(TLabel(Sender).Caption);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  Favorito: TLabel;
  cant_favoritos: integer;
begin
      aTop := 0;
      cant_favoritos := 1;
      //Creamos 10 labels y le asignamos el mismo evento
      for i:=0 to 10 do
       begin
          Favorito := TLabel.Create(Self);
          //Ubicación del componente, color, etc...
          Favorito.Parent := sScrollBox_favorito;
          Favorito.Align := alTop;
          Favorito.Cursor:=crHandPoint;
          Favorito.Font.Color:=$00B23D00;
          Favorito.Caption:=DM.IBDataSet_favoritoNOMBRE.Value;
          Favorito.Name := 'Favorito_'+IntToStr(cant_favoritos);
          Favorito.Top := aTop;
          Favorito.OnClick := ClickLabels; //Asignamos el evento
          Inc(aTop,20);
          Inc(cant_favoritos);
          Favorito.PopupMenu:=PopupMenu_elim_favorito;
       end;
end;

Y para la ultima pregunta, también con FindComponent.

Código Delphi [-]
var
 aLabel : TComponent;
begin
 aLabel := FindComponent('Favorito_2');
 if Assigned(aLabel) then
  TLabel(aLabel).Caption := 'Otro Caption';

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 25-11-2010 a las 16:23:59.
Responder Con Cita
  #3  
Antiguo 25-11-2010
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Wink Muchas gracias!!

Hola Caro, muchas gracias por la respuesta. La duda que me queda es como me dijiste para eliminar que usara el mismo codigo que tengo y me aconsejabas que lo pusiera en un contenedor como un panel. Bien, justamente tengo todos los compoentes creados en tiempo de ejecucion en un scrollbox. Como me quedaria el codigo?
Muchisimas gracias!!
Responder Con Cita
  #4  
Antiguo 26-11-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por rruffino Ver Mensaje
Bien, justamente tengo todos los compoentes creados en tiempo de ejecucion en un scrollbox. Como me quedaria el codigo?
Hola rruffino, el codigo te quedaría así:

Código Delphi [-]
  for i:=sScrollBox_favorito.ControlCount -1 downto 0 do
    begin
      if sScrollBox_favorito.Controls[i] is TLabel then
        sScrollBox_favorito.Controls[i].free;
    end;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #5  
Antiguo 26-11-2010
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Question otra consultita?

Hola Caro, mil gracias por la respuesta!! Todo lo que has puesto lo he implementado y anda a las mil maravillas. Ahora me ha surgido una duda, yo puedo crear varios componentes label en tiempo de ejecucion y he podido asignarle el evento onclick, ahora, cuando yo hago el click en el label necesito saber sobre cual lo hago, aunque sea me interesa conocer el Caption del label sobre el cual se hizo el click al momento de ejecutar el procedure. Esto es a fines de que lo necesito para buscar ese valor en una tabla. Ya con esto creo que estaria.
Nuevamente te agradezco tus prontas y eficientes respuestas.
Saludos cordiales!
Responder Con Cita
  #6  
Antiguo 26-11-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por rruffino Ver Mensaje
.........Ahora me ha surgido una duda, yo puedo crear varios componentes label en tiempo de ejecucion y he podido asignarle el evento onclick, ahora, cuando yo hago el click en el label necesito saber sobre cual lo hago, aunque sea me interesa conocer el Caption del label sobre el cual se hizo el click al momento de ejecutar el procedure.......
Hola de nuevo, con lo que te puse arriba ya lo tienes, esta parte:

Código Delphi [-]
procedure TForm1.ClickLabels(Sender: TObject);
begin
 Showmessage(TLabel(Sender).Caption); //esto lo asignas a una variable
end;

El unico detalle es que debes asignarle el mismo evento a todos tus Labels y con el parametro Sender ya sabes sobre cual se a hecho click.

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #7  
Antiguo 10-12-2010
rruffino rruffino is offline
Miembro
 
Registrado: dic 2004
Ubicación: Berrotaran, Cordoba - Argentina
Posts: 215
Poder: 20
rruffino Va por buen camino
Wink Perfecto!!

Bien Caro, gracias, ha funcionado perfectamente. Ahora por ejemplo yo he creado varios labels en tiempo de ejecucion y quisiera mediante un timer cambiar el color de la fuente, te adjunto el codigo que he hecho pero no me lo hace. Este codigo va en un timer, o por ahi hay otra forma de hacerlo que no la se.
Código Delphi [-]
var
  aLabel: TComponent;
begin
  aLabel.FindComponent('NotaUrg_0');
  if Assigned(aLabel) then
    begin
      if (TNxLabel(aLabel).Font.Color=ClBlack)then
        begin
          TNxLabel(aLabel).Caption:='Hola';
          TNxLabel(aLabel).Font.Color:=clRed
        end
      else
        begin
          TNxLabel(aLabel).Font.Color:=clBlack;
          TNxLabel(aLabel).Caption:='Chau';
        end
    end;
end;

Desde ya muchas gracias!!
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
Añadir componentes en tiempo de ejecución. Drakyto Varios 4 02-06-2007 19:29:06
Componentes que no se ven en tiempo de ejecución Alcolea Varios 3 11-09-2006 02:18:03
componentes en tiempo de ejecución Maga84 OOP 13 21-05-2005 19:49:06
Componentes en Tiempo de Ejecucion Caro Varios 2 16-05-2005 16:49:01
mover componentes en tiempo de ejecución Dantael OOP 3 06-02-2005 12:29:46


La franja horaria es GMT +2. Ahora son las 21:07: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