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:
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: