Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Fujitsu COBOL PowerCOBOL y COM/OLE
PowerCOBOL y COM/OLE La utilización de COM / OLE en PowerCOBOL
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
Gracias Por Permitirme pertenecer a este Foro Roberto Presentación 2 19 de agosto de 2023 21:55
[Sintaxis] CALL en OPENCOBOLIDE 4.7.6 da error (no encuentra) etilico2022 IDE-s para GnuCOBOL 17 31 de julio de 2023 20:53
[Sintaxis] CALL a programas externos en Windows 8 Gusaiello AcuCobol 9 15 de marzo de 2023 20:23
[Duda] ¿una ayudita para este novato en programacion? /D/ COBOL - General 11 29 de septiembre de 2020 23:26
[Sintaxis] Error en programa: Illegal function call Begoguay PowerCOBOL (ActiveX, v4 - v11) 3 11 de julio de 2018 19:41

Respuesta
 
Herramientas

  #1
Antiguo 29 de marzo de 2017, 14:06
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179
GUI Form1 CALL a Form2 y este cierra el Form1
0 Inactivo Inactivo

¿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
Joseg is offline   Responder Con Cita
  #2
Antiguo 29 de marzo de 2017, 14:25
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

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:



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #3
Antiguo 29 de marzo de 2017, 15:04
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Citación del post de Kuk Ver Mensaje
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.
Joseg is offline   Responder Con Cita
  #4
Antiguo 29 de marzo de 2017, 15:28
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

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 ----------

Citación del post de Joseg Ver Mensaje
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:
Código COBOL:
  1.      MOVE POW-TRUE  TO "Active"  OF Timer1
  2.      MOVE POW-FALSE TO "Enabled" OF CmCommand1
  3.      
  4.      INVOKE POW-SELF "OpenForm" USING "Form2" 1

Form1->Timer
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  MiCampoExt IS EXTERNAL PIC X(50).
  3.  PROCEDURE DIVISION.    
  4.  
  5.      MOVE MiCampoExt TO POW-TEXT OF CmText1

Form1->CloseChild:
Código COBOL:
  1.  LINKAGE SECTION.
  2.  01  POW-COOKIE PIC S9(9) COMP-5.
  3.  PROCEDURE DIVISION USING POW-COOKIE.
  4.      
  5.      IF  POW-COOKIE = 1 *> nuestro Form2
  6.          MOVE POW-FALSE TO "Active"  OF Timer1
  7.          MOVE POW-TRUE  TO "Enabled" OF CmCommand1
  8.      END-IF

Form2->OnChange (o cualquier evento)
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  MiCampoExt IS EXTERNAL PIC X(50).
  3.  PROCEDURE DIVISION.    
  4.  
  5.      MOVE POW-TEXT OF CmText1 TO MiCampoExt



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #5
Antiguo 29 de marzo de 2017, 18:35
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Joseg, lo he comprobado. Con el

Código COBOL:
  1.      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.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #6
Antiguo 29 de marzo de 2017, 18:35
Nitzer
Guru de COBOL
Activista del Foro: Activista del Foro - Issue reason: Por Videoconferencia-Webinar Guru de los Gurus: Por solidos y amplios conocimientos - Issue reason: Por aportar conocimientos excepcionales 
Última Actividad 05.08.2026 17:33
Posts Posts: 200
Likes enviados Enviados: 70
Likes recibidos Recibidos: 157

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.
Nitzer is offline   Responder Con Cita
  #7
Antiguo 29 de marzo de 2017, 19:39
Joseg
El Foro es mi casa
Activista del Foro: Activista del Foro - Issue reason: Por participación activa Innovación: Por aportar innovaciones - Issue reason: Por aportar soluciones innovadoras en varias ocasiones 
Última Actividad 17.09.2026 18:23
Posts Posts: 401
Likes enviados Enviados: 130
Likes recibidos Recibidos: 179

Mi experiencia en OOCOBOL no es mucho, pero lo intentaré.
Muchas gracias



Citación del post de Kuk Ver Mensaje
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:
Código COBOL:
  1.      MOVE POW-TRUE  TO "Active"  OF Timer1
  2.      MOVE POW-FALSE TO "Enabled" OF CmCommand1
  3.      
  4.      INVOKE POW-SELF "OpenForm" USING "Form2" 1

Form1->Timer
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  MiCampoExt IS EXTERNAL PIC X(50).
  3.  PROCEDURE DIVISION.    
  4.  
  5.      MOVE MiCampoExt TO POW-TEXT OF CmText1

Form1->CloseChild:
Código COBOL:
  1.  LINKAGE SECTION.
  2.  01  POW-COOKIE PIC S9(9) COMP-5.
  3.  PROCEDURE DIVISION USING POW-COOKIE.
  4.      
  5.      IF  POW-COOKIE = 1 *> nuestro Form2
  6.          MOVE POW-FALSE TO "Active"  OF Timer1
  7.          MOVE POW-TRUE  TO "Enabled" OF CmCommand1
  8.      END-IF

Form2->OnChange (o cualquier evento)
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  MiCampoExt IS EXTERNAL PIC X(50).
  3.  PROCEDURE DIVISION.    
  4.  
  5.      MOVE POW-TEXT OF CmText1 TO MiCampoExt
Joseg is offline   Responder Con Cita
  #8
Antiguo 29 de marzo de 2017, 20:13
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

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.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
  #9
Antiguo 30 de marzo de 2017, 11:56
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Nitzer, se me había escapado tu post

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.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita
Respuesta



Derechos de Publicación
No puedes publicar nuevos temas
No puedes publicar posts/responder
No puedes adjuntar archivos
No puedes editar tus posts

BB code is habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado

Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:04.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.