PDA

Ver la Versión Completa : [Sintaxis] Ventanas Flotantes


Breew
2 de abril de 2019, 23:35
Hola .

Quisiera abrir una ventana de consulta, y poder desplazarla por la pantalla, para seguir trabando en el form principal.
He pensado en un form secundario,

INVOKE POW-SELF "OpenForm" USING "Consulta-log".

Esto me permite volver al form principal , pero cuando efectuo otra consulta, me indica que el form Consulta, ya lo tengo abierto.

No me permite poner en multipleinstancia en el formsecundario , me indica que
The form cannot be generated in multiplesby the COBOL85 LANGUAGE specification

La idea seria que abriera tantos form como consultas este realizando.

Alguna idea?

Saludos

Kuk
3 de abril de 2019, 21:16
Breew, tienes que

Crear una copia del proyecto
Abrir el nuevo proyecto en una instancia nueva de PowerCOBOL
Eliminar todos los scripts de eventos que tengas en el proyecto antiguo
Cambiar el modo de COBOL85 a OO-COBOL
Crear uno a uno todos los eventos en el proyecto, fijándote en el otro proyecto (copia) que tienes abierto en la otra instancia de PowerCOBOL, copiando el contenido (código) de cada uno de esos eventos en el correspondiente que acabas de crear


No sé si me explico :ojo1: :D

Breew
3 de abril de 2019, 22:56
Uffff!!!!

Justamente es una historia enormeeee :mm:

Intentare hacer una prueba, y luego te comento :bien:

Muchas gracias

Kuk
4 de abril de 2019, 20:12
Breew, es verdad que es bastante coñazo. Pero te toca hacerlo, por desgracia. :losiento:

Yo lo hice en su día para uno de mis proyectos, y funciona. Salvo algún que otro ajuste, como por ejemplo que la palabra reservada GLOBAL ya no es necesaria, y hay que quitarla porque el compilador se queja, y vamos, cuatro tonterías de estas.

No encontré otro modo de hacerlo, cosa que me parece normal, porque dependiendo del dialecto, todo el código que se genera automáticamente (mira los ficheros *.prc por ejemplo) es diferente, y seguramente el mecanismo de anclaje del código nuestro en el generado también difiere, y digamso el IDE "no se atreve" o más bien no podría garantizar la transformación del código generado existente con el nuestro ya anclado. Así que directamente lo han capado.

Es por eso que hay que definir el dialecto desde el principio, sin haber codificado ninguna línea de código. Pero nos damos cuenta tarde. :D

Nitzer
4 de abril de 2019, 23:09
Kuk, una pregunta inocente, (nunca me he metido con el oocobol)
Como le pasas unas variables a una dll programada en oocobol desde un exe en Cobol "normal"

---------- Post añadido : 23:09 ---------- Post anterior : 22:50 ----------

Me autorepondo, he leido un post anterior y parece que lo que no se puede poner es Global, pero si External.
Haré alguna prueba, aunque he hecho lo esencial y cuando intento abrir 2 veces el form, me dice que ya está abierto :o y lo he creado bien.

Breew
5 de abril de 2019, 21:32
Hola.

De momento , se queja por GLOBAL, EXTERNAL Y EXIT PROGRAM.

Debo de definir todas las variables comunes de los programas en la working general?

El Exit program lo utilizo para finalizar el programa y poner las subrutinas debajo.
Por que otra instruccion lo puedo sustituir?

Gracias

Kuk
5 de abril de 2019, 21:43
Nitzer, cuando estás en el modo OO-COBOL, en las propiedades de un Form aparece una nueva opción "MultiInstance" que por defecto está en False. Hay que ponerla en True ;)

---------- Post añadido : 21:43 ---------- Post anterior : 21:38 ----------

Breew, en OO-COBOL, las variables de la working general son todas GLOBAL de por sí.

El EXTERNAL no debería, supongo que lo tienes junto a GLOBAL y por eso te lo menciona también.

Por que otra instruccion lo puedo sustituir?
Puedes hacer lo siguiente:


IF ...
GO TO SALIDA
...

SALIDA.
EXIT.


Evidentemente, SALIDA debe siempre ser el último párrafo.

Breew
5 de abril de 2019, 23:20
Hola.

Parece ser que el error de external, unicamente me lo da en la working general.

Tambien me da problemas la instruccion
CALL "NUEVA PROCEDURE".

Como doy paso a una nueva procedure?.

Gracias

Kuk
6 de abril de 2019, 20:12
Breew, tienes que crear un método nuevo, clic derecho en el Form -> "Insert Custom Method", llamarlo como la procedure que tenías. Luego abrir el único evento que tiene "Invoked" y pegar el texto de la procedure dentro.

Donde tengas CALL "MIPROCEDURE" tendrás que reemplazarlo por:


INVOKE POW-SELF "MIPROCEDURE" USING ...


En el editor de código, si escribes POW-SELF, lo seleccionas y haces clic con el botón derecho del ratón, en la lista de métodos también te aparecerá el tuyo.

Nitzer
6 de abril de 2019, 22:35
Muchas gracias kuk :))

He conseguido ejecutarlo múltiples veces y el EXTERNAL lo he colocado en la working del opened y ha ido perfecto.

Seguiré investigando a ver lo que puede ofrecernos el OOCOBOL :)

Aunque para mi, lo que sería increible es poder ejecutar por hilos, ejecutar varias acciones a la vez sin dejar el ejecutable "parado"

Kuk
7 de abril de 2019, 00:54
Nitzer, de nada hombre, para eso estamos :bien:

En cuanto a lo de los hilos, es perfectamente posible. Había un ejemplo de Rapinto por ahí en el foro.

En todo caso, la mecánica sería de crear un Thread vía WinAPI, declarar un PROCEDURE-POINTER, hacerle un


SET MI-PROCEDURE-POINTER TO ENTRY "NOMBRE_PROCEDURE"


Y pasar MI-PROCEDURE-POINTER redefinido en PIC S9(9) COMP-5 al Thread creado.

Ando mal de tiempo, pero intento hacer un ejemplo mañana ;)

Aunque lo más fácil es usar CmTimer-s, porque cada uno crea un hilo detrás. Es decir, poner un CmTimer en el Form, poner en su evento el código que queramos, y lo primero lo que debemos hacer es parar el timer dentro de ese código. Y para invocarlo, simplemente activar el Timer. :fuma:

Nitzer
16 de abril de 2019, 16:50
Kuk, sin prisas, si pasas un ejemplo, te estaré eternamente agradecido :)

Como sabes yo siempre utilizo OPENFORM, es decir que desde el menu, cualquier usuario puede tener todas las ventanas que quiera abiertas, obviamente de programas distintos, pero claro, cuando lanzo una consulta que tarda deja todo el programa "no responde" :)

Gracias como siempre por todo.

Kuk
17 de abril de 2019, 21:59
Nitzer, estoy en ello, ¡lo prometido es deuda! :fuma:

Lo que pasa es que lo estoy haciendo desde 0 porque no encontré el ejemplo del que hablaba y no tengo tiempo ni para estornudar... ;)

Sólo para enseñarte mis avances, de momento no funciona bien:


ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RESP PIC S9(9) COMP-5.
01 SECURITY-DESCRIPTOR.
05 Revision PIC X(1).
05 Sbz1 PIC X(1).
05 sControl PIC S9(4) COMP-5. *> SECURITY_DESCRIPTOR_CONTROL
05 sOwner PIC S9(9) COMP-5.
05 sGroup PIC S9(9) COMP-5.
05 Sacl PIC S9(9) COMP-5.
05 Dacl PIC S9(9) COMP-5.

01 lpdwRevision PIC S9(9) COMP-5.

01 SECURITY-ATTRIBUTES.
05 nLength PIC S9(9) COMP-5. *> The size, in bytes, of this structure
05 lpSecurityDescriptor POINTER. *> A pointer to a SECURITY_DESCRIPTOR structure
05 bInheritHandle PIC 9(2) COMP-5. *> A Boolean value that specifies whether the returned handle is inherited when a new process is created.

01 dwStackSize PIC 9(9) COMP-5. *> The initial size of the stack, in bytes. The system rounds this value to the nearest page. If this parameter is zero, the new thread uses the default size for the executable.
01 lpStartAddress PROCEDURE-POINTER.
01 R-lpStartAddress REDEFINES lpStartAddress PIC 9(9) COMP-5.

01 lpParameter PIC 9(9) COMP-5.
01 dwCreationFlags PIC 9(9) COMP-5. *> if 0 - The thread runs immediately after creation.
01 lpThreadId PIC 9(9) COMP-5. *> A pointer to a variable that receives the thread identifier.
PROCEDURE DIVISION.

MOVE POW-FALSE TO "Enabled" OF CmCommand1

*>Advapi32.lib
* CALL "GetSecurityDescriptorControl" WITH STDCALL USING BY REFERENCE SECURITY-DESCRIPTOR
* BY REFERENCE sControl
* BY REFERENCE lpdwRevision
* RETURNING RESP

CALL "InitializeSecurityDescriptor" WITH STDCALL USING BY REFERENCE SECURITY-DESCRIPTOR
BY VALUE 1
RETURNING RESP

IF RESP = ZEROS
CALL "GetLastError" WITH STDCALL RETURNING RESP

DISPLAY "ERROR GetSecurityDescriptorControl, RC: " RESP

EXIT PROGRAM
END-IF

