Hay un problema que es que en lo que envías no se vé cómo es que convocas al FrmConsultar. Si FrmConsultar es ese form vacío que está entre lo remitido, significa que piensas hacerlo en el diseñador de form, y por lo tanto, tendrás que llamarlo
do form ..\frmConsultar NAME thisform.frmConsultar
Por qué "Name" ?
Bien, el nombre de formulario que pones en el diseñador de form, en el item Name, se utiliza como nombre real del formulario solamente si lanzas do form desde el menú (Command) ó desde la ventana de comandos. Desde cualquier procedimiento (incluso, procedure de menú), el formulario asumirá un nombre interno. Esto significa que cuando intente hacer referencia al Name del formulario dará un error.
La cláusula NAME logra convertir una variable, o una propiedad de un formulario o del screen en una referencia de objeto, similar a:
objForm=CreateObject("FORM")
En este caso, el formulario creado no tiene nombre, ni te interesa que lo tenga. Para el sistema se lo conocerá como objForm. Así que puedes poner
with objForm
.top=5
.Left=5
.Caption="Soy un formulario CreateObject"
.Visible=.t.
endwith
Alternativas:
1) Si el formulario FrmConsultar tendrá por objeto una búsqueda y cerrarse, tal vez convenga que sea WindowType=1 (Modal) y entonces no necesitas Name para nada.
2) Si el formulario FrmConsultar quedará abierto y oculto (como parce que piensas hacer), entonces debes convocarlo en alguna parte, antes de convocar al Form1, o en el Load del form1, o en el Activate del form1 si es que quieres que tenga el foco al iniciar. En este caso:
DO FORM ..\\FrmConsultar NAME Thisform.FrmConsultar NOSHOW
Luego cuando lo quieres usar:
thisform.FmrConsultar.Show()
En el DownLoad del form, deberás poner:
Thisform.FrmConsultar.release
Si cierras el formulario Form1, el FrmConsultar no será accesible por Thisform.FrmConsultar ya que Thisform habrá desaparecido. Tienes dos alternativas para controlar esto:
1) Definir el formulario con una variable pública o de _Screen
2) Capturar el formulario por _Screen.FormCount y _Screen.aforms(), lo que puede ser un tanto confuso.
Ahora bien:
Public oFrmConsultar
do form ..\frmConsultar NAME oFrmConsultar LINKED NOSHOW
Esto hace que tu formulario FrmConsultar se accesible con la variable oFrmConsultar (que es una referencia de objeto, en este caso) con independencia de si abres o cierras un formulario cualquiera y con independencia de dónde abres el formulario FrmConsultar.
Tu decides, pero debes actuar en forma coordinada.