Delphi--error-1400-identificador-ventana-no-válido
Me salta en tiempo de ejecución el siguiente error : Código de Error 1400, El identificador de ventana no es válido.
Mi aplicación básicamente consta de 2 elementos un TreeView que uso a modo de menu y PageControl donde muestro los formularios que se corresponden con elementos del menu del árbol.
El error que comento solo me salta cuando salgo de la aplicación, antes de hacer unas correcciones en el código me saltaba siempre que cerraba un formulario de los que creo en tiempo de ejecución y para eso no me sucedía con todos los formularios, solo con los que tenían elementos que se creaban en tiempo de ejecución.
Antes de nada uso Delphi 7.
En el formulario principal los trozos de código que tienen que ver con el error o por lo menos lo que yo creo que son:
El procedimiento que muestra el formulario en el pageControl
El procedimiento que elimina el formulario del PageControl
El procedimiento que crea el formulario en cuestión
El procedimiento que destruye el formulario
Para mostrar un formulario en el pagecontrol uso el siguiente código
procedure TForm1.AnadirFormAPestana( Form : TForm ; Titulo : String );
var
lPestana : TTabSheet;
begin
// creo la pestaña
lPestana := TTabSheet.Create(nil);
// Asigno la pestaña al page Control
lPestana.PageControl := PageControl1;
// Le pongo un titulo a la pestaña
lPestana.Caption := Titulo;
// Selecciono la pestaña que acabo de crear
PageControl1.ActivePage := lPestana;
// Hago que la pestaña sea visible
lPestana.Visible := true;
// Asigno el formulario a la pestaña
Form.ParentWindow := lPestana.Handle;
// Hago visible el formulario
Form.Visible := true;
// Posiciono el formulario en la pestaña
form.Top := 0;
form.Left := 0;
// Elimino los bordes del formulario
form.BorderStyle := bsNone; // Quita los bordes la ventana del formulario
// Asigno el color de fondo al formulario
form.Color := EsquemaBBDD.Color;
// Registro la acccion en el log
gREgistro.Log(T_TRA,now,'Abriendo Formulario :' + Titulo);
end;
Para eliminar el formulario del pagecontrol
procedure TForm1.EliminarPestana;
begin
// Registro la accion en el log
gREgistro.Log(T_TRA,now,'Cerrando Formulario : ' + PageControl1.ActivePage.Caption + ' ...');
// Elimino la pestaña activa
PageControl1.Pages[PageControl1.ActivePageIndex].Destroy;
end;
Para crear el formulario desde el menu (treeview)
if gMenu.Arbol.Selected = gMenu.NodoBaseDatos then
begin
// Creo el formulario
FormOrigenDatos := TFrmOrigendeDatos.Create(nil);
// Asigno el procedimiento de eliminar pestaña al evento de cerrar formulario
FormOrigenDatos.onCerrarFormulario := EliminarPestana;
// Asigno procedimiento de Aceptar conexion al evento Aceptar Conexion
FormOrigenDatos.onAceptarConexion := AceptarOrigenDatos;
// Inicializo el formulario
FormOrigenDatos.Iniciar_Formulario;
// Añado el formulario al PageControl
AnadirFormAPestana(FormOrigenDatos,'Origen de Datos');
end;
ESte código ya va dentro del código del formulario que es el que uso para cerrarlo
procedure TFrmOrigendeDatos.Button1Click(Sender: TObject);
begin
// Si el evento esta asignado ejecutar lo ss
if assigned(fonCerrarFormulario) then
begin
// Libero la memoria del componente OpenDialog
FreeAndNil(OpenDialog1);
CleanupInstance;
Destroy;
// Lanzo el evento de cerrar Formulario
fonCerrarFormulario;
end;
end;
Hace una semana o así no había puesto la lineas que aparecen en negrita y el error me saltaba cuando cerraba el formulario en cuestión, pero ahora me salta el error cuando cierro la aplicación. Este error solo me salta cuando se trata de un formulario que crea algún componente en tiempo de ejecución como puede ser un TEdit, TComboBox, etc en el ejemplo un OpenDialog, pero esto me sucede con el resto de formularios que he creado y les añado algo en tiempo de ejecución.
Mi aplicación básicamente consta de 2 elementos un TreeView que uso a modo de menu y PageControl donde muestro los formularios que se corresponden con elementos del menu del árbol.
El error que comento solo me salta cuando salgo de la aplicación, antes de hacer unas correcciones en el código me saltaba siempre que cerraba un formulario de los que creo en tiempo de ejecución y para eso no me sucedía con todos los formularios, solo con los que tenían elementos que se creaban en tiempo de ejecución.
Antes de nada uso Delphi 7.
En el formulario principal los trozos de código que tienen que ver con el error o por lo menos lo que yo creo que son:
El procedimiento que muestra el formulario en el pageControl
El procedimiento que elimina el formulario del PageControl
El procedimiento que crea el formulario en cuestión
El procedimiento que destruye el formulario
Para mostrar un formulario en el pagecontrol uso el siguiente código
procedure TForm1.AnadirFormAPestana( Form : TForm ; Titulo : String );
var
lPestana : TTabSheet;
begin
// creo la pestaña
lPestana := TTabSheet.Create(nil);
// Asigno la pestaña al page Control
lPestana.PageControl := PageControl1;
// Le pongo un titulo a la pestaña
lPestana.Caption := Titulo;
// Selecciono la pestaña que acabo de crear
PageControl1.ActivePage := lPestana;
// Hago que la pestaña sea visible
lPestana.Visible := true;
// Asigno el formulario a la pestaña
Form.ParentWindow := lPestana.Handle;
// Hago visible el formulario
Form.Visible := true;
// Posiciono el formulario en la pestaña
form.Top := 0;
form.Left := 0;
// Elimino los bordes del formulario
form.BorderStyle := bsNone; // Quita los bordes la ventana del formulario
// Asigno el color de fondo al formulario
form.Color := EsquemaBBDD.Color;
// Registro la acccion en el log
gREgistro.Log(T_TRA,now,'Abriendo Formulario :' + Titulo);
end;
Para eliminar el formulario del pagecontrol
procedure TForm1.EliminarPestana;
begin
// Registro la accion en el log
gREgistro.Log(T_TRA,now,'Cerrando Formulario : ' + PageControl1.ActivePage.Caption + ' ...');
// Elimino la pestaña activa
PageControl1.Pages[PageControl1.ActivePageIndex].Destroy;
end;
Para crear el formulario desde el menu (treeview)
if gMenu.Arbol.Selected = gMenu.NodoBaseDatos then
begin
// Creo el formulario
FormOrigenDatos := TFrmOrigendeDatos.Create(nil);
// Asigno el procedimiento de eliminar pestaña al evento de cerrar formulario
FormOrigenDatos.onCerrarFormulario := EliminarPestana;
// Asigno procedimiento de Aceptar conexion al evento Aceptar Conexion
FormOrigenDatos.onAceptarConexion := AceptarOrigenDatos;
// Inicializo el formulario
FormOrigenDatos.Iniciar_Formulario;
// Añado el formulario al PageControl
AnadirFormAPestana(FormOrigenDatos,'Origen de Datos');
end;
ESte código ya va dentro del código del formulario que es el que uso para cerrarlo
procedure TFrmOrigendeDatos.Button1Click(Sender: TObject);
begin
// Si el evento esta asignado ejecutar lo ss
if assigned(fonCerrarFormulario) then
begin
// Libero la memoria del componente OpenDialog
FreeAndNil(OpenDialog1);
CleanupInstance;
Destroy;
// Lanzo el evento de cerrar Formulario
fonCerrarFormulario;
end;
end;
Hace una semana o así no había puesto la lineas que aparecen en negrita y el error me saltaba cuando cerraba el formulario en cuestión, pero ahora me salta el error cuando cierro la aplicación. Este error solo me salta cuando se trata de un formulario que crea algún componente en tiempo de ejecución como puede ser un TEdit, TComboBox, etc en el ejemplo un OpenDialog, pero esto me sucede con el resto de formularios que he creado y les añado algo en tiempo de ejecución.
1 respuesta
Respuesta de osirisseth
1