0

![]() |
![]() |
Acabo de llegar... |
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
![]() |
![]() |
Gran amigo y Guru de COBOL |
Armando,
Penso que sim.
Ao fazer o "Call" podes definir um "cookie=1"
No evento:parâmetros do Call :CloseChild
Description:
Generated when a child form, opened with the OpenForm or CallForm2 (CallForm) method, is closed.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
![]() |
![]() |
Forero |
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
![]() |
![]() |
Administrador |
@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:COBOL Código:
INVOKE POW-SELF "OpenForm" USING "Form1" 1 *> donde 1 es la ID de la cookie MOVE POW-FALSE TO "Enabled" OF CmCommand1
MainForm.CmCommand2.Click:COBOL Código:
INVOKE POW-SELF "OpenForm" USING "Form2" 2 *> donde 2 es la ID de la cookie MOVE POW-FALSE TO "Enabled" OF CmCommand2
Ahora, en el evento "CloseChild" del MainForm haces:COBOL Código:
LINKAGE SECTION. 01 POW-COOKIE PIC S9(9) COMP-5. PROCEDURE DIVISION USING POW-COOKIE. IF POW-COOKIE = 1 MOVE POW-TRUE TO "Enabled" OF CmCommand1 END-IF IF POW-COOKIE = 2 MOVE POW-TRUE TO "Enabled" OF CmCommand2 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.
¿Te han ayudado? NO TE OLVIDES de darle al botón
¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
- Haciendo clic en el icono
al lado de su nick
- Haciendo clic en el botón
en el editor y escribiendo su nick.
![]() |
![]() |
Acabo de llegar... |
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)COBOL Código:
CALL "PROGRAMA1" USING NDET OBLIGA-338 LLAVE-338 ON EXCEPTION CONTINUE END-CALL.
![]() |
![]() |
Senior |
USO ISTO:COBOL Código:
WORKING-STORAGE SECTION. 01 ALOCALIZAR PIC X(255). 01 PT1 USAGE IS POINTER. 01 PT1-A REDEFINES PT1 PIC S9(9) COMP-5. 01 PT2 USAGE IS POINTER. 01 PT2-A REDEFINES PT2 PIC S9(9) COMP-5. 01 HWDS PIC S9(9) COMP-5. 01 WS01-STR PIC X(100) VALUE SPACES. PROCEDURE DIVISION. MOVE SPACES TO ALOCALIZAR WS01-STR. MOVE POW-TEXT OF txtJanela TO WS01-STR. STRING WS01-STR DELIMITED BY " " X"00" DELIMITED BY SIZE INTO ALOCALIZAR. MOVE FUNCTION ADDR(ALOCALIZAR) TO PT1. SET PT2 TO NULL. CALL "FindWindowA" WITH STDCALL USING BY VALUE PT2-A BY VALUE PT1-A RETURNING HWDS. * achou MOVE SPACES TO WS01-STR. IF HWDS > 0 STRING " SIM, localizou a aberta a JANELA = " DELIMITED BY SIZE ALOCALIZAR DELIMITED BY " " INTO WS01-STR END-STRING MOVE WS01-STR TO POW-TEXT OF txtMensagem ELSE * nao achou STRING " NÃO localizou, na memória a JANELA = " DELIMITED BY SIZE ALOCALIZAR DELIMITED BY " " INTO WS01-STR END-STRING MOVE WS01-STR TO POW-TEXT OF txtMensagem END-IF.
Não esquecer de por nas opções de compilação: ALPHAL(WORD)
![]() |
![]() |
Administrador |
@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.
¿Te han ayudado? NO TE OLVIDES de darle al botón
¿Quieres dirigirte a alguien en tu post? Notifícale con una mención, tienes 2 opciones:
- Haciendo clic en el icono
al lado de su nick
- Haciendo clic en el botón
en el editor y escribiendo su nick.
Actualmente hay 1 usuarios viendo este tema. (0 miembros y 1 visitantes)
Marcadores