Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] Controlar si un Form ya está abierto (https://www.cobolforo.es/showthread.php?t=708)

Armando 22 de agosto de 2017 19:26

Controlar si un Form ya está abierto
 
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

Rapinto 22 de agosto de 2017 22:58

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

Dasije 23 de agosto de 2017 00:52

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.

Kuk 23 de agosto de 2017 08:43

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.

Armando 23 de agosto de 2017 17:40

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.

Joseg 23 de agosto de 2017 18:51

Cita:

Citación del post de Armando (Mensaje 3437)
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)

Kuk 23 de agosto de 2017 19:54

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.


La franja horaria es GMT +2. Ahora son las 06:27.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.