| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 11 May, 2017 10:53 am Asunto: Borrar objetos creados dinámicamente |
|
|
En el OnCreate de un formulario, dependiendo del valor de una variable, creo de forma dinámica un TListView o un TRadioGroup así:
| Código: | void __fastcall TfCalEst::FormCreate(TObject *Sender)
{
if (mOpcMenu->Tag == 3 || mOpcMenu->Tag == 4)
{
Panel->Width = 300;
TListView *Lista = new TListView(Panel);
[...]
}
else
{
TRadioGroup *RadioGroup1 = new TRadioGroup(Panel);
[...]
}
} |
Esto, evidentemente, se ejecuta sin mayor problema. En un evento OnClick de un botón pido al usuario un dato para hacer unos cálculos; por ejemplo:
| Código: | void __fastcall TfCalEst::Button1Click(TObject *Sender)
{
try
{
switch (mOpcMenu->Tag)
{
case '1':
case '2':
if (!InputQuery(Application->Title, "Indique el número de años a considerar para la estadística.", cAux))
throw Exception("");
if (StrToIntDef(cAux, 0) < 1 || StrToIntDef(cAux, 0) > 5)
throw Exception("El valor introducido (" + cAux + ") es incorrecto.");
break;
case '3':
[...]
break;
case '4':
[...]
break;
}
}
catch(Exception &Exc)
{
if (!Exc.Message.IsEmpty())
Mensaje(1, Exc.Message, "Volver");
FormCreate(NULL);
return;
}
} |
Dado que si se produce una excepción se vuelve al OnCreate me interesaría en ese catch pudiera hacer un delete de los objetos que haya creado al lanzarse el módulo pero no se me ocurre como hacerlo. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Jue 11 May, 2017 4:43 pm Asunto: |
|
|
| Hola, Angel. Declare el componente como global que puede borrarlo. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 11 May, 2017 4:55 pm Asunto: |
|
|
Lo sé, y sé que es la solución más fácil. Pero el problema al compilar siempre me avisa que no existe el objeto y me preocupa que una de estas se me olvide por qué me da ese error, le de el OK a borrar las declaraciones y luego la líe.  _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 11 May, 2017 11:15 pm Asunto: |
|
|
Una opción es como te dice Felip, y otra es que le des un nombre único a los componentes que creas dinámicamente:
| Código: | TListView *Lista = new TListView(Panel);
Lista->Name = "miListView";
|
Y luego para destruirlos los buscas por el nombre, en este caso en "Panel" que es su propietario: | Código: | delete Panel->FindComponent("miListView"); |
|
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 12 May, 2017 8:18 am Asunto: |
|
|
| _Leo escribió: | Una opción es como te dice Felip, y otra es que le des un nombre único a los componentes que creas dinámicamente:
| Código: | TListView *Lista = new TListView(Panel);
Lista->Name = "miListView";
|
Y luego para destruirlos los buscas por el nombre, en este caso en "Panel" que es su propietario: | Código: | delete Panel->FindComponent("miListView"); |
|
¿Ves? El nombre único está pero ese código no se me había ocurrido. Voy a probarlo ahora mismo. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|