Sí ese estilo en el que las ventanas de conexión estan dentro de un Main Form, este es un pequeño manual de como lograr ese "efecto".
Comenzamos con un proyecto estándar (Solo abran Delphi)
Les aparecera un Form por Default. (En este caso hice pequeño en Form para obtener imagenes pequeñas) Configuramos la propiedad "FormStyle" en "fsMDIForm" como en la imagen, también pueden cambiar el color de fondo pero bueno eso es decisión propia. (No es necesario establecer todos los valores tal cual se muestra en la imagen solo los antes descritos). Ahora ya tenemos nuestro MainForm el contenedor de los demás formularios.
Es hora de crear los hijos, vamos a File>New..>Form
Este nuevo formulario le establecemos el "FormStyle" en "fsMDIChild" llamado ChildForm, en este punto pueden compilar y ejecutar el proyecto y aparecerá algo así Obviamente le he adornado un poco pero ya tenemos nuestro contenedor y el ChildForm dentro, cabe destacar que el MainForm solo puede contener Menús y StatusBar; ahora nos falta poder abrir multiples instancias del mismo formulario.
Eso se arregla con código...
Añadimos un TMainMenu y creamos un menú, configurenlo como quieran; nombre, texto, etc.
En evento OnClick del menú creado ponemos lo siguiente:
Código: Seleccionar todo
procedure TfrmMain.mnClienteClick(Sender: TObject);
var NewForm: TfrmCliente;
begin
NewForm := TfrmCliente.Create(Application);
end;
Creamos una nueva instancia del ChildForm, le pasamos como parámetro la variable Application pues ella contiene todos los datos del proceso.
Lo vuelve a ejecutar y les abre un nuevo formulario cuando dan click, pero ¿como los identificar o controlar?
Para ello nuestro MainForm tiene un array de MDIChild que controla conforme se abren o se cierran formularios dentro de él.
Podemos poner una variable en las declaraciones públicas de la clase del ChildForm para identificar.
Código: Seleccionar todo
TfrmCliente = class(TForm)
//Componentes del formulario
private
//Declaraciones privadas
public
ID: Integer; //El identificador del formulario
end;
Código: Seleccionar todo
If (Self.MDIChildren[1] as TfrmCliente).ID = 0 then (Self.MDIChildren[1] as TfrmCliente).Close;
Ahora un inconveniente si tratamos de cerrar un formulario dentro del MainForm solo se minimiza pero no lo necesitamos...
Eso se resuelve facilmente, en el evento OnClose del ChildForm establecemos la Accion para que libere la instancia.
Código: Seleccionar todo
procedure TfrmCliente.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Saludos!