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)

Joseg 23 de enero de 2024 19:14

Arrastrar y soltar archivos (Drag and Drop)
 
Hola,

¿Hay alguna forma en Powercobol de arrastrar un archivo a un objeto (por ejemplo, una Listview) y capturar el nombre y/o la ubicación del archivo?
El objetivo sería arrastrar imágenes desde una carpeta de Windows a una aplicación Powercobol. Actualmente uso esta función:
Código COBOL:
  1. INVOKE Pow-Self "GetFileName" ...
pero para los tiempos que corren no es tan práctico.

Gracias,
Jose

Kuk 24 de enero de 2024 00:45

@Joseg, nunca he investigado el tema, pero tenemos un ejemplo en el foro: https://www.cobolforo.es/showthread....ight=drag+drop

A ver qué tal. ;)

Joseg 24 de enero de 2024 10:37

Cita:

Citación del post de Kuk (Mensaje 9240)
@Joseg, nunca he investigado el tema, pero tenemos un ejemplo en el foro: https://www.cobolforo.es/showthread....ight=drag+drop

A ver qué tal. ;)

Aquí el objetivo es diferente. Arrastre archivos a un contenedor, solo para identificar más fácilmente su origen.

Kuk 24 de enero de 2024 18:30

@Joseg, no lo he probado pero por lo que veo no es tan difícil. Mira esto a ver si te sirve:
  1. https://stackoverflow.com/questions/...-files-is-done
  2. https://learn.microsoft.com/en-us/cp...?view=msvc-170

Joseg 24 de enero de 2024 19:17

Cita:

Citación del post de Kuk (Mensaje 9246)
@Joseg, no lo he probado pero por lo que veo no es tan difícil. Mira esto a ver si te sirve:
  1. https://stackoverflow.com/questions/...-files-is-done
  2. https://learn.microsoft.com/en-us/cp...?view=msvc-170

Eso es exactamente lo que pretendía... ¡pero pasar a Cobol es otra cuestión! Pero voy a intentar.
COPY y PAST puedo hacer (CTR+C / CTRL+V).

Gracias

Kuk 26 de enero de 2024 10:15

1 Archivos Adjunto(s)
@Joseg, lo he probado (la opción de WinAPI) y funciona perfectamente. :bien:

Lo primero, creas un fichero nuevo en el directrio del proyecto y lo llamas MyWndProc.cbl. Luego lo añades en el proyecto (import) y le pegas el siguiente contenido:

Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID. "MyWndProc".
  3.  ENVIRONMENT DIVISION.
  4.  DATA DIVISION.
  5.  WORKING-STORAGE SECTION.  
  6.  01  OldWndProc     IS  EXTERNAL PIC S9(9) COMP-5.
  7.  
  8.  
  9.  01  WM_DROPFILES   PIC  S9(9) COMP-5 VALUE H"0233".  
  10.  
  11.  01  P1                   POINTER.
  12.  01  HWND REDEFINES P1    PIC S9(9) COMP-5.
  13.  01  P2                   POINTER.
  14.  01  MSG  REDEFINES P2    PIC  9(9) COMP-5.
  15.  01  P3                   POINTER.
  16.  01  WPARAM REDEFINES P3  PIC S9(9) COMP-5.
  17.  01  P4                   POINTER.
  18.  01  LPARAM REDEFINES P4  PIC S9(9) COMP-5.
  19.  
  20.  01  dropFileName         pic x(250).
  21.  01  fileSize             pic 9(4) comp-5.
  22.  
  23.  LINKAGE SECTION.
  24.  77  PARM1                PIC S9(9) COMP-5.
  25.  77  PARM2                PIC  9(9) COMP-5.
  26.  77  PARM3                PIC S9(9) COMP-5.
  27.  77  PARM4                PIC S9(9) COMP-5.
  28.  
  29.  PROCEDURE DIVISION WITH STDCALL USING PARM1 PARM2 PARM3 PARM4.
  30.      
  31.      MOVE FUNCTION ADDR(PARM1) TO P1
  32.      MOVE FUNCTION ADDR(PARM2) TO P2
  33.      MOVE FUNCTION ADDR(PARM3) TO P3
  34.      MOVE FUNCTION ADDR(PARM4) TO P4
  35.      
  36.      IF  MSG = WM_DROPFILES
  37.          call "DragQueryFileA" with stdcall using by value WPARAM
  38.                                                   by value 0
  39.                                                   by reference dropFileName
  40.                                                   by reference fileSize
  41.          
  42.          display "Fichero: " dropFileName                                                  
  43.      END-IF
  44.          
  45.      CALL "CallWindowProcA" WITH STDCALL USING BY VALUE OldWndProc
  46.                                                BY VALUE HWND
  47.                                                BY VALUE MSG
  48.                                                BY VALUE WPARAM
  49.                                                BY VALUE LPARAM  
  50.    
  51.      GOBACK
  52.      .

Luego en el evento "Opened" del Form, pones esto:

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.  PROCEDURE       DIVISION.
  13.      
  14.      set ptrMyWndProc to entry "MyWndProc@16"
  15.      
  16.      move "hwnd" of pow-self to wsHwnd
  17.      
  18.      call "GetWindowLongA" with stdcall using by value wsHwnd
  19.                                               by value GWLP-WNDPROC
  20.                                               returning OldWndProc
  21.                                              
  22.      call "SetWindowLongA" with stdcall using by value wsHwnd
  23.                                               by value GWLP-WNDPROC
  24.                                               by value newWndProc
  25.  
  26.      call "DragAcceptFiles" with stdcall using by value wsHwnd
  27.                                                by value pow-true

No olvides de poner la directiva de compilación ALPHAL(WORD) tanto en las propiedades de los Scripts de Eventos como en las del fichero myWndProc.cbl.

Necesitarás la librería que va en adjuntos. Y listo, a mi me funciona!



P.D. me da que a nuestro amigo @Nitzer le va a gustar también esto :mola:

Joseg 26 de enero de 2024 13:49

¡¡¡Asombroso!!! Muchas gracias
:bien:



Cita:

Citación del post de Kuk (Mensaje 9248)
@Joseg, lo he probado (la opción de WinAPI) y funciona perfectamente. :bien:

Lo primero, creas un fichero nuevo en el directrio del proyecto y lo llamas MyWndProc.cbl. Luego lo añades en el proyecto (import) y le pegas el siguiente contenido:

Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID. "MyWndProc".
  3.  ENVIRONMENT DIVISION.
  4.  DATA DIVISION.
  5.  WORKING-STORAGE SECTION.  
  6.  01  OldWndProc     IS  EXTERNAL PIC S9(9) COMP-5.
  7.  
  8.  
  9.  01  WM_DROPFILES   PIC  S9(9) COMP-5 VALUE H"0233".  
  10.  
  11.  01  P1                   POINTER.
  12.  01  HWND REDEFINES P1    PIC S9(9) COMP-5.
  13.  01  P2                   POINTER.
  14.  01  MSG  REDEFINES P2    PIC  9(9) COMP-5.
  15.  01  P3                   POINTER.
  16.  01  WPARAM REDEFINES P3  PIC S9(9) COMP-5.
  17.  01  P4                   POINTER.
  18.  01  LPARAM REDEFINES P4  PIC S9(9) COMP-5.
  19.  
  20.  01  dropFileName         pic x(250).
  21.  01  fileSize             pic 9(4) comp-5.
  22.  
  23.  LINKAGE SECTION.
  24.  77  PARM1                PIC S9(9) COMP-5.
  25.  77  PARM2                PIC  9(9) COMP-5.
  26.  77  PARM3                PIC S9(9) COMP-5.
  27.  77  PARM4                PIC S9(9) COMP-5.
  28.  
  29.  PROCEDURE DIVISION WITH STDCALL USING PARM1 PARM2 PARM3 PARM4.
  30.      
  31.      MOVE FUNCTION ADDR(PARM1) TO P1
  32.      MOVE FUNCTION ADDR(PARM2) TO P2
  33.      MOVE FUNCTION ADDR(PARM3) TO P3
  34.      MOVE FUNCTION ADDR(PARM4) TO P4
  35.      
  36.      IF  MSG = WM_DROPFILES
  37.          call "DragQueryFileA" with stdcall using by value WPARAM
  38.                                                   by value 0
  39.                                                   by reference dropFileName
  40.                                                   by reference fileSize
  41.          
  42.          display "Fichero: " dropFileName                                                  
  43.      END-IF
  44.          
  45.      CALL "CallWindowProcA" WITH STDCALL USING BY VALUE OldWndProc
  46.                                                BY VALUE HWND
  47.                                                BY VALUE MSG
  48.                                                BY VALUE WPARAM
  49.                                                BY VALUE LPARAM  
  50.    
  51.      GOBACK
  52.      .

Luego en el evento "Opened" del Form, pones esto:

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.  PROCEDURE       DIVISION.
  13.      
  14.      set ptrMyWndProc to entry "MyWndProc@16"
  15.      
  16.      move "hwnd" of pow-self to wsHwnd
  17.      
  18.      call "GetWindowLongA" with stdcall using by value wsHwnd
  19.                                               by value GWLP-WNDPROC
  20.                                               returning OldWndProc
  21.                                              
  22.      call "SetWindowLongA" with stdcall using by value wsHwnd
  23.                                               by value GWLP-WNDPROC
  24.                                               by value newWndProc
  25.  
  26.      call "DragAcceptFiles" with stdcall using by value wsHwnd
  27.                                                by value pow-true

No olvides de poner la directiva de compilación ALPHAL(WORD) tanto en las propiedades de los Scripts de Eventos como en las del fichero myWndProc.cbl.

Necesitarás la librería que va en adjuntos. Y listo, a mi me funciona!



P.D. me da que a nuestro amigo @Nitzer le va a gustar también esto :mola:


Paulo 9 de febrero de 2024 18:34

1 Archivos Adjunto(s)
Hola.
Está a dar-me um erro na compilação.
Podem ajudar-me?
Gracias

fastpho 9 de febrero de 2024 19:53

Hola @Paulo , que error de compilación te da ? :help:

Saludos ...

Paulo 9 de febrero de 2024 20:05

1 Archivos Adjunto(s)
Cita:

Citación del post de fastpho (Mensaje 9281)
Hola @Paulo , que error de compilación te da ? :help:

Saludos ...

Hola fastpho
Em anexo envio imagem com o erro
Gracias

Kuk 10 de febrero de 2024 15:06

@Paulo, se te habrá olvidado añadir la librería shell32.lib en tu proyecto, va dentro del ZIP

Veo que has puesto la directiva ALPHAL(WORD) porque el nombre de la función aparece en Camel-Case, pero sin la librería no va a compilar porque no sabe dónde está la función.

Si has añadido la librería y te sigue dando error, tienes que hacer REBUILD ALL para recompilarlo todo y funcionará.

Paulo 11 de febrero de 2024 10:08

1 Archivos Adjunto(s)
Cita:

Citación del post de Kuk (Mensaje 9283)
@Paulo, se te habrá olvidado añadir la librería shell32.lib en tu proyecto, va dentro del ZIP

Veo que has puesto la directiva ALPHAL(WORD) porque el nombre de la función aparece en Camel-Case, pero sin la librería no va a compilar porque no sabe dónde está la función.

Si has añadido la librería y te sigue dando error, tienes que hacer REBUILD ALL para recompilarlo todo y funcionará.


Hola Kuk

Adicionei a livraria shell32.lib, fiz o rebuild all, mas o erro continua...

Kuk 11 de febrero de 2024 12:16

@Paulo, es que la función DragAcceptFiles no es así, sólo lleva 2 parámetros, y tú le has añadido un parámetro demás y es por eso que no compila, debe ser así:

Código COBOL:
  1.      call "DragAcceptFiles" with stdcall using by value wsHwnd
  2.                                                by value pow-true

Y tú tienes 2 veces el pow-true:

Código COBOL:
  1.     call "DragAcceptFiles" with stdcall using by value wsHwnd
  2.                                               by value pow-true
  3.                                               by value pow-true.
  4.                                                      

Paulo 12 de febrero de 2024 11:19

Gracias Kuk,
Tanto verifiquei a rotina e não vi esse erro.

Kuk 12 de febrero de 2024 12:50

@Paulo, de nada compañero, ya nos cuentas y si puedes enséñanos cómo te ha quedado ;)

fastpho 12 de noviembre de 2024 18:56

Hola , estoy implementado Arrastrar y soltar archivos (Drag and Drop) sin procedure-pointer
obteniendo la direccion de la funcion , la consulta cual seria la mejor forma de atrapar el nombre del archivo arrastrado , lo estoy haciendo con un cmtimer
pero no se si es la forma correcta :piensa::piensa::piensa:
Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  wsHwnd         pic s9(9) comp-5.
  5.  01  newWndProc     pic s9(9) comp-5.
  6.  01  OldWndProc     external pic s9(9) comp-5.
  7.  01  GWLP-WNDPROC   pic s9(9) comp-5 value -4.
  8.  01  hModule        pic s9(9) comp-5.
  9.  
  10.  PROCEDURE       DIVISION.      
  11.    
  12.                                                      
  13.                                                      
  14.                                                      
  15.      move "hwnd" of pow-self to wsHwnd.
  16.      move wsHwnd to  "Text" OF CmText1        
  17.  
  18.      call "GetModuleHandleA" with stdcall using by value 0 returning hModule
  19. *    DISPLAY "hModule: " , hModule.          
  20.      call "GetProcAddress" with stdcall using by value hModule
  21.                                               by content "_ProcDragFile@16" & X"00"
  22.                                               returning newWndProc.
  23.      
y la imagen con
Código COBOL:
  1.  01 EXP-FILE-NAME              PIC X(250) GLOBAL EXTERNAL. *> Retorno del Procedimiento    
  2.     *cmtimer*
  3.      IF EXP-FILE-NAME NOT = SPACES THEN
  4. *         display "Fichero TIMER: " EXP-FILE-NAME        
  5.           MOVE EXP-FILE-NAME TO "ImageName" OF CmImage1
  6.       END-IF.  
Saludos ....

Kuk 13 de noviembre de 2024 12:56

@fastpho, no sé si he entendido bien tu pregunta, pero en este caso hacemos algo parecido a lo de buscar y traer enfrente un programa. Es decir que le pasamos una función como parámetro, la cual se ejecuta cuando ocurra el evento correspondiente. Con lo cual, no necesitas un Timer, puedes hacer lo que necesitas en la propia función "MyWndProc" que se ejecuta, como decía, automáticamente cuando ocurra el evento.

fastpho 13 de noviembre de 2024 13:35

@Kuk , no me explicado bien , desde el ProcDragFile.cbl obtengo el archivo arrastrado
con la funcion DragQueryFileA :

Código COBOL:
  1.           IF  MSG = WM_DROPFILES
  2.              call "DragQueryFileA" with stdcall using by value WPARAM
  3.                                                       by value 0
  4.                                                       by reference dropFileName
  5.                                                       by reference fileSize
  6.                
  7.                    
  8.                       string dropFileName  
  9.                           delimited by x"00" into EXP-FILE-NAME
  10.                       end-string
  11.  
  12. *                    display "Fichero: " EXP-FILE-NAME        
  13. *                    display "fileSize: " fileSize *> SIEMPRE ZEROS        
  14.           END-IF.

en la variable dropFileName tengo el nombre del archivo
ahora como le paso ese dato al formulario que tiene en este caso un control
cmImage , la unica forma que encontre es metiendo un control timer en el formulario,
en la variable que se llama EXP-FILE-NAME que esta declarada como External Global en el
formulario y en el ProcDragFile.cbl como External

Luego en el timer tengo :
Código COBOL:
  1.       IF EXP-FILE-NAME NOT = SPACES THEN
  2.          *> display "Fichero TIMER: " EXP-FILE-NAME        
  3.           MOVE EXP-FILE-NAME TO "ImageName" OF CmImage1
  4.       END-IF.

Esta implementacion me esta funcionando , pero tengo el timer consumiendo cpu



Saludos...

Kuk 13 de noviembre de 2024 19:07

@fastpho, ah vale, ya lo entiendo.

Pues mira, tengo una solución que no vas a entender pero funciona (en mi caso por lo menos).

En "Opened" de tu Form pones esto:

Código COBOL:
  1.  WORKING-STORAGE SECTION.  
  2.  01  nCMIMAGE1 IS EXTERNAL PIC S9(9) COMP-5.
  3.  ...
  4.  PROCEDURE       DIVISION.
  5.      ...
  6.      move CmImage1 to nCMIMAGE1

En "MyWndProc" añades esto en la Working:

Código COBOL:
  1. *>-------------------
  2.  01 POW-0000 PIC S9(18) COMP-5.
  3.  01 POW-0001 PIC S9(9) COMP-5.
  4.  01 POW-0002 PIC S9(9) COMP-5.
  5.  01 POW-0003 PIC S9(9) COMP-5.
  6.  01 POW-0004 PIC S9(9) COMP-5.
  7.  01 POW-0005 PIC S9(9) COMP-5.
  8.  01 POW-0006 PIC X(8192).
  9.  01 POW-0007 PIC S9(9) COMP-5.
  10.  
  11.  01 nCMIMAGE1 IS EXTERNAL PIC S9(9) COMP-5.

Y en la procedure, en el IF MSG = WM_DROPFILES le añades este código, no intentes entenderlo, simplemente pégalo tal cual: ;)
Código COBOL:
  1.      ...
  2.      IF  MSG = WM_DROPFILES
  3.          call "DragQueryFileA" with stdcall using by value WPARAM
  4.                                                   by value 0
  5.                                                   by reference dropFileName
  6.                                                   by reference fileSize
  7.        
  8.          *> display "Fichero: " dropFileName
  9.         *>-------------
  10.          MOVE 117440513 TO POW-0000
  11.          MOVE 4 TO POW-0001
  12.          MOVE 0 TO POW-0002
  13.          MOVE 0 TO POW-0003
  14.          MOVE 0 TO POW-0004
  15.          MOVE 1 TO POW-0005
  16.          MOVE dropFileName TO POW-0006
  17.          MOVE 33636360 TO POW-0007
  18.          CALL "XPOW_INVOKE_BY_ID_2" USING VALUE nCMIMAGE1 REFERENCE POW-0000
  19.          VALUE POW-0001 POW-0002 POW-0003 POW-0004 POW-0005 POW-0007
  20.          REFERENCE POW-0006 END-CALL
  21.         *>-------------                                              
  22.      END-IF
  23.      ...

Rebuild ALL y ejecuta, a ver si funciona. Si no funciona, dime qué error te da.

fastpho 13 de noviembre de 2024 19:36

@Kuk me anduvo perfecto lo unico que añadi fueron los valores de :

Código COBOL:
  1.  
  2.  01 POW-0000 PIC S9(18) COMP-5.
  3.  01 POW-0001 PIC S9(9) COMP-5.
  4.  01 POW-0002 PIC S9(9) COMP-5.
  5.  01 POW-0003 PIC S9(9) COMP-5.
  6.  01 POW-0004 PIC S9(9) COMP-5.
  7.  01 POW-0005 PIC S9(9) COMP-5.
  8.  01 POW-0006 PIC X(8192).
  9.  01 POW-0007 PIC S9(9) COMP-5.
  10.  01 POW-0008 PIC S9(4) COMP-5.

Muchas Gracias
:mola::mola:
Saludos ...

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

Kuk 28 de noviembre de 2024 14:10

@Fito, bueno pues tu compi si está en el foro, lo podemos ver con él, o que se registre si no es el caso. Es un tema interesante y ayudaré en lo que pueda. :bien:


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

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