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


La franja horaria es GMT +2. Ahora son las 01:18.

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