Iniciar Sesión

Ver la Versión Completa : [PowerCOBOL v3] Crear un ProgressBar


Kuk
9 de octubre de 2015, 17:05
Amigos, aquí tenéis la creación de un ProgressBar en el PowerCOBOL 3:

Definimos 2 variables globales en la WORKING del SHEET:


01 GLB-HWND-SHEET IS GLOBAL PIC S9(9) COMP-5.
01 GLB-HWND-PRBAR IS GLOBAL PIC S9(9) COMP-5.


Para crear el ProgressBar se necesita el HWND del Sheet. Pero a diferencia del PowerCOBOL 9, el HWND no está disponible hasta que se cree realmente el Sheet (sea visible). Para ello ponemos un TIMER en el Sheet,para que el código se ejecute cuando el Sheet ya esté creado, (lo marcamos como activo ya en modo diseño), y en su único evento TIMER escribimos:


ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 FUNC PIC X(50).

01 GWL-HINSTANCE PIC S9(9) COMP-5 VALUE -6.

01 tagINITCOMMONCONTROLSEX.
05 dwSize PIC S9(9) COMP-5 VALUE 8.
05 dwICC PIC S9(9) COMP-5 VALUE 32.

01 WS-STYLE PIC S9(9) COMP-5.
01 WS-CLASS PIC X(50).
01 WS-TEXT PIC X(50).

01 WS-HINSTANCE PIC S9(9) COMP-5.

01 WS-ERROR PIC S9(9) COMP-5.

PROCEDURE DIVISION.

MOVE POW-OFF TO POW-ACTIVATE OF TIMER1

CALL "GetActiveWindow" WITH STDCALL

MOVE PROGRAM-STATUS TO GLB-HWND-SHEET
MOVE "InitCommonControlsEx" TO FUNC

CALL FUNC WITH STDCALL USING BY REFERENCE tagINITCOMMONCONTROLSEX

MOVE 1342177280 TO WS-STYLE
MOVE "msctls_progress32" & X"00" TO WS-CLASS
MOVE X"00" TO WS-TEXT

CALL "GetWindowLongA" WITH STDCALL USING BY VALUE GLB-HWND-SHEET
BY VALUE GWL-HINSTANCE

MOVE PROGRAM-STATUS TO WS-HINSTANCE

CALL "CreateWindowExA" WITH STDCALL USING BY VALUE 0
BY REFERENCE WS-CLASS
BY REFERENCE WS-TEXT
BY VALUE WS-STYLE
BY VALUE 50 *> POSICION X
BY VALUE 50 *> POSICION Y
BY VALUE 250 *> ANCHURA (width)
BY VALUE 25 *> ALTURA (height)
BY VALUE GLB-HWND-SHEET
BY VALUE 0 *> HMENU (NO HAY MENU)
BY VALUE WS-HINSTANCE
BY VALUE 0 *> PUNTERO INNECESARIO

MOVE PROGRAM-STATUS TO GLB-HWND-PRBAR

IF GLB-HWND-PRBAR = ZEROS THEN
CALL "GetLastError" WITH STDCALL

MOVE PROGRAM-STATUS TO WS-ERROR

DISPLAY "Error creacion ProgressBar: " WS-ERROR
END-IF


Para que nos tome apariencia moderna, en la misma carpeta del proyecto, ponemos el famoso fichero *.manifest y recompilamos.

Ya lo tenemos! Para hacer el "progress", usamos el siguiente código en cualquier lugar del Sheet donde lo hemos creado:


CALL "SendMessageA" WITH STDCALL USING BY VALUE GLB-HWND-PRBAR
1029
0
0


Resultado en adjuntos.

Importante. En el fichero COBOL85.CBR añadimos:


[SHEET1.ENTRY]
InitCommonControlsEx=ComCtl32.dll


Espero que os sirva el invento :cerv:

Lecterman
21 de octubre de 2015, 20:00
Hola Kuk!

Estoy trabajando con PWC7, copie tu código y funciona muy bien.
Surge una duda a la hora de utilizar el archivo .manifest, como lo hago referencia a el desde mi proyecto. :confused:

Desde ya gracias.

Fito
21 de octubre de 2015, 23:41
Hola Lecterman,

yo trabajo en power8, ya trae un objeto progress, y si mal no recuerdo el 7 también.

Saludos.

Fito...

Kuk
22 de octubre de 2015, 18:10
Lecterman, que yo sepa el ProgressBar viene en el paquete de controles de Power 7 y no hay necesidad de crearlo en dinámico.

En cuanto al archivo Manifest, échale un ojo aquí: COBOL Foro - Ver Mensaje Individual - [Aporte] Run-Times y Merge-Modules v9.0 (https://cobolforo.es/showpost.php?p=69&postcount=9)

Lecterman
22 de octubre de 2015, 21:16
Si si, pero me pareció interesante usar las clases que provee Windows para que el formulario asuma el "tema" del Windows donde esta corriendo.


Muchas gracias por tu respuesta!

Kuk
22 de octubre de 2015, 22:52
Lecterman, de nada hombre, para eso estamos, para ayudarnos y compartir opiniones! ;)

Lo del tema de Windows depende del archivo *.manifest, es decir, si no lo metemos en la misma carpeta, haciendo todo lo mismo, tendría apariencia clásica de Windows. O sea que, siempre y cuando la WndProc del control derive de los estándares de las clases de Windows, el archivo *.manifest funciona y aplica la apariencia de los controles de Windows de la versión 6.x

En cuanto al modo de crearlo, es programación Win32 estándar (el invocar las clases de Windows para crear controles), en los IDE-s de C++ por ejemplo se hace todo lo igual pero escribiéndolo en C++. EN visual Studio por ejemplo si creas un proyecto Win32 tienes que hacerlo todo por código. El proyecto visual es del tipo "Windows Forms". ;)

Kuk
3 de noviembre de 2015, 16:41
Reitero que InitCommonControlsEx no es necesario en Windows 7, al menos habiendo el fichero Manifest. Con lo cual, podéis omitir todo lo relacionado con dicha función.

Galileo
19 de diciembre de 2015, 21:25
Otro buen aporte. En 2003, cuando empezaba a jugar con PowerCOBOL 3.0, también eché a faltar este tipo de control, así que pergeñé unos cuantos con los que tenía PWC. Hice un programa de demostración y lo colgué en la sección Rutinas de ESCOBOL (http://www.escobol.com/modules.php?name=Downloads&d_op=getit&lid=73. En el año 2006 añadí otros más, pero esa modificación la perdí. Sin embargo, conservo un pantallazo de la misma. http://galileano.tripod.com/powercobol/progreso.jpg

758

Kuk
19 de diciembre de 2015, 23:29
Galileo, el pantallazo no se ve, corrige el enlace o cuélago directamente en el foro.

Galileo
20 de diciembre de 2015, 10:59
Juraría que lo probé ayer y funcionaba. En fin, aquí está.