Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   Cocina PowerCOBOL (https://www.cobolforo.es/forumdisplay.php?f=24)
-   -   [PowerCOBOL v3] Crear un ProgressBar (https://www.cobolforo.es/showthread.php?t=248)

Kuk 9 de octubre de 2015 17:05

Crear un ProgressBar
 
1 Archivos Adjunto(s)
Amigos, aquí tenéis la creación de un ProgressBar en el PowerCOBOL 3:

Definimos 2 variables globales en la WORKING del SHEET:

Código COBOL:
  1.  01  GLB-HWND-SHEET  IS GLOBAL PIC S9(9) COMP-5.
  2.  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:

Código COBOL:
  1.  ENVIRONMENT DIVISION.
  2.  DATA        DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  FUNC                   PIC X(50).
  5.  
  6.  01  GWL-HINSTANCE          PIC S9(9) COMP-5 VALUE -6.
  7.  
  8.  01  tagINITCOMMONCONTROLSEX.
  9.      05  dwSize             PIC S9(9) COMP-5 VALUE 8.
  10.      05  dwICC              PIC S9(9) COMP-5 VALUE 32.
  11.  
  12.  01  WS-STYLE               PIC S9(9) COMP-5.
  13.  01  WS-CLASS               PIC X(50).
  14.  01  WS-TEXT                PIC X(50).
  15.  
  16.  01  WS-HINSTANCE           PIC S9(9) COMP-5.
  17.  
  18.  01  WS-ERROR               PIC S9(9) COMP-5.
  19.  
  20.  PROCEDURE   DIVISION.
  21.          
  22.      MOVE POW-OFF TO POW-ACTIVATE OF TIMER1
  23.      
  24.      CALL "GetActiveWindow" WITH STDCALL
  25.      
  26.      MOVE PROGRAM-STATUS         TO GLB-HWND-SHEET    
  27.      MOVE "InitCommonControlsEx" TO FUNC
  28.      
  29.      CALL FUNC WITH STDCALL USING BY REFERENCE tagINITCOMMONCONTROLSEX
  30.      
  31.      MOVE 1342177280                  TO WS-STYLE
  32.      MOVE "msctls_progress32" & X"00" TO WS-CLASS
  33.      MOVE X"00"                       TO WS-TEXT
  34.      
  35.      CALL "GetWindowLongA" WITH STDCALL USING BY VALUE GLB-HWND-SHEET
  36.                                               BY VALUE GWL-HINSTANCE
  37.      
  38.      MOVE PROGRAM-STATUS TO WS-HINSTANCE
  39.      
  40.      CALL "CreateWindowExA" WITH STDCALL USING BY VALUE 0
  41.                                                BY REFERENCE WS-CLASS
  42.                                                BY REFERENCE WS-TEXT
  43.                                                BY VALUE WS-STYLE
  44.                                                BY VALUE 50  *> POSICION X
  45.                                                BY VALUE 50  *> POSICION Y
  46.                                                BY VALUE 250 *> ANCHURA (width)
  47.                                                BY VALUE 25  *> ALTURA (height)
  48.                                                BY VALUE GLB-HWND-SHEET
  49.                                                BY VALUE 0   *> HMENU (NO HAY MENU)
  50.                                                BY VALUE WS-HINSTANCE
  51.                                                BY VALUE 0   *> PUNTERO INNECESARIO
  52.      
  53.      MOVE PROGRAM-STATUS TO GLB-HWND-PRBAR
  54.      
  55.      IF  GLB-HWND-PRBAR = ZEROS THEN
  56.          CALL "GetLastError" WITH STDCALL
  57.          
  58.          MOVE PROGRAM-STATUS TO WS-ERROR
  59.          
  60.          DISPLAY "Error creacion ProgressBar: " WS-ERROR
  61.      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:

Código COBOL:
  1.      CALL "SendMessageA" WITH STDCALL USING BY VALUE GLB-HWND-PRBAR
  2.                                                      1029
  3.                                                      0
  4.                                                      0

Resultado en adjuntos.

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

Código:

[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

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

1 Archivos Adjunto(s)
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?n...p=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

Archivo Adjunto 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

1 Archivos Adjunto(s)
Juraría que lo probé ayer y funcionaba. En fin, aquí está.


La franja horaria es GMT +2. Ahora son las 04:35.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.