Ver la Versión Completa : [Compilador] Form1 CALL a Form2 y este cierra el Form1
Joseg
29 de marzo de 2017, 14:06
¿Esto es posible?
Botón en una "form" llamada y poner fin a la "form" actual.
"Form1" ---> "Botón1 ---> Call "Form2" y cierra "Form1".
(Código sobre el botón 1)
Gracias,
Jose
Kuk
29 de marzo de 2017, 14:25
Joseg, esto es un caso que se puede lograr a hacer, pero normalmente se puede evitar. ¿Para qué lo necesitas?
En realidad, aquí de lo que se trata es la dependencia de Forms y Procesos. Se puede hacer, por ejemplo, si Form1 y Form2 están en diferentes EXE-s. No se puede hacer si los Forms están en DLL. EN todo caso se necesita un Main Module para abrir un Form. Además, en PowerCOBOL no estamos en creación de GUI-s nativas, con lo cual no tenemos mucho control sobre el asunto.
Yo lo necesité una vez, porque mi aplicación comprobaba si había una versión nueva, y si le dabas a "Actualizar", se cerraba, lanzaba el "intall.exe" nuevo que se ha descargado, y luego se volvía a ejecutar el Main.exe (pero tendré que mirar cómo lo hice, no me acuerdo) :rie:
Joseg
29 de marzo de 2017, 15:04
Joseg, esto es un caso que se puede lograr a hacer, pero normalmente se puede evitar. ¿Para qué lo necesitas?
En realidad, aquí de lo que se trata es la dependencia de Forms y Procesos. Se puede hacer, por ejemplo, si Form1 y Form2 están en diferentes EXE-s. No se puede hacer si los Forms están en DLL. EN todo caso se necesita un Main Module para abrir un Form. Además, en PowerCOBOL no estamos en creación de GUI-s nativas, con lo cual no tenemos mucho control sobre el asunto.
Yo lo necesité una vez, porque mi aplicación comprobaba si había una versión nueva, y si le dabas a "Actualizar", se cerraba, lanzaba el "intall.exe" nuevo que se ha descargado, y luego se volvía a ejecutar el Main.exe (pero tendré que mirar cómo lo hice, no me acuerdo) :rie:
Gracias :)
Las "forms" están en la misma DLL.
Básicamente quería que el "Form2" llamada "Form1", pero esto no es posible ya está abierto.
Formulario1 "open" Formulario2, que realiza ciertas tareas que deriam se reflejan automáticamente en Formulario1.
Kuk
29 de marzo de 2017, 15:28
Joseg, lo que puedes hacer es pasar el Form1 (que es el que necesitas varias veces) a una DLL nueva y fijar el código en OO COBOL. Hay que copiar y pegar código en los eventos porque (!!!) al cambiar de COBOL85 a OO COBOL se borra todo el código en los eventos, pero bueno no es un problema. Teniendo copia de ese Form en el proyecto, simplemente haces Copiar/Pegar en cada evento.
De esta manera, cada vez que invoques ese Form1 se creará una copia nueva (obvio, estando en modo OO). Yo tengo hecho esto para un proyecto donde creé mi propio MessageBox.
---------- Post añadido : 15:28 ---------- Post anterior : 15:08 ----------
Formulario1 "open" Formulario2, que realiza ciertas tareas que deriam se reflejan automáticamente en Formulario1.
Y esto se puede hacer de la siguiente manera:
En el Form1 defines unos campos como EXTERNAL, Y pones un TIMER. A la hora de llamar el Form 2 lo haces con OpenForm (para continuar ejecutando el Timer) y con Cookie (para saber cuando se ha cerrado el Form2 en el evento "CloseChild" del Form1).
El código más o menos sería algo así:
Form1->Button1Click:
MOVE POW-TRUE TO "Active" OF Timer1
MOVE POW-FALSE TO "Enabled" OF CmCommand1
INVOKE POW-SELF "OpenForm" USING "Form2" 1
Form1->Timer
WORKING-STORAGE SECTION.
01 MiCampoExt IS EXTERNAL PIC X(50).
PROCEDURE DIVISION.
MOVE MiCampoExt TO POW-TEXT OF CmText1
Form1->CloseChild:
LINKAGE SECTION.
01 POW-COOKIE PIC S9(9) COMP-5.
PROCEDURE DIVISION USING POW-COOKIE.
IF POW-COOKIE = 1 *> nuestro Form2
MOVE POW-FALSE TO "Active" OF Timer1
MOVE POW-TRUE TO "Enabled" OF CmCommand1
END-IF
Form2->OnChange (o cualquier evento)
WORKING-STORAGE SECTION.
01 MiCampoExt IS EXTERNAL PIC X(50).
PROCEDURE DIVISION.
MOVE POW-TEXT OF CmText1 TO MiCampoExt
Kuk
29 de marzo de 2017, 18:35
Joseg, lo he comprobado. Con el
INVOKE POW-SELF "Execute" USING ...
No se cierra el programa llamado. O sea que se puede hacer si los dos Forms son EXE, pero esto en este caso no sirve. Así que habrá que intentar hacerlo como lo he dicho antes, con el Timer.
Nitzer
29 de marzo de 2017, 18:35
NO me he metido con el tema de OOCobol mucho y seguramente se le puede dar mucho uso.
Yo también tengo personalizado el DisplayMessage con un form, pero para evitar que se abra mas de una vez, simplemente lo invoco con CALLFORM2 :) ya que entiendo que siendo una ventana de pregunta y respuesta rápida, no debe el usuario estar en otro sitio.
En cuanto al tema de la discusión, me he perdido un poco, quizás entendiéndolo mejor os pueda ayudar.
Joseg
29 de marzo de 2017, 19:39
Mi experiencia en OOCOBOL no es mucho, pero lo intentaré.
Muchas gracias
Joseg, lo que puedes hacer es pasar el Form1 (que es el que necesitas varias veces) a una DLL nueva y fijar el código en OO COBOL. Hay que copiar y pegar código en los eventos porque (!!!) al cambiar de COBOL85 a OO COBOL se borra todo el código en los eventos, pero bueno no es un problema. Teniendo copia de ese Form en el proyecto, simplemente haces Copiar/Pegar en cada evento.
De esta manera, cada vez que invoques ese Form1 se creará una copia nueva (obvio, estando en modo OO). Yo tengo hecho esto para un proyecto donde creé mi propio MessageBox.
---------- Post añadido : 15:28 ---------- Post anterior : 15:08 ----------
Y esto se puede hacer de la siguiente manera:
En el Form1 defines unos campos como EXTERNAL, Y pones un TIMER. A la hora de llamar el Form 2 lo haces con OpenForm (para continuar ejecutando el Timer) y con Cookie (para saber cuando se ha cerrado el Form2 en el evento "CloseChild" del Form1).
El código más o menos sería algo así:
Form1->Button1Click:
MOVE POW-TRUE TO "Active" OF Timer1
MOVE POW-FALSE TO "Enabled" OF CmCommand1
INVOKE POW-SELF "OpenForm" USING "Form2" 1
Form1->Timer
WORKING-STORAGE SECTION.
01 MiCampoExt IS EXTERNAL PIC X(50).
PROCEDURE DIVISION.
MOVE MiCampoExt TO POW-TEXT OF CmText1
Form1->CloseChild:
LINKAGE SECTION.
01 POW-COOKIE PIC S9(9) COMP-5.
PROCEDURE DIVISION USING POW-COOKIE.
IF POW-COOKIE = 1 *> nuestro Form2
MOVE POW-FALSE TO "Active" OF Timer1
MOVE POW-TRUE TO "Enabled" OF CmCommand1
END-IF
Form2->OnChange (o cualquier evento)
WORKING-STORAGE SECTION.
01 MiCampoExt IS EXTERNAL PIC X(50).
PROCEDURE DIVISION.
MOVE POW-TEXT OF CmText1 TO MiCampoExt
Kuk
29 de marzo de 2017, 20:13
Joseg, en realidad cara al modo de programación para ti no cambia casi nada, es más que nada el código generado por detrás el que cambia. Hay algunas cosas como que por ejemplo en la WORKING del Form ya no hay que poner GLOBAL, ya de por sí las variables son globales y alguna que otra cosa más pero vamos, nada importante. Puedes copiar y pegar código de los eventos del antiguo Form (COBOL85) al nuevo (OO COBOL) y lo más seguro es que se compile sin problemas o sólo tengas que modificar un par de tonterías.
Kuk
30 de marzo de 2017, 11:56
Nitzer, se me había escapado tu post :D
Para mi, la mayor ventaja del modo OO COBOL en PowerCOBOL es que puedes tener nuevas copias de tus Forms (nuevas instancias). También, si necesitas intercambiar datos por ejemplo con Java o necesitas una tabla interna dinámica (UNBOUNDED) también se puede hacer, aunque esto yo nunca lo he necesitado.
Yo lo necesité porque creé una aplicación simulando MDI, o sea que tenía una ventana principal y varias ventanas (aplicaciones) dentro de esta. Se podía trabajar con varias aplicaciones (pestañas) al mismo tiempo, por eso necesitaba que se pudiera tener varios MessageBox a la vez.
vBulletin v3.8.7, Derechos ©2000-2026, Jelsoft Enterprises Ltd.