Puedes cerrar el formulario llamador desde el mismo lugar donde muestras al segundo formulario. Por ejemplo:
procedure TForm4.Button1Click(Sender: TObject);
begin
Form5.Show; // Muestra el formulario Form5 en modo asíncrono (la ejecución continúa)
Close; // Cierra el formulario Form4
end; // recién después que termine este evento el usuario podrá editar en Form5
Si quieres una solución más elegante, el formulario llamado puede tener un método público Mostrar que reciba el llamador como parámetro:
procedure TForm5.Mostrar(Llamador: TForm);
begin
Show; // Muestra el formulario Form5 en modo asíncrono (la ejecución continúa)
if Llamador <> nil then Llamador.Close; // Cierra el formulario llamador
end;
Entonces la llamada para mostrar al formulario ahora sería:
procedure TForm4.Button1Click(Sender: Tobject);
begin
Form5.Mostrar(Self); // Muestra el formulario Form5 y cierra este formulario
end;
En los ejemplos he estado asumiendo que el formulario llamado ya está creado. Si los formularios llamados se crean dinámicamente, entonces tal vezn en lugar del método mostrar sería más adecuado pasar el formulario llamador como parámetro al constructor.
Es importante que notes que cuando el formulario principal se cierra, la aplicación finaliza. No recuerdo muy bien como era, pero creo que la solución consistía en usar un formulario principal que se hacía invisible con la API de Windows, de modo que el componente todavía crea que está visible, y entonces no termine la aplicación. Tendrías que buscar ese truco en la red.
Espero que mis comentarios te resulten de utilidad.
Ernesto D'Spirito
http://www.latiumsoftware.com/es/index.php