MOVE LENGTH OF SECURITY-ATTRIBUTES TO nLength

SET lpSecurityDescriptor TO ADDRESS OF SECURITY-DESCRIPTOR

MOVE H"00" TO bInheritHandle
MOVE 0 TO dwStackSize

SET lpStartAddress TO ENTRY "RUTINA@0"

MOVE 0 TO lpParameter

*> Kernel32.lib
CALL "CreateThread" WITH STDCALL USING BY REFERENCE SECURITY-ATTRIBUTES
BY VALUE dwStackSize
BY VALUE R-lpStartAddress
BY REFERENCE lpParameter
BY VALUE dwCreationFlags
BY REFERENCE lpThreadId
RETURNING RESP

IF RESP = ZEROS
CALL "GetLastError" WITH STDCALL RETURNING RESP

DISPLAY "ERROR CreateThread, RC: " RESP

EXIT PROGRAM
END-IF

PERFORM 10 TIMES
INVOKE CmList1 "AddString" USING "¡Este es el Thread del Form!"

CALL "Sleep" WITH STDCALL USING BY VALUE 1000
END-PERFORM


---------- Post añadido : 21:59 ---------- Post anterior : 22:42 ----------

Nitzer, malas noticias. Es posible hacerlo en COBOL, pero no en Fujitsu, porque el último no trabaja con parámetros BY VALUE. Es decir, necesitaríamos algo como esto:


IDENTIFICATION DIVISION.
PROGRAM-ID. "RUTINA".

DATA DIVISION.
LINKAGE SECTION.
01 P-THREAD POINTER.
PROCEDURE DIVISION WITH STDCALL LINKAGE USING BY VALUE P-THREAD.



Y parece ser que la función que pasamos a la hora de crear el nuevo Thread lo necesita para poder gestionarlo:

DWORD WINAPI mythread(LPVOID lpParameter){

Así que, lo que se podría intentar es pasar por una pasarela en C (crear une DLL intermediaria). Pero para probar esto necesito aún más tiempo. No sé cuándo lo voy a poder hacer.

Así que de momento te propongo que pruebes la otra solución de usar Timers como funciones en un Thread separado, a mi me ha funcionado de maravilla.

Nitzer
17 de abril de 2019, 22:13
Kuk, tranquilo, no quiero quitarte mas tiempo :))

Eternamente agradecido por el trabajo que haces por todos nosotros.

NO es algo que me quite la vida.

MIs compañeros ya están con .NET C# a tope y poco a poco iré programando menos yo y mas ellos.

Me voy a dedicar mas a pensar (análisis), la empresa no para de crecer y no me queda otra.

Kuk
18 de abril de 2019, 21:40
@Nitzer, lo conseguíii y sin pasarelas ni nada :mola::mola::mola: Multihilo (Thread) en PowerCOBOL - Cobol Foro (https://www.cobolforo.es/showthread.php?t=1875)

Nitzer
19 de abril de 2019, 11:20
:loco::fiesta:

Maravilloso, voy a intentar comprender el código y probarlo.
No hay palabras para semejante trabajo :))))

Kuk
21 de abril de 2019, 16:01
Nitzer, mantennos al corriente, lógicamente lo he probado pero siempre se te puede escapar algo. ;)

Además, me parece un tema interesante, si el código te parece comprensible o no.


P.D. Sinceramente, nuestro foro me parece el más rico en código "oro" del mundo entero. :) Al menos de los que yo conozco, incluyendo los que están en inglés.
Quiero decir, tenemos ejemplos que no he visto nunca en ningún otro sitio.

---------- Post añadido : 16:01 ---------- Post anterior : 21:40 ----------

Por si a alguien les interesa cómo hacerlo vía Timer: [Componente] ctList de Dbi Tech - Problema con el Font... - COBOL Foro (https://www.cobolforo.es/showthread.php?p=3051#post3051)

Kuk
4 de mayo de 2019, 14:42
Nitzer, ¿qué tal, lo has probado?

Nitzer
5 de mayo de 2019, 16:36
Nitzer, ¿qué tal, lo has probado?

Hola Kuk, aún no he podido, estoy con un proyecto complejo, pero te prometo que lo voy a hacer, a comprender y a poner aquí la experiencia :)

Ya puestos te cuento el proyecto con el que estoy full-time :)

Mejor, mañana tiro fotos y os lo cuento.

Kuk
11 de agosto de 2020, 12:15
@Nitzer, has podido hacerlo o de momento nada? ;)

Estoy intrigado, verlo en acción sería un placer la verdad :)

Nitzer
13 de agosto de 2020, 22:49
@kuk, soy un ......., sin palabras, pero no lo he probado, es una pena que no haya manera mejor de compartir todo lo que desarrollamos.
Hace un tiempo pensé en cambiar el front de la aplicación, me puse a buscar ideas hasta que sonó la flauta y estoy de lleno cambiando todos los diseños.

Me he hecho unas rutinas que llamo con #INCLUDE en los Opened y se encargan de todo.

Como he dicho, dadme ideas para ver como puedo compartir todo lo que hago o hacemos, que no sea youtube, que no sea tan "público"

Kuk
14 de agosto de 2020, 09:09
@Nitzer, podríamos alojar algún que otro vídeo aquí en el foro, lo que pasa es que muchos no van a poder ser, por el espacio que suelen ocupar.

JCantero
14 de agosto de 2020, 10:37
@Kuk, los videos se pueden subir a youtube de forma privada y aquí en el foro se pone el enlace.

Kuk
14 de agosto de 2020, 12:42
@JCantero, la verdad es que nunca he profundizado en el tema: un vídeo privado qué es exactamente? Que no aparece en la búsqueda y sólo accede gente que tenga el enlace?

JCantero
15 de agosto de 2020, 17:07
@Kuk, exacto.

Al publicarlo privado solo pueden verlo los que tengan el enlace.

Kuk
5 de enero de 2023, 15:22
@Nitzer, agárrate que vas a flipar en colores!!! Acabo de conseguir la recepción de valores BY VALUE en Fujitsu PowerCOBOL. Esto quiere decir que podemos hacer subclassing de cualquier función WinAPI, incluídas las que reciben valores BY VALUE. Porque como sabemos, el compilador de Fujitsu sólo trabaja BY REFERENCE...

:bat::macar:

Nitzer
5 de enero de 2023, 16:44
@Kuk, yo flipo con todo lo que pones y dices, pero ..... que podemos conseguir con eso jajajajajajajja

Kuk
5 de enero de 2023, 19:06
@Nitzer, Subclassing: recibir parámetros BY VALUE - Cobol Foro (https://www.cobolforo.es/showthread.php?t=1884)

Y echa un ojo a esto también: [Aporte] Ventanas estilo MDI (https://www.cobolforo.es/showthread.php?1582-Ventanas-estilo-MDI)

Nitzer
9 de enero de 2023, 13:01
@Kuk, me dejas anonadado jajajajaja, si que voy a ehcarle un vistazo, por todas estas cosas tenemos que hacer la quedada. Voy a intentar hacerla para un dia de estos.

Kuk
9 de enero de 2023, 14:17
@Nitzer, lo más importante, fíjate lo que hago con lo que me llega en la LINKAGE y lo vas a pillar enseguida.


IDENTIFICATION DIVISION.
PROGRAM-ID. "MyWndProc".
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 OldWndProc IS EXTERNAL PIC S9(9) COMP-5.
01 MAIN-HWND IS EXTERNAL PIC S9(9) COMP-5.

01 WM-NCACTIVATE PIC S9(9) COMP-5 VALUE H"86".

01 P1 POINTER.
01 HWND REDEFINES P1 PIC S9(9) COMP-5.
01 P2 POINTER.
01 MSG REDEFINES P2 PIC 9(9) COMP-5.
01 P3 POINTER.
01 WPARAM REDEFINES P3 PIC S9(9) COMP-5.
01 P4 POINTER.
01 LPARAM REDEFINES P4 PIC S9(9) COMP-5.

LINKAGE SECTION.
77 PARM1 PIC S9(9) COMP-5.
77 PARM2 PIC 9(9) COMP-5.
77 PARM3 PIC S9(9) COMP-5.
77 PARM4 PIC S9(9) COMP-5.

PROCEDURE DIVISION WITH STDCALL USING PARM1 PARM2 PARM3 PARM4.

MOVE FUNCTION ADDR(PARM1) TO P1
MOVE FUNCTION ADDR(PARM2) TO P2
MOVE FUNCTION ADDR(PARM3) TO P3
MOVE FUNCTION ADDR(PARM4) TO P4

IF MSG = WM-NCACTIVATE
MOVE 1 TO WPARAM
END-IF

CALL "CallWindowProcA" WITH STDCALL USING BY VALUE OldWndProc
BY VALUE HWND
BY VALUE MSG
BY VALUE WPARAM
BY VALUE LPARAM

GOBACK

Kuk
11 de enero de 2023, 15:39
@Nitzer, mira esto también: [Aporte] Colorear líneas de ListView (https://www.cobolforo.es/showthread.php?t=1589-Colorear-l%EDneas-de-ListView)

Nitzer
11 de enero de 2023, 16:06
@Kuk, si no paro de mirar jajajajaj, cuanto nos queda de aprender, da hasta miedo.

Kuk
11 de enero de 2023, 17:03
@Nitzer, ya ves, estoy flipando yo mismo. :D Pero lo pillas, de qué sirve el chanchullo del "engaño" para recibir valores BY VALUE?