Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > OOP
Register FAQ Members List Calendar Guía de estilo Today's Posts

Grupo de Teaming del ClubDelphi

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 25/11/2010
rruffino rruffino is offline
Miembro
 
Join Date: Dec 2004
Location: 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!!!
Reply With Quote
  #2  
Old 25/11/2010
Caro's Avatar
*Caro* Caro is offline
Moderadora
 
Join Date: Jul 2004
Location: 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.

Last edited by Caro : 25/11/2010 at 16:23.
Reply With Quote
  #3  
Old 25/11/2010
rruffino rruffino is offline
Miembro
 
Join Date: Dec 2004
Location: 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!!
Reply With Quote
  #4  
Old 26/11/2010
Caro's Avatar
*Caro* Caro is offline
Moderadora
 
Join Date: Jul 2004
Location: Cochabamba, Bolivia
Posts: 2,544
Poder: 22
Caro Va por buen camino
Quote:
Originally Posted by rruffino View Post
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.
Reply With Quote
  #5  
Old 26/11/2010
rruffino rruffino is offline
Miembro
 
Join Date: Dec 2004
Location: 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!
Reply With Quote
  #6  
Old 26/11/2010
Caro's Avatar
*Caro* Caro is offline
Moderadora
 
Join Date: Jul 2004
Location: Cochabamba, Bolivia
Posts: 2,544
Poder: 22
Caro Va por buen camino
Quote:
Originally Posted by rruffino View Post
.........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.
Reply With Quote
  #7  
Old 10/12/2010
rruffino rruffino is offline
Miembro
 
Join Date: Dec 2004
Location: 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!!
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Añadir componentes en tiempo de ejecución. Drakyto Varios 4 02/06/2007 19:29
Componentes que no se ven en tiempo de ejecución Alcolea Varios 3 11/09/2006 02:18
componentes en tiempo de ejecución Maga84 OOP 13 21/05/2005 19:49
Componentes en Tiempo de Ejecucion Caro Varios 2 16/05/2005 16:49
mover componentes en tiempo de ejecución Dantael OOP 3 06/02/2005 12:29


All times are GMT +2. The time now is 04:26.


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