Ir al contenido


Foto

Crear Componentes en tiempo de ejecucion.


  • Por favor identifícate para responder
10 respuestas en este tema

#1 Caral

Caral

    Advanced Member

  • Administrador
  • 4.255 mensajes
  • LocationCosta Rica

Escrito 15 noviembre 2008 - 09:22

Hola
Vamos a crear algunos componentes en ejecución, paso a paso.
Primero definimos que componentes usaremos, esto lo colocaremos como una variable general.


delphi
  1. var
  2.   Form1:      TForm1;
  3.   PCInformacion: TPageControl;
  4.   DTPFecha:  TDateTimePicker;
  5.   Hoja1, Hoja2: TTabSheet;
  6.   DataSource: TDataSource;
  7.   DBGDatos:  TDBGrid;
  8.   Button1: TButton;
  9.   Panel: TPanel;
  10. implementation



Ahora en el evento Oncreate del form crearemos los componentes.



delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   PCInformacion := TPageControl.Create(Self);
  4.   with PCInformacion do
  5.   begin
  6.     Parent := Form1;
  7.     Align  := AlClient;
  8.   end;
  9.   Hoja1 := TTabSheet.Create(PCInformacion);
  10.   with Hoja1 do
  11.   begin
  12.     PageControl := PCInformacion;
  13.     Caption    := 'Hola Mundo';
  14.     DTPFecha    := TDateTimePicker.Create(Self);
  15.     DBGDatos    := TDBGrid.Create(Self);
  16.     DataSource  := TDataSource.Create(Self);
  17.     Button1:= TButton.Create(Self);
  18.     DTPFecha.Parent := Hoja1;
  19.     DBGDatos.Parent := Hoja1;
  20.     DBGDatos.Top:= 48;
  21.     Button1.Parent := Hoja1;
  22.     Button1.Left:= 5;
  23.     Button1.Top:= 200;
  24.     Button1.OnClick := OnButton1Click;
  25.     Button1.Caption:= 'Hola';
  26.  
  27.   end;
  28.   Hoja2 := TTabSheet.Create(PCInformacion);
  29.   with Hoja2 do
  30.   begin
  31.     PageControl := PCInformacion;
  32.     Caption    := 'Hola Mundo en la Hoja 2';
  33.  
  34.   end;
  35. end;



Veremos un ejemplo del uso, en este caso con el boton que creamos.

Primero creamos el procedimiento.



delphi
  1. type
  2.   TForm1 = class(TForm)
  3.     procedure FormCreate(Sender: TObject); // este lo creo delphi
  4.     procedure OnButton1Click(Sender: TObject); // este es el que creamos.
  5.     procedure FormDestroy(Sender: TObject); // este lo creamos
  6.   private
  7.     { Private declarations }
  8.   public
  9.     { Public declarations }
  10.   end;



Ahora creamos la acción de ese procedimiento.



delphi
  1. procedure TForm1.OnButton1Click(Sender: TObject);
  2. begin
  3.   ShowMessage('Presionaste el boton 1!');
  4.   with Hoja1 do
  5.   begin
  6.   Panel    := TPanel.Create(Self);
  7.   Panel.Parent := Hoja1;
  8.   Panel.Height:= 161;
  9.   Panel.Width:= 220;
  10.   Panel.Left:= 264;
  11.   Panel.Top:= 264;
  12.   Panel.Caption:= 'Hola que tal';
  13.   end;
  14. end;



Por ultimo un dato importante, destruir los componentes al salir del form.



delphi
  1. procedure TForm1.FormDestroy(Sender: TObject);
  2. begin
  3.   DTPFecha.Free;
  4.   Hoja1.Free;
  5.   Hoja2.Free;
  6.   PCInformacion.Free;
  7. end;



Hay que tener en cuenta que hay que añadirle al uses los unit que se necesitaran, en este caso:



delphi
  1. ComCtrls, DB, DBGrids, StdCtrls, ExtCtrls



Osea quedara asi:



delphi
  1. uses
  2.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  3.   Dialogs, ComCtrls, DB, DBGrids, StdCtrls, ExtCtrls;




Si tenéis dudas, podéis crear un hilo y os ayudaremos con gusto.
Saludos
  • 0

#2 Caral

Caral

    Advanced Member

  • Administrador
  • 4.255 mensajes
  • LocationCosta Rica

Escrito 02 diciembre 2008 - 01:05

Hola
Viendo un comentario me di cuenta de que la explicación no estaba completa (totalmente detallada).
He arreglado los detalles que faltaban, ya esta listo.
Saludos
PD: Por si queda alguna duda de que funciona perfectamente y no va a explotar dejo el codigo. :D :D

[archivo adjunto borrado por el administrador]
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.286 mensajes
  • LocationArgentina

Escrito 02 diciembre 2008 - 01:22

Hola Carlos, si me lo permites, quisiera añadir que cuando uno crea componentes en ejecución debe establer dos cosas fundamentales para evitar problemas:
1. Definir el dueño (Owner). Cuando uno crea el componente, necesita pasarle como parámetro el objeto dueño. Esto indica que cuando el el dueño se libere, invoce a la orden de liberar los objetos que dependen del mismo.
Es decir que cuando uno hace:



delphi
  1. Control := TControl.Create(nil);


Está indicando que nosostros asumimos cuando y donde liberar la variable Control.
En cambio el hacer:



delphi
  1. Control := TControl.Create(self);


Le indicamos que es el mismo objeto quien se liberará.

2. Definir quien es el padre (Parent).
Cuando hacemos algo como esto:


delphi
  1. TLabel.Parent := form1;



Estamos indicando que el Padre del Label es el form1.

El Padre no necesariamente debe ser el dueño. El Padre, simplemente indica a que componente se relaciona. Y de éste modo es posible que los controles hijos hereden el "estilo" del padre. Por ejemplo, un Panel, y un Form. Si la propiedad ParentColor del TPanel es TRUE, el panel heredará el mismo color que se le asigne al form con el que esté relacionado.

Espero que este aporte, si bien minúsculo, sirva para comprender más el tema.

Saludos,
  • 0

#4 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 02 diciembre 2008 - 03:44

Este tutorial no debe faltar en ningún foro  :D
Gracias por el aporte  (y)
  • 0

#5 memofer

memofer

    Member

  • Miembros
  • PipPip
  • 32 mensajes

Escrito 12 febrero 2013 - 06:46

Hola
Vamos a crear algunos componentes en ejecución, paso a paso.
Primero definimos que componentes usaremos, esto lo colocaremos como una variable general.


delphi
  1. var
  2.   Form1:      TForm1;
  3.   PCInformacion: TPageControl;
  4.   DTPFecha:  TDateTimePicker;
  5.   Hoja1, Hoja2: TTabSheet;
  6.   DataSource: TDataSource;
  7.   DBGDatos:  TDBGrid;
  8.   Button1: TButton;
  9.   Panel: TPanel;
  10. implementation



Ahora en el evento Oncreate del form crearemos los componentes.



delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3.   PCInformacion := TPageControl.Create(Self);
  4.   with PCInformacion do
  5.   begin
  6.     Parent := Form1;
  7.     Align  := AlClient;
  8.   end;
  9.   Hoja1 := TTabSheet.Create(PCInformacion);
  10.   with Hoja1 do
  11.   begin
  12.     PageControl := PCInformacion;
  13.     Caption    := 'Hola Mundo';
  14.     DTPFecha    := TDateTimePicker.Create(Self);
  15.     DBGDatos    := TDBGrid.Create(Self);
  16.     DataSource  := TDataSource.Create(Self);
  17.     Button1:= TButton.Create(Self);
  18.     DTPFecha.Parent := Hoja1;
  19.     DBGDatos.Parent := Hoja1;
  20.     DBGDatos.Top:= 48;
  21.     Button1.Parent := Hoja1;
  22.     Button1.Left:= 5;
  23.     Button1.Top:= 200;
  24.     Button1.OnClick := OnButton1Click;
  25.     Button1.Caption:= 'Hola';
  26.  
  27.   end;
  28.   Hoja2 := TTabSheet.Create(PCInformacion);
  29.   with Hoja2 do
  30.   begin
  31.     PageControl := PCInformacion;
  32.     Caption    := 'Hola Mundo en la Hoja 2';
  33.  
  34.   end;
  35. end;



Veremos ...
Si tenéis dudas, podéis crear un hilo y os ayudaremos con gusto.
Saludos


Caral eres excelente!!
Gracias por tus enseñanzas, en mi caso, yo si soy siempre un novato, tu no!
Bueno solo un consulta;
¿como podría generar varios panels dentro de un panel, con solo presionar una tecla?
pero que a su vez pudiera eliminarlos dándole doble click a cada panel que se auto genera con un botón.
si pudieras darme una pequeña orientación, te lo agradeceré enormemente!
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 13 febrero 2013 - 05:55

¿como podría generar varios panels dentro de un panel, con solo presionar una tecla?
pero que a su vez pudiera eliminarlos dándole doble click a cada panel que se auto genera con un botón.
si pudieras darme una pequeña orientación, te lo agradeceré enormemente!


Arrastra un botón y un TPanel a tu form, al TPanel pone el nombre de PanelPadre, agrega el código para el evento onClick del Button1, cada que hagas click en el botón se creará un nuevo panel, sobre el panel padre, cada panel traerá su botón, que al hacer click en dicho botón destruirá el correspondiente Panel.


delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ExtCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     PanelPadre: TPanel;
  13.     procedure Button1Click(Sender: TObject);
  14.     procedure FormCreate(Sender: TObject);
  15.   private
  16.   FLeft:Integer;
  17.     procedure DestruirPanel(Sender: TObject);
  18.   public
  19.     { Public declarations }
  20.   end;
  21.  
  22. var
  23.   Form1: TForm1;
  24.  
  25. implementation
  26.  
  27. {$R *.dfm}
  28.  
  29. procedure TForm1.Button1Click(Sender: TObject);
  30. var
  31.   Panel: TPanel;
  32.   Boton: TButton;
  33. begin
  34.   Panel := TPanel.Create(self);
  35.   Panel.Parent := PanelPadre;
  36.   Panel.Top := 100;
  37.   Panel.Left := FLeft ;
  38.   Panel.Width :=100;
  39.   Panel.Height := 200;
  40.  
  41.   // botón
  42.   Boton := TButton.Create(Panel);
  43.   Boton.Parent := Panel;
  44.   Boton.Top := 10;
  45.   Boton.Left := 10;
  46.   Boton.Width := 80;
  47.   Boton.Height :=30;
  48.   Boton.Caption := 'Destruir panel';
  49.   Boton.OnClick := DestruirPanel;
  50.  
  51.   //Incremento el left para el próximo panel
  52.   FLeft := Fleft +100
  53. end;
  54.  
  55. procedure TForm1.DestruirPanel(Sender: TObject);
  56. begin
  57.   TButton(Sender).Parent.FreeAndNil;
  58. end;
  59.  
  60. procedure TForm1.FormCreate(Sender: TObject);
  61. begin
  62. FLeft := 0;
  63. end;
  64.  
  65. end.


  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 13 febrero 2013 - 07:38

Sólo un detalle, amigo Wilson, mejor usar el método Free que Destroy, y mejor aun el procedimiento FreeAndNil

Nos leemos

  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 13 febrero 2013 - 08:04

Sólo un detalle, amigo Wilson, mejor usar el método Free que Destroy, y mejor aun el procedimiento FreeAndNil

Nos leemos


Gracias por la observación amigo Cadetill;  (y)

PD: He corregido la línea en cuestión, en el ejemplo del post anterior.
  • 0

#9 memofer

memofer

    Member

  • Miembros
  • PipPip
  • 32 mensajes

Escrito 13 febrero 2013 - 10:43

Wilson

Muchas gracias!!!!

Estaba haciendo todo lo que me pusiste, pero no compredia que debia liberar(Free) de acuerdo a quien esta siendo el padre osea que me faltaba esta linea



delphi
  1. TButton(Sender).Parent.FreeAndNil;



y que amablemente me lo hiciste saber.

  • 0

#10 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 13 febrero 2013 - 11:38

jejeje, FreeAndNil no es un método, es una procedimiento :)



delphi
  1. FreeAndNil(TButton(Sender).Parent)


  • 0

#11 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 13 febrero 2013 - 12:08

jejeje, FreeAndNil no es un método, es una procedimiento :)



delphi
  1. FreeAndNil(TButton(Sender).Parent)



:D :D :D Que pena con la visita,  es de esos días en que uno escribe las cosas por escribir, y eso que FrreAndNil lo usamos frecuentemente, se me cruzó con Free.
Mil disculpas por todos los perjuicios causados.  :D :D

Un cordial saludo
  • 0