Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] Arrastrar y soltar archivos (Drag and Drop) (https://www.cobolforo.es/showthread.php?t=1716)

Kuk 13 de noviembre de 2024 20:04

@fastpho, sí, efectivamente se me han olvidado las variables en la Working de "MyWndProc", acabo de editar el post original :mm:

Me alegro de que te haya funcionado! :beber:

P.S. a @Nitzer le va a gustar todo esto :)

Kuk 15 de noviembre de 2024 09:31

@fastpho, se me ha ocurrido una manera más elegante de hacerlo.

En "Opened" de tu form pones:
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  imgControl     pic s9(9) comp-5 is external.
  3.  PROCEDURE       DIVISION.
  4.  
  5.      move CmImage1 to imgControl
  6.    

En "MyWndProc" haces esto:

Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID. "MyWndProc".
  3.  ENVIRONMENT DIVISION.
  4.  CONFIGURATION   SECTION.
  5.  SPECIAL-NAMES.
  6.  REPOSITORY.
  7.      CLASS COM AS "*COM"
  8.      .
  9.  DATA DIVISION.
  10.  WORKING-STORAGE SECTION.  
  11. ...
  12.  01  imgControl     pic s9(9) comp-5 is external.
  13.  01  comClass      object reference COM.
  14. ...
  15.  
  16.      IF  MSG = WM_DROPFILES        
  17.          call "DragQueryFileA" with stdcall using by value WPARAM
  18.                                                   by value 0
  19.                                                   by reference dropFileName
  20.                                                   by reference fileSize
  21.          
  22.          if  comClass = null
  23.              call "POWERCONVTOCOM" USING imgControl RETURNING comClass
  24.          end-if
  25.          
  26.          invoke comClass "set-ImageName" using dropFileName
  27.      END-IF
  28.          

A ver qué tal, a mi me funciona. Y el código me gusta más, porque el CALL a "XPOW-..." es un poco chapuza. ;)

[HR][/HR]
El ejemplo limpio queda así:

"Opened" del form:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  wsHwnd         pic s9(9) comp-5.
  5.  01  ptrMyWndProc   procedure-pointer.
  6.  01  newWndProc redefines ptrMyWndProc pic s9(9) comp-5.
  7.  
  8.  01  OldWndProc     is external pic s9(9) comp-5.
  9.  
  10.  01  GWLP-WNDPROC   pic s9(9) comp-5 value -4.
  11.  
  12.  01  imgControl     pic s9(9) comp-5 is external.
  13.  PROCEDURE       DIVISION.
  14.  
  15.      move CmImage1 to imgControl
  16.          
  17.      set ptrMyWndProc to entry "MyWndProc@16"
  18.      
  19.      move "hwnd" of pow-self to wsHwnd
  20.      
  21.      call "GetWindowLongA" with stdcall using by value wsHwnd
  22.                                               by value GWLP-WNDPROC
  23.                                               returning OldWndProc
  24.                                              
  25.      call "SetWindowLongA" with stdcall using by value wsHwnd
  26.                                               by value GWLP-WNDPROC
  27.                                               by value newWndProc
  28.  
  29.      call "DragAcceptFiles" with stdcall using by value wsHwnd
  30.                                                by value pow-true
  31.                                                
  32.      

"MyWndProc":
Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID. "MyWndProc".
  3.  ENVIRONMENT DIVISION.
  4.  CONFIGURATION   SECTION.
  5.  SPECIAL-NAMES.
  6.  REPOSITORY.
  7.      CLASS COM AS "*COM"
  8.      .
  9.  DATA DIVISION.
  10.  WORKING-STORAGE SECTION.  
  11.  01  OldWndProc     IS  EXTERNAL PIC S9(9) COMP-5.
  12.  
  13.  
  14.  01  WM_DROPFILES   PIC  S9(9) COMP-5 VALUE H"0233".  
  15.  
  16.  01  P1                   POINTER.
  17.  01  HWND REDEFINES P1    PIC S9(9) COMP-5.
  18.  01  P2                   POINTER.
  19.  01  MSG  REDEFINES P2    PIC  9(9) COMP-5.
  20.  01  P3                   POINTER.
  21.  01  WPARAM REDEFINES P3  PIC S9(9) COMP-5.
  22.  01  P4                   POINTER.
  23.  01  LPARAM REDEFINES P4  PIC S9(9) COMP-5.
  24.  
  25.  01  dropFileName         pic x(250).
  26.  01  fileSize             pic 9(4) comp-5.
  27.  
  28.  01  imgControl     pic s9(9) comp-5 is external.
  29.  01  comClass       object reference COM.
  30.  
  31.  LINKAGE SECTION.
  32.  77  PARM1                PIC S9(9) COMP-5.
  33.  77  PARM2                PIC  9(9) COMP-5.
  34.  77  PARM3                PIC S9(9) COMP-5.
  35.  77  PARM4                PIC S9(9) COMP-5.
  36.  
  37.  PROCEDURE DIVISION WITH STDCALL USING PARM1 PARM2 PARM3 PARM4.
  38.      
  39.      MOVE FUNCTION ADDR(PARM1) TO P1
  40.      MOVE FUNCTION ADDR(PARM2) TO P2
  41.      MOVE FUNCTION ADDR(PARM3) TO P3
  42.      MOVE FUNCTION ADDR(PARM4) TO P4
  43.      
  44.      IF  MSG = WM_DROPFILES        
  45.          call "DragQueryFileA" with stdcall using by value WPARAM
  46.                                                   by value 0
  47.                                                   by reference dropFileName
  48.                                                   by reference fileSize
  49.          
  50.          
  51.          if  comClass = null            
  52.              call "POWERCONVTOCOM" USING imgControl RETURNING comClass
  53.          end-if
  54.          
  55.          invoke comClass "set-ImageName" using dropFileName
  56.      END-IF
  57.          
  58.      CALL "CallWindowProcA" WITH STDCALL USING BY VALUE OldWndProc
  59.                                                BY VALUE HWND
  60.                                                BY VALUE MSG
  61.                                                BY VALUE WPARAM
  62.                                                BY VALUE LPARAM  
  63.      
  64.      GOBACK
  65.      .
  66.      

fastpho 15 de noviembre de 2024 14:10

1 Archivos Adjunto(s)
@Kuk me funciona esta opcion tambien sin usar procedure-pointer, y es mas elegante digamos esta opcion,
lo unico es que tuve que modificar algunas lineas por que en la version 5.0 de PowerCobol para acceder
a objetos se debe usar :
Código:

REPOSITORY.
    CLASS OLE AS "*OLE"
    .


y para poder convertir la referencia a la Clase Ole
se debe usar :

Código COBOL:
  1.  CALL "POWERCONVTOOLE" USING ....

Muchas Gracias por tu tiempo
Saludos
:beber:
[ATTACH=CONFIG]1010[/ATTACH]

Kuk 15 de noviembre de 2024 15:36

@fastpho, declarando "OLE" también fucniona en PowerCOBOL v9 y v10. :bien:


Lo que no me gusta es que el CmImage de Power no funciona con nada salvo *.JPG y en un formato concreto de JPEG, que los hay diferentes y sigue siendo JPEG pero no los muestra todos. De GIF o PNG ya no digo nada... Es muy pobre este control.

Kuk 15 de noviembre de 2024 15:46

1 Archivos Adjunto(s)
@fastpho, madre mía el tonto que hemos hecho......... :D :D :D

Acabo de fijarme y CmImage tiene una propiedad llamada DropEnabled, que si la marcas, no hace falta ni WinAPI ni COM/OLE, funciona solito :mm: :rofl:
[ATTACH=CONFIG]1011[/ATTACH]

fastpho 15 de noviembre de 2024 16:25

@Kuk , si lo probe tildando la opcion DropEnabled y tambien funciona sin la
necesidad de OLE/API , y como decis lo malo del cmimage no toma .png por ejemplo
u otros formatos mas modernos

De todas maneras , DragQueryFileA, sirve por ejemplo para arrastrar archivos en general
a un listview u otro objeto , tiene su sentido todo esto, me parece a parte de arrastrar imagenes.


Saludos...

Kuk 15 de noviembre de 2024 18:17

@fastpho, sí efectivamente sirve para muchas cosas, pero para el propósito inicial, con un solo clic nos valía :D

Pero bueno, así hemos aprendido cosas nuevas también :bien:

Fito 27 de noviembre de 2024 03:18

Hola Amigos: ahi estuve probando esto y está espectacular, Felicitaciones.

Ahora una pregunta, esto mismo se puede hacer en RMCobol con WOW?

Saludos

Fito...

Kuk 27 de noviembre de 2024 18:10

@Fito, yo nunca he tenido RM así que no te puedo decir nada al respecto. Habrá que ir probando y a ver, lo mismo lo hacemos funcionar.

No sé si RM permite llamadas a la WinAPI (o cualquier librería C exterior), si es así, lo más seguro es que lo vamos a poder hacer. Es decir, lo principal, que es el SubClassing de la WinAPI.
Luego lo de invocar algo desde la función, será por OLE u otra cosa, es lo de menos. Encontraremos también la manera de hacerlo.

Te propongo que hagas pruebas, si te salta algún error o no funciona de manera esperada, lo tratamos juntos y vamos viendo :beber:
Lo único, si lo hacemos que sea en el apartado de RM, no aquí, para no mezclar las churras con las merinas ;)

Fito 28 de noviembre de 2024 12:20

Hola Carlitos:

En realidad yo no programo en RM, fue un colega que le mostré esto y como él tiene todo en RM me preguntó y trasladé su inquietud. Te digo más, ni siquiera tengo RM instalado en, mi máquina.

Gracias por responder.

Abrazo...

Fito...


La franja horaria es GMT +2. Ahora son las 02:07.

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