Cobol Foro
Navegación en el Foro
Retroceder   Cobol Foro Entornos de desarrollo y compiladores Cobol Fujitsu COBOL PowerCOBOL (ActiveX, v4 - v11)
PowerCOBOL (ActiveX, v4 - v11) Versiones del IDE basadas en ActiveX
 
Otros temas que te pueden interesar
Tema Autor Foro Respuestas Último post
[Noticia] Bob está regresando, pero esta vez no es un juego Eslopes GnuCOBOL (OpenCOBOL) 20 14 de agosto de 2025 10:36
[Sintaxis] Activar Un Form desde otro form Roberto PowerCOBOL (ActiveX, v4 - v11) 5 21 de mayo de 2024 14:35
[Compilador] Nuevo compilador de Cobol .NET de código abierto Joseg COBOL - General 14 9 de enero de 2023 16:48
[Sintaxis] Calculo de la semana en que está una fecha Begoguay PowerCOBOL (ActiveX, v4 - v11) 3 8 de enero de 2022 19:28
[Sintaxis] Saber si un EXE se esta ejecutando ?? Hrmcobol PowerCOBOL y WinAPI 1 24 de noviembre de 2020 13:11

Respuesta

  #1
Antiguo 22 de agosto de 2017, 19:26
Armando
Forero Junior
Última Actividad 02.10.2026 15:16
Posts Posts: 34
Likes enviados Enviados: 5
Likes recibidos Recibidos: 19
GUI Controlar si un Form ya está abierto
0 Inactivo Inactivo

Estimados, buenas tardes,

Una consulta, cuando uno llama en una cadena de programas por error a un programa (dll) de esa cadena, nos da un mensaje porque Netcobol no permite la recursividad.

You can create only one "formA"
"formA" has already benn opened as a form, or placed on the form as a control


La pregunta es, existe algún código de status o forma de poder controlar que ya está abierto, con el netcobol? (en definitiva algún de status del callform)
(obvio que con llaves uno lo puede manejar)

gracias,
abrazo
Armando
Armando is offline   Responder Con Cita
  #2
Antiguo 22 de agosto de 2017, 22:58
Rapinto
Gran amigo del Foro
Guru de COBOL
Activista del Foro: Activista del Foro - Issue reason: ¡Gracias! Agradecimientos: Por muchos agradecimientos de parte de los Foreros - Issue reason: Por ayudar mucho a los foreros Guru de los Gurus: Por solidos y amplios conocimientos - Issue reason: Por saber demasiado! 
Última Actividad 29.01.2018 20:23
Posts Posts: 240
Likes enviados Enviados: 19
Likes recibidos Recibidos: 224

Armando,
Penso que sim.
Ao fazer o "Call" podes definir um "cookie=1"
No evento:

Cita:
❞
CloseChild
Description:
Generated when a child form, opened with the OpenForm or CallForm2 (CallForm) method, is closed.
parâmetros do Call :
Cita:
❞
1. FormName: The name of the form to be opened.

2. DllName: When the form is in a DLL file, defines the name of the DLL file containing the form.
It should be omitted when you specify a form in the same Module, as specifying the same DLL name that contains the invoking form degrades performance.

3. Cookie: An integer to distinguish the opened form.
It is set in a parameter of the CloseChild
when the opened form is closed. If omitted, the parameter value is zero.

Ficas a saber que a form foi fechada.
Não sei se me faço entender.
Se for necessária mais alguma informação diz-me.
Un saludo,
Rui Pinto
Rapinto is offline   Responder Con Cita
  #3
Antiguo 23 de agosto de 2017, 00:52
Dasije
Forero Senior
Última Actividad 06.03.2022 17:04
Posts Posts: 173
Likes enviados Enviados: 1
Likes recibidos Recibidos: 79

Sí sabes usar apis de windows, hay funciones para capturar el título del formulario, y si existe, ya sabes que está abierto en ese momento.

Un colega lo conseguió, por mi inicitiva de mejorar su aplicación y mía por necesidad en la propia aplicación, la idea era de capturar las teclas desde cualquier parte de la aplicación, antes de abrir el formulario se comprueba si existe, así se evitaba el error que te aparece.



Empresa de desarrollo de aplicaciones en COBOL.

DASIJE INFORMATICA, S.L.
C/ TOMAS BRETON 20
11406 JEREZ DE LA FRONTERA
CADIZ

Teléfono : 956 11 21 11
Web: http://www.dasije.es / DASIJE INFORMATICA
E-m@il: clientes(@)dasije.es
Dasije is offline   Responder Con Cita
  #4
Antiguo 23 de agosto de 2017, 08:43
Kuk
Administrador
Última Actividad 03.10.2026 00:00
Posts Posts: 2.500
Likes enviados Enviados: 1038
Likes recibidos Recibidos: 1207

Armando, no es la recursividad sino la multi-instancia. En realidad, si desde el principio establecemos el tipo de script a OO COBOL en la propiedades del módulo, permite multiinstancia. Pero al caso.

Sí que se puede saber, como decía Rapinto. Un ejemplo simple:

Abres 2 Forms con 2 botones.
MainForm.CmCommand1.Click:

Código COBOL:
  1.      INVOKE POW-SELF "OpenForm" USING "Form1" 1 *> donde 1 es la ID de la cookie
  2.  
  3.      MOVE POW-FALSE TO "Enabled" OF CmCommand1

MainForm.CmCommand2.Click:

Código COBOL:
  1.      INVOKE POW-SELF "OpenForm" USING "Form2" 2 *> donde 2 es la ID de la cookie
  2.  
  3.      MOVE POW-FALSE TO "Enabled" OF CmCommand2

Ahora, en el evento "CloseChild" del MainForm haces:

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
  6.          MOVE POW-TRUE TO "Enabled" OF CmCommand1
  7.      END-IF
  8.      
  9.      IF  POW-COOKIE = 2
  10.          MOVE POW-TRUE TO "Enabled" OF CmCommand2
  11.      END-IF

Y listo. Este es el mecanismo. A partir de esto, puedes hacer loq eu quieras, manejar variables EXTERNAL para saber en otros Forms también, si un Form está abuerto o no etc.



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 23 de agosto de 2017, 17:40
Armando
Forero Junior
Última Actividad 02.10.2026 15:16
Posts Posts: 34
Likes enviados Enviados: 5
Likes recibidos Recibidos: 19

Estimados, a todos muchas gracias,

Si el tema del cookie, en algún caso lo hemos usado y resuelve bien,
Lo mismo lo de las API, de encontrar por el título,

Más que nada, capaz que no supe expresarme bien era si había alguna alternativa, cuando tenés un programa que llama a A, este a B, este a C y el útimo intenta llamar a A de nuevo, si había una alternativa de interceptar el Mensaje en inglés, como en Rmcobol, que hay un PROGRMA-STATUS, si el programa llamado da error (incluso si encuentra la dll, por ejemplo)

Código COBOL:
  1. CALL "PROGRAMA1" USING NDET OBLIGA-338 LLAVE-338
  2.     ON EXCEPTION CONTINUE
  3. END-CALL.
Armando is offline   Responder Con Cita
  #6
Antiguo 23 de agosto de 2017, 18:51
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 02.10.2026 10:24
Posts Posts: 404
Likes enviados Enviados: 130
Likes recibidos Recibidos: 180

Citación del post de Armando Ver Mensaje
❞
Estimados, a todos muchas gracias,

Si el tema del cookie, en algún caso lo hemos usado y resuelve bien,
Lo mismo lo de las API, de encontrar por el título,

Más que nada, capaz que no supe expresarme bien era si había alguna alternativa, cuando tenés un programa que llama a A, este a B, este a C y el útimo intenta llamar a A de nuevo, si había una alternativa de interceptar el Mensaje en inglés, como en Rmcobol, que hay un PROGRMA-STATUS, si el programa llamado da error (incluso si encuentra la dll, por ejemplo)

Código COBOL:
  1. CALL "PROGRAMA1" USING NDET OBLIGA-338 LLAVE-338
  2.     ON EXCEPTION CONTINUE
  3. END-CALL.


USO ISTO:

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  ALOCALIZAR PIC X(255).
  3.  01  PT1    USAGE IS POINTER.
  4.  01  PT1-A  REDEFINES PT1 PIC S9(9) COMP-5.
  5.  01  PT2    USAGE IS POINTER.
  6.  01  PT2-A  REDEFINES PT2 PIC S9(9) COMP-5.
  7.  01  HWDS   PIC S9(9) COMP-5.
  8.  01  WS01-STR PIC X(100) VALUE SPACES.
  9.  
  10.  PROCEDURE DIVISION.
  11.  
  12.      MOVE SPACES TO ALOCALIZAR WS01-STR.
  13.      MOVE POW-TEXT OF txtJanela TO WS01-STR.
  14.      STRING WS01-STR DELIMITED BY " "
  15.             X"00"  DELIMITED BY SIZE
  16.             INTO ALOCALIZAR.
  17.      MOVE FUNCTION ADDR(ALOCALIZAR)  TO PT1.
  18.      SET PT2 TO NULL.
  19.      CALL "FindWindowA" WITH STDCALL USING BY VALUE PT2-A
  20.                                            BY VALUE PT1-A
  21.                                            RETURNING HWDS.
  22. * achou
  23.      MOVE SPACES TO WS01-STR.
  24.      IF HWDS > 0
  25.         STRING " SIM, localizou a aberta a JANELA = " DELIMITED BY SIZE
  26.                ALOCALIZAR DELIMITED BY " "
  27.                INTO WS01-STR
  28.         END-STRING
  29.         MOVE WS01-STR TO POW-TEXT OF txtMensagem
  30.      ELSE
  31. * nao achou
  32.         STRING " NÃO localizou, na memória a JANELA = " DELIMITED BY SIZE
  33.                ALOCALIZAR DELIMITED BY " "
  34.                INTO WS01-STR
  35.         END-STRING
  36.         MOVE WS01-STR TO POW-TEXT OF txtMensagem
  37.      END-IF.

Não esquecer de por nas opções de compilação: ALPHAL(WORD)
Joseg is offline   Responder Con Cita
  #7
Antiguo 23 de agosto de 2017, 19:54
Kuk
Administrador
Última Actividad 03.10.2026 00:00
Posts Posts: 2.500
Likes enviados Enviados: 1038
Likes recibidos Recibidos: 1207

Armando, creo que PowerCOBOL no permite el acceso a tal "profundidad" porque es un entorno orientado a eventos. Con lo cual, no veo una manera de interceptar dicho mensaje porque viene del Run-Time.

La alternativa sería comprobar la existencia de la DLL en tu código. O, en caso de los Form, mover el estado, según cookie, a una variable EXTERNAL compartida por todos los Forms.



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


Herramientas

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 06:34.
Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.