Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Controlar si un Form ya está abierto


Armando
22 de agosto de 2017, 19:26
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:

CloseChild
Description:
Generated when a child form, opened with the OpenForm or CallForm2 (CallForm) method, is closed.

parâmetros do Call :
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:


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:


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:


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.

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)

CALL "PROGRAMA1" USING NDET OBLIGA-338 LLAVE-338
ON EXCEPTION CONTINUE
END-CALL.

Joseg
23 de agosto de 2017, 18:51
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)

CALL "PROGRAMA1" USING NDET OBLIGA-338 LLAVE-338
ON EXCEPTION CONTINUE
END-CALL.




USO ISTO:


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)

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.