1) Usa WindowType=1 solamente si querés detener los procesos hasta que se resuelva el tema del Form en WindowType=1.
2) En el caso que planteas, probablemente se hubiera resuelto mejor con un Conjunto de Formularios. Pero si no te gusta (a mí no me gusta), tendrás que resolver el tema de otra forma.
2.1) No informas cómo y dónde se convoca a formulario hijo. La primera vez de tu última prueba se pasa por alto el foco, lo que sugiere que el formulario se lanza desde (o antes) del evento Init.
En el evento init del Formulario padre, podés incorporar dos propiedades
Thisform.Addproperty("gaMatriz[1]")
Thisform.Addproperty("IsInit",.t.)
En en el Evento Activate del formulario padre
if Thisform.IsInit
do form fhijo NAME Thisform.gaMatriz[1] LINKED
* si tengo que lanzar otros hijos
ndim=alen(thisform.gamatriz)
do form fHijo2 name thisform.gamatriz[ndim] LINKED
DIMENSION Thisform.gaMatriz(ndim+1)
*
thisform.IsInit=.f.
endif
Thisform.IsInit es una bandera para evitar que se vuelvan a lanzar los formularios que convoquemos en Activate cade vez que el formulario recibe foco.
Si quieres hacer algo fácil, podés poner en el formulario padre un botón falso, que debe tener el foco en primer orden, que debe estar Enabled=.t., Visible=.t.. En el código de GotFocus ponés
release fhijo
public fhijo
Do Form FormularioHijo NAME fHijo LINKED
this.visible=.f.
Si necesitas controlar algo del formulario hijo desde el padre, probablemente debas asignar una variable pública a la creación del formulario hijo en lugar del array.
Release ofMijo
public ofMijo
Do form Formulariohijo NAME ofMijo LINKED
Ahora, el formulario hijo se llama ofMijo. La única precaución es que en el Destroy del formulario padre, hay que agregar este código:
Release ofMijo (con lo que se cierra el formulario hijo al cerrar el padre).