FoxPro/Visual FoxPro - Boton Cerrar

   
Vista:

Boton Cerrar

Publicado por Jose (48 intervenciones) el 16/01/2014 22:00:25
Hola, alguien me puede decir que debo hacer para que al precionar el boton CERRAR, osea el que esta al lado de maximizar. Se cierre la aplicacion (.exe) completamente, y no se quede ejecutando en los PROCESOS del administrador de windows.
Estuve inventigando y vi algo sobre colocar un Quit en el evento Unload o Destroy, y funciona. El problema con este metodo es que cuando intento cambiar de un formulario a otro formulario mediante el MENU, se cierra la aplicacion completamente y por lo tanto no me ejecuta el formulario que intente acceder.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Boton Cerrar

Publicado por Vilchez (20 intervenciones) el 16/01/2014 23:06:25
el quit debes ponerlo en el cierre de la aplicacion, no de un formulario, a menos que tu apliacion tenga un formulario principal ira en ese
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Boton Cerrar

Publicado por Jose (48 intervenciones) el 16/01/2014 23:13:41
Tengo el quit en el programa princial. Y aun asi sigue el problema. Observa:
1
2
3
4
5
6
7
_screen.Visible = .F.
 SET TALK OFF
CLEAR
SET DEFAULT TO "C:\proyecto"
DO FORM Caja
READ events
QUIT
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Boton Cerrar

Publicado por Vilchez (20 intervenciones) el 17/01/2014 15:22:51
yo lo pondria en Destroy del form Caja
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Boton Cerrar

Publicado por Fidel José (558 intervenciones) el 17/01/2014 16:26:01
Lo mejor es poner un rutina de limpieza y cierre en un prg (generalmente en main.prg)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
************************
PROCEDURE Chau()
************************
* cERRAR FORMULARIOS
LOCAL lni
FOR m.lnI = _SCREEN.FORMCOUNT TO 1 STEP -1
	_SCREEN.FORMS(m.lnI).RELEASE
ENDFOR
* CERRAR TABLAS Y DBC
CLOSE DATABASES all
* LIMPIEZA
ON SHUTDOWN
SET CLASSLIB TO
SET PRINTER TO
CLOSE ALL
* DELETE FILE &DTEMP\*.* Limpieza de temporales (opcional)
CLEAR EVENTS
* DELETE FILE *.FKY            Limpieza de archivos para macros (raramente se usan) (opcional)
SET PROCEDURE TO
SupMenu = 0
 
QUIT
ENDPROC

En el main prg del sistema cambia el quit por On ShutDown
1
2
3
4
5
6
7
8
_screen.Visible = .F.
 SET TALK OFF
CLEAR
SET DEFAULT TO "C:\proyecto"
ON SHUTDOWN DO CHAU
DO FORM Caja
READ events
* QUIT

En el QueryUnload del formulario principal
1
2
3
4
5
6
local nMess
nMess=MESSAGEBOX("Desea cerrar este programa",4,"Cierre")
IF nMess#6
	NODEFAULT
	RETURN
ENDIF

En el Unload del formulario principal
Chau()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Boton Cerrar

Publicado por Jose (48 intervenciones) el 17/01/2014 18:20:27
Hola Fidel, gracias por el codigo, pero me dio un problema. Hice todo tal cual lo indicaste:
Cree un PRG llamado "CHAU" con este codigo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
************************
PROCEDURE Chau()
************************
* cERRAR FORMULARIOS
LOCAL lni
FOR m.lnI = _SCREEN.FORMCOUNT TO 1 STEP -1
	_SCREEN.FORMS(m.lnI).RELEASE
ENDFOR
* CERRAR TABLAS Y DBC
CLOSE DATABASES all
* LIMPIEZA
ON SHUTDOWN
SET CLASSLIB TO
SET PRINTER TO
CLOSE ALL
* DELETE FILE &DTEMP\*.* Limpieza de temporales (opcional)
CLEAR EVENTS
* DELETE FILE *.FKY Limpieza de archivos para macros (raramente se usan) (opcional)
SET PROCEDURE TO
*SupMenu = 0
menu = 0  ---->>>>>>>>>>>>> AQUI TENGO UNA DUDA, mi menu se llama MENU, por eso coloque con * la linea de arriba, esta bien?
QUIT
ENDPROC

En el PRG principal coloque esto:
1
2
3
4
5
6
7
8
_screen.Visible = .F.
cdir = SYS(5)+CURDIR()
SET PATH TO lcdir
SET TALK OFF
CLEAR
ON SHUTDOWN DO CHAU
DO FORM Caja
READ events

En el QueryUnload del formulario CAJA, el cual es el primero que inicia. coloque:
1
2
3
4
5
6
local nMess
nMess=MESSAGEBOX("Desea cerrar este programa",4,"Cierre")
IF nMess#6 
	NODEFAULT
	RETURN
ENDIF
Y en el Unload Chau()
Pero me genera este error "codigo de excepcion ole idispatch 99 de visual foxpro para windows: procedimiento cancelado". Cuando intento cambiar de un formulario a otro formulario atraves del menu. El error se genera en la primera linea del menu:
1
2
_vfp.ActiveForm.release <<<<<<<<<<<----AQUI.
DO FORM inventario.scx
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Boton Cerrar

Publicado por Fidel José (558 intervenciones) el 18/01/2014 16:12:20
Cuál sería el motivo de esta sentencia?
"_vfp.ActiveForm.release"

Si necesitas cerrar todos los formularios abiertos antes de DO FORM INVENTARIO
Puedes poner en el main.prg una rutina y llamarla antes de abrir el form.
1
2
3
4
5
6
PROCEDURE CerrarForms()
LOCAL lni
FOR m.lnI = _SCREEN.FORMCOUNT TO 1 STEP -1
	_SCREEN.FORMS(m.lnI).RELEASE
ENDFOR
ENDPROC

Entiendo que estás utilizando la sección PROCEDURE del menú. Cuando llamas a un formulario con DO FORM desde cualquier procedimiento, el formulario toma un nombre interno que tu no conoces. Pero puedes asignarle un nombre para tener la referencia de objeto. Por ejemplo:
Addproperty(_Screen,"FrmInventario",null)
DO FORM INVENTARIO NAME _screen.FrmInventario

Luego, si escribes en la ventana de comandos _Screen.FrmInvenario. te aparecerán los objetos y propiedades del form inventario. Y por supuesto, puedes hacer _Screen.FrmInventario.Release

Si utilizas la sección "Command" del menú, el formulario tomará el nombre del archivo scx y esa será su referencia de objeto. Salvo que lo vuelvas a convocar (formulario de instancia múltiple).

Utiliza el SKIP FOR del menú para evitar que se llame dos veces a un formulario que debería llamarse una sola vez.
De lo contrario, tendrás que utilizar un truco:
Para el ejemplo de _Screen:
IF NOT PEMSTATUS(_Screen,"FrmInventario",5)
Addproperty(_Screen,"FrmInventario",null)
ENDIF
IF VARYPE(_SCREEN.FrmInventario)="O"
_screen.FrmInventario.WindowState=0
_screen.FrmInventario.Show
else
DO FORM INVENTARIO NAME _screen.FrmInventario
endif
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Boton Cerrar

Publicado por Jose proyectosjosegomez@live.com (48 intervenciones) el 18/01/2014 20:41:26
Una vez mas gracias, amigo soy novato, estoy estudiando los codigos que me enviaste pero no logro comprenderlos del todo, y por lo tanto se me ha echo muy dificil aplicarlos ya que no se donde deben ir algunos de los ejemplos que me das. Puedes ser un poco mas espefico, o enviarme el menu de ejemplo en un .RAR si no es mucho pedir? Por favor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Boton Cerrar

Publicado por Fidel José (558 intervenciones) el 19/01/2014 15:22:09
José
Como en la rutina de inicio que pasaste, tenés _Screen.Visible=.F., tengo que imaginarme que trabajás con un formulario principal (ShowWindow=2). Si es así, tu proyecto tiene que tener un main.prg (o como se llame) que has marcado como Set Main (y en tu proyecto se ve en negritas).
En Theomain.prg adjunto en zip, tenés un ejemplo de cómo se puede usar el main.prg para agregarle los procedures que necesites.
El theomain.prg comienza con el seteo y la rutina principal termina convocando al Form principal de la aplicación:
ON SHUTDOWN DO Shut_Thp && Shut_Thp es la rutina de cierre
DO FORM ..\forms\liscarpef NAME _Screen.Liscarpef && Liscarpef es el form principal
READ EVENTS

Los otros procedure agregados, son utilizados por toda la aplicación, por ejemplo, Shut_Thp().


En cuanto a los menu, tenés cuatro formas de atacar las acciones:
Procedure, Command, Submenu (que abre otro menu) y Pad Name que tiene otros usos.
Para lanzar un formulario con DO FORM, puedes utilizar Procedure o Command, de acuerdo a tus necesidades.
Cuál es la diferencia?:
1) Command lanzará el form con el nombre (JustStem()) del archivo .scx, salvo que el formulario ya esté activo, en cuyo caso lo levanta con un nombre interno.
2) Procedure: lanzará el formulario con un nombre interno que tu no conoces. Si necesitas que el formulario tome un nombre en particular, debes lanzarlo con la cláusula NAME. El valor de la cláusula tiene que ser una variable pública o una referencia pública, de lo contrario, el nombre no te servirá de nada.
El comportamiento de Procedure se produce en cualquier Procedure o Método en que pongas el comando Do Form
Addproperty(_SCREEN, "FrmBase",null ) && crea una propiedad de _Screen, llamada FrmBase, con valor nulo
DO FORM ..\forms\Base NAME _Screen.Frmbase
Ahora, desde cualquier punto del sistema, puedes referirte al formulario como _Screen.FrmBase, salvo, por supuesto, desde dentro del formulario.
Así desde la ventana comandos, puedes escribir _Screen.FrmBase. y te aparecerán todas las propiedades y objetos del formulario Base.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Boton Cerrar

Publicado por Jose (48 intervenciones) el 26/01/2014 00:26:00
Gracias hermano. Me funciono muy bien
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar