Sólo aportar un detalle que me parece importante:
Código Delphi
[-]
procedure TForm1.button1click(Sender:TObject);
begin
Form2 := TForm2.Create(Self),
Form2.Show;
end;
1 - Si cierras el Form1, se cierra automáticamente el Form2.
2 - Si Form2 ya estaba creado
previamente, estás teniendo fugas de memoria, (lo que llamamos memory leak) ya que estás creando un TForm2 nuevo, pero asignándolo a la variable global "Form2"
Al ser ventanas MDICHILD se complica aún más porque, como dices, puede crearse la ventana Form2 desde varios sitios.
Hay soluciones elegantes y otras no tanto, no sé cual quieres utilizar:
- la "elegante": usar herencia visual creando una ventana base y métodos genéricos que pueden llamarse desde cualquier ventana del mismo tipo.
- La simple: comprobar que "Form2 = nil" antes de crear la ventana y al tiempo de cerrarla, poner esa variable a nil (en el Form2.Close).
Saludos