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


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.