Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Creación/destrucción dinámica de forms; confirmar destrucción. (https://www.clubdelphi.com/foros/showthread.php?t=29289)

Jose_Pérez 18-01-2006 11:20:30

Creación/destrucción dinámica de forms; confirmar destrucción.
 
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...

Código Delphi [-]
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..

Código Delphi [-]
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:

Código Delphi [-]
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

Cita:

Empezado por Jose_Pérez
...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.
//------------------------------------------------------------------------


La franja horaria es GMT +2. Ahora son las 05:27:43.

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