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-2005
jaime cotino jaime cotino is offline
Miembro
 
Registrado: ene 2004
Ubicación: Valencia
Posts: 25
Poder: 0
jaime cotino Va por buen camino
destruir objeto creado en tiempo de ejecucuión

Hola. Este codigo lo tengo en un form que pinchando en el botón me crea todos los objetos en él incluidos. Creo ahí mismo otro boton (miboton) que quiero que al pincharlo destruya todos los objetos. Así si los vuelvo a crear no me dará error. (Este codigo lo estaba probando para incluirlo en una aplicación pero como hay que crear los objetos y luego destruirlos si no los puedo destruir no me vale) Me sería de gran ayuda si indicais como destruirlos. He probado con free pero no me lo destruye o no se utilizarlo.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DB, DBTables, Grids, DBGrids, ExtCtrls, Buttons, Menus;


type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
BitBtn1: TBitBtn;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
procedure Img1Click(Sender: TObject);
procedure mibotonClick(Sender: TObject);

{ Private declarations }

public
gb :TPAnel;
{ Public declarations }
end;

var
Form1: TForm1;
bg :Tpanel;

implementation
procedure TForm1.Img1Click(Sender: TObject);
begin
showmessage('Hola');
{ Aquí el código que quieras que se ejecute al hacer click }
end;
procedure TForm1.mibotonClick(Sender: TObject);
begin
{ Aquí quiero que me elimine todos los objetos creados
que tengo que poner}
end;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
gb:TPanel;
p2:Tpanel;
p3 :TPanel;
lbl1:TLAbel;
img1 :TImage;
edt1:TEdit;
miboton :Tbutton;

begin
//crear Tpanel
gb := Tpanel.Create(Self);
gb.Parent := Self;
gb.Name := 'RunTimeGroupBox1';
gb.Top := 10;
gb.Left := 10;
gb.Height := 300;
gb.Width := 300;

p2 := TPanel.Create(gb);
p2.Parent := gb;
p2.name := 'panel2';
p2.caption := 'Lo has conseguido';
p2.Top := 1;
p2.Left := 1;
p2.Height := 80;
p2.width := 80;

// Crear tImage
img1 := TImage.create(p2);
img1.Parent := p2;
img1.Name := 'img1';
img1.Top := 1;
img1.Left := 1;
img1.Height := 70;
img1.Width := 70;
img1.picture.loadfromfile('c:\Imagenes\Siguiente.bmp');
img1.Align := AlTop;
img1.AutoSize := False;
img1.Stretch := true;
img1.OnClick := Img1Click;
//Img1.OnContextPopup := Img1ContextPopup;


//Panel dentro de panel
p3 := TPanel.Create(gb);
p3.Parent := gb;
p3.name := 'panel3';
p3.caption := 'Panel3';
p3.Top := 1;
p3.Left := 81;
p3.Height := 80;
p3.width := 80;

// Etiqueta
lbl1 := TLabel.Create(Form1);
lbl1.Parent := gb; // dentro del GroupBox
lbl1.Name := 'RunTimeLabel1';
lbl1.Top := 40;
lbl1.Left := 40;
lbl1.Width := 100;
lbl1.Caption := 'Etiqueta: ';

// Edit
edt1 := TEdit.CReate(Form1);
edt1.Parent := gb; // dentro del GroupBox
edt1.Name := 'RunTimeEdit1';
edt1.Top := 40;
edt1.Left := 160;
edt1.Width := 100;
Edt1.Text := 'Escriba aquí...';
//crear un boton
miboton := Tbutton.Create(Form1);
miboton.Parent := form1;
miboton.Name := 'mio';
miboton.Top := 270;
miboton.Left := 1;
miboton.Width := 100;
miboton.Height := 50;
miboton.OnClick := mibotonClick;
end;
Responder Con Cita
  #2  
Antiguo 28-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
El código publicado es imposible de leer!!.

Por favor, editá tu mensaje y usá la etiqueta [ delphi ] para este trozo de código. Si no sabes cómo usarla, podes leer el anuncio de las nuevas etiquetas disponibles de hace poco mas de un año!!

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 28-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Sin leer el código yo haría un par de comentarios al respecto de la pregunta.

1. Los objetos se destruyen con Free (punto) No hay muchas vueltas que darle a ésto con excepción de los formularios donde a veces conviene usar su método Release.

2. Como esta es la forma correcta de destruir un objeto tendrás que ser más específico en "Así si los vuelvo a crear no me dará error" (¿Qué error?) y en "He probado con free pero no me lo destruye o no se utilizarlo" (¿que razón tienes para asegurar que no los destruye? ¿De cuántas maneras se puede usar Objeto.Free como para pensar que uno no lo está usando correctamente?

// Saludos
Responder Con Cita
  #4  
Antiguo 28-06-2005
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Hola

Hola
Bueno pues yo me voy por el ámbito de las variables, si las variables están declaradas dentro del botón que las creas, como es posible que las quieras ver desde otro botón para destruirlas. Solución haz la declaración de las variables en la sesión private de la unit.
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

Responder Con Cita
  #5  
Antiguo 28-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por yusnerqui
Bueno pues yo me voy por el ámbito de las variables, si las variables están declaradas dentro del botón que las creas, como es posible que las quieras ver desde otro botón para destruirlas. Solución haz la declaración de las variables en la sesión private de la unit.
No estoy de acuerdo en este punto, puesto que las variables "objeto" en delphi son un puntero, y un objeto puede existir en memoria aún cuando no esté apuntado por ninguna variable.

En este caso particular, al tratarse de controles, aún cuando la variable utilizada para crearlo salga de ámbito, la forma guardará un puntero a dichos objetos en su propiedad controls, que es un arreglo, siendo perfectamente válido hacer algo como:

Código Delphi [-]
Procedure TForm1.Button1Click(sender : TObject);

Var
  b : TButton;

Begin
  b := TButton.Create(self);
  b.Parent := self;
  b.Caption := 'Prueba';
  //Aqui la variable sale de ámbito!
end;

Procedure TForm1.Button2Click(sender : TObject);

Begin
  // Destruye el último control asociado a la forma,
  // Si se ha pulsado el boton1, destruye el botón creado dinámicamente,
  // pero también puede destruir un control creado en tiempo de diseño.
  Controls[ControlCount - 1].Free;  
end;

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 28-06-2005
Avatar de yusnerqui
yusnerqui yusnerqui is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuba
Posts: 679
Poder: 21
yusnerqui Va por buen camino
Disculpa

Cita:
Empezado por jachguate
No estoy de acuerdo en este punto.
Pues quizás no me expliqué correctamente, dije que me iba por esa vía, no que no fuese posible por otra, además de lo que comentas tenemos la función FindComponent, que nos puede ayudar a ser más específico a la hora de destruirlos, esto es por si no sabemos en el orden en que se crearon.
Ejemplo
Código Delphi [-]
  FindComponent('NombreObjeto').Free

Saludos
__________________
Lo importante no es llegar primero, sino saber llegar.

Para que puedas llegar mejor lee la Guia de Estilo

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


La franja horaria es GMT +2. Ahora son las 19:20:02.


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