Es posible "Refresh" de un form a otro?

He aquí una duda. Tengo un formulario "padre" que es para agregar registros de productos. Desde este, clickeando un botón, llamo a un formulario "hijo" que es unicamente para ver los registros de la tabla a través de un grid... Algo así como un "buscador-visualizador". Lo que quiero es poder dar doble click sobre el registro (en el grid) que deseo y al cerrar el form "hijo", que el form padre se desplace directamente al registro que seleccione. Si doy doble click en el form "hijo" a un registro y luego lo cierro, el form padre puede avanzar un registro más adelante o uno menos atrás que el seleccionado cuando uso los botones de desplazamiento. Lo que requiero es algo así como hacer un "REFRESH" del form "padre" al cerrar el form "hijo" para que así, actualice la posición del puntero en la tabla y me muestre el registro seleccionado! Me di cuenta que si se puede seleccionar el registro desde el grid.. Pero no se como mostrarlo actualizando la posición del puntero en la tabla! ¿Es posible esto?

1 Respuesta

Respuesta
1
La solución es la siguiente: En el evento click del botón en donde llamas el formulario escribes lo siguiente:
Local lcRegistro
Do Form "Ruta\FormHijo.scx" with .T. To lcRegistro
If Type("lcRegistro") == "N"
   Select Productos
   Go lcRegistro
   Thisform. Refresh()
Endif
En el evento Init del formulario hijo puedes escribir lo siguiente:
Parameters pMostrarForm
If !pMostrarForm
  =Messagebox("Este formulario no puede ejecutarse independientemente." 16, "Error")
  Return .F.
Endif
Agregas una propiedad al formulario hijo que se llame por ejemplo registro para hacer esto, en el menú formulario seleccionas nueva propiedad, aparece el cuadro de diálogo nueva propiedad, en el campo nombre escribes el nombre de la nueva propiedad, en este caso se llamará registro para efectos del ejemplo, opcionalmente puedes escribir un comentario sobre la propiedad en el campo descripción y haces clic en añadir y listo.
Luego en el evento dblclick del control grid del formulario escribes alguno de los siguientes códigos:
Thisform.Registro = Recno()
Thisform. Release()
O si tienes un botón de cerrar, en el evento clic de este debe ir el código de arriba y entonces en el evento dblclick del control grid escribes lo siguiente:
Thisform. Command1. Click() && Esto si la propiedad Name del botón es Command1.
Y por último en el evento unload del formulario hijo escribes el siguiente código:
Return This.Registro
Esa es una posible solución al problema.
Ignorar la última línea de la respuesta.
Gracias por su respuesta! Es muy amable Sr. Alonso. Creo que omití un detalle importante... el formulario "hijo" que es llamado desde el botón del formulario "padre", no es "invocado" usando DO FORM... puesto que no es parte del grupo de formularios de la pestaña form de administrador de proyectos...! Es un form creado a partir de un archivo .Prg! Entonces para llamarlo utilizo en el click del botón : DO consultarreg IN consultarregistros, por tanto, al tratar de escribir el código en click que usted me ha sugerido, da error en sintaxis! ¿Existe alguna manera de adecuarlo? Intente de varias formas.. pero siempre el error! Si no se puede, pues me gustaría saberlo para crear un form y abandonar el .prg! Gracias!
Para adecuar el prg por supuesto que la hay pero para mí es más complicado porque ignoro lo que está escrito en el código del prg, si gustas puedes enviarme el código o en su defecto crar el formulario y agregarlo al grupo de formularios.
Hola Sr. Alonso. Buenos días. Permítame agradecerle por la oportunidad de enviarle el código del Prg. En el botón del form padre, llamo al form hijo así: DO consultarreg IN consultarregistros. El código del Prg es el siguiente:
PROCEDURE consultarreg
PUBLIC fcons
fcons = CREATEOBJECT ("Form1")
fcons.Show(2)
DEFINE CLASS Form1 AS Form
Hight = 400
Width = 750
Backcolor = RGB(255,255,255)
Borderstyle = 1
Autocenter = .T.
Showwindow = 1
Visible = .T.
Name = "Form1"
**--------GRIDS------**
ADD OBJECT Grid1 AS GRID WITH ;
    Allowaddnew = .F., READONLY = .T., Top = 105, left = 8, enabled = .T., height = 170, width = 715
**------SALIR--------**
ADD OBJECT Command1 AS commandbutton WITH ;
    caption = "Salir", top = 30, left = 250, height = 23
**-Init del form**
PROCEDURE INIT()
SELECT productos
endproc
**Salir del Form***
PROCEDURE Command1.CLICK
thisform.release
endproc
enddefine
*****Fin del codigo****
********************
El problema se resuelve así:
Define Class FrmBuscar As Form
  Height = 400
  Width = 750
  Backcolor = RGB(255,255,255)
  Borderstyle = 2
  Autocenter = .T.
  DataSession = 2
  ShowWindow = 1
  Name = FrmBuscar
  Registro = 0
  Caption = "Buscar producto"
  Add Object GrdProductos AS Grid With ;
  Allowaddnew = .F., AllowCellSelection = .F., ReadOnly = .T.,;
  Top = 105, Left = 8, Height = 170, Width = 715
  Add Object CmdSalir As Commandbutton With;
  Caption = "Salir", Top = 30, Left = 150, Height = 23, Width = 84
  Add Object CmdCancelar As Commandbutton With;
  Caption = "Cancelar", Top = 30, Left = 245, Height = 23, Width = 84
  Procedure Init
    If !Used("Productos")
      Use Productos In 0
    Endif
    This.GrdProductos.RecordSourceType = 1
    This.GrdProductos.RecordSource = "Productos"
  Endproc   
  Procedure GrdProductos.DblClick
    Thisform.CmdSalir.Click()
  Endproc   
  Procedure CmdSalir.Click
    If !Eof()
      Thisform.Registro = Recno()
      Thisform. Hide()
    Endif
  Endproc
  Procedure CmdCancelar.Click
    Thisform. Hide()
  Endproc
Enddefine
Guardas el código anterior en un archivo que se llame frmBuscar. Prg en la carpeta de tu proyecto y lo agregas a tu proyecto.
Luego el evento click del botón en donde llamas el formulario escribes lo siguiente:
Local lcRegistro, lcFrmProd
lcFrmProd = NewObject("FrmBuscar")
lcFrmProd.Show()
lcRegistro = lcFrmProd.Registro
If lcRegistro > 0
   Select Productos
   Go lcRegistro
   Thisform. Refresh()
Endif
Con eso se soluciona el problema.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas