PDA

Ver la Versión Completa : Creación/destrucción dinámica de forms; confirmar destrucción.


Jose_Pérez
18-01-2006, 11:20:30
Hola a todos:

Tengo una aplicación (trabajo con Delphi 5) que lleva rodando algo más de un año. Después de chequear su funcionamiento, ayer me sorprendió con este mensaje de error: "A component named TfrmNombreForm already exists"·

He consultado el foro sobre la creación dinámica de formularios, y el método Free, y parece que todo mi código está en orden, al memos aparentemente. También he pasado los forms de "auto-create" a "available forms".

El FormStyle del form principal es fsMDIForm, y el del form "hijo" es fsNormal.

Así creo y muestro al firmulario...


procedure TfrmPrincipal.AltasdeValesClick(Sender: TObject);
var
Form: TfrmAltasVales;
begin
Form:=TfrmAltasVales.Create(Self);
With Form Do
Begin
Height:=436;
Width:=786;
ShowModal;
End;
end;


Y en el evento OnClose del formulario lo destruyo..


procedure TfrmAltasVales.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
end;


Como veis, todo parece ser correcto. Insisto en que la aplicación lleva más de un año rodando y nunca antes se me había presentado este error. De todos modos hace días que el sistema operativo (Windows 2000) está fallando. No obstante, me gustaría saber si hay algún modo de comprobar si los formularios "realmente" se han destruido.

Gracias.

Neftali [Germán.Estévez]
18-01-2006, 11:40:36
Si es formulario va a ser modal, puedes cambiar el codigo por éste:


var
Form: TfrmAltasVales;
begin
Form:=TfrmAltasVales.Create(Self);
// proteccion
try
With Form Do
Begin
Height:=436;
Width:=786;
ShowModal;
End;
finally
FreeAndnil(Form);
end;


Y en el close utilizar caNone;

Supongo que tu problema viene, porque debido a algun fallo entre la creación y la destrucción el formulario, éste no se ha destuído realmente. Creo que de esta forma podrás asegurarlo.

Jose_Pérez
18-01-2006, 12:08:50
Gracias Neftali. Voy a probarlo.

Un apunte: supongo que utilizar caNone es equivalente a no poner nada. ;)

Neftali [Germán.Estévez]
18-01-2006, 12:32:13
...supongo que utilizar caNone es equivalente a no poner nada.

Directamente de la ayuda de Delphi:

//------------------------------------------------------------------------
If a form is an MDI child form, and its BorderIcons property is biMinimize, then the default Action is caMinimize. If a MDI child form does not have these settings, the default Action is caNone...
If a form is an SDI child form, Action defaults to caHide.
//------------------------------------------------------------------------