Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] Copiar al portapapeles (https://www.cobolforo.es/showthread.php?t=43)

Josber 20 de febrero de 2015 12:45

Copiar al portapapeles
 
¿ Alguien sabe el código para poner un botón de Copiar al Portapapeles ?

Gracias

Un saludo.-

Kuk 20 de febrero de 2015 13:14

La cosa no es tan facil como parece. Yo lo tengo hecho en un programa, pero lo que copio es texto plano que es facil de hacer. Luego si quieres copiar texto fon formato, imagebn, documento etc. ya se complica mas la cosa.

Se hace mediante WinAPI. Si te vale texto plano, esta tarde miro en casa el ejemplo y te lo pego aqui.


P.D. Por cierto, entiendo que no es el caso pero si necesitas copiar pegar datos solo dentro de tu aplicacion, puedes usar variables globales o incluso controls con la propiedad "Visible" desmarcada.

Josber 20 de febrero de 2015 13:43

Gracias Kuk, es texto plano puro y duro, y no es para uso interno, si no para pegarlo al wordpad, etc.

Un saludo.-

Kuk 20 de febrero de 2015 18:43

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  WS-HWND     PIC S9(9) COMP-5.
  5.  01  WM_CUT               PIC S9(9) COMP-5 VALUE H"0300".  
  6.  01  WM_COPY              PIC S9(9) COMP-5 VALUE H"0301".  
  7.  01  WM_PASTE             PIC S9(9) COMP-5 VALUE H"0302".  
  8.  PROCEDURE       DIVISION.
  9.      
  10.      MOVE POW-MP-WAIT TO "MousePointer" OF POW-SELF
  11.     *>--------------------------------------------
  12.      MOVE "hwnd" OF RichTextBox1 TO WS-HWND
  13.          
  14.      CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HWND
  15.                                             BY VALUE WM_COPY
  16.                                             BY VALUE 0
  17.                                             BY VALUE 0
  18.      CANCEL "SendMessageA"
  19.    
  20.      *>--------------------------------------------
  21.      MOVE POW-MP-DEFAULT TO "MousePointer" OF POW-SELF
  22.      

Adrianeloy 20 de abril de 2015 17:20

Alguien tendrá el codigo contrario, o sea para leer el contenido del portapapeles texto plano (o volcarlo a una variable de cobol)?
Ya se que es mucho pedir, pero...
A alguien le habrá quedado el codigo de la llamada para PowerCobol V.3?

Kuk 20 de abril de 2015 18:48

adrianeloy, el codigo de la accion contraria seria sustituir WM_COPY por WM_PASTE ;)
Para PowerCOBOL 3 no tengo ni idea.

Galileo 21 de diciembre de 2015 19:40

Cita:

Citación del post de Adrianeloy (Mensaje 432)
Alguien tendrá el codigo contrario, o sea para leer el contenido del portapapeles texto plano (o volcarlo a una variable de cobol)?
Ya se que es mucho pedir, pero...
A alguien le habrá quedado el codigo de la llamada para PowerCobol V.3?

No me cabe duda de que se debe poder hacer también en PC3. La cosa está en saber cómo se obtiene el identificador (el handle) del componente. Tal vez sea realizando SETFOCUS al control y luego invocando una función del API de Windows que nos devuelva dicho handle.

El caso es que he encontrado un sistema más sencillo que, eso sí, requiere de un programa externo. Se trata de una pequeñísima utilidad que envía pulsaciones simuladas al sistema operativo (concretamente Sendkeys, en http://orlando.mvps.org/SendKeysMore.asp). Es gratuito y fácil de utilizar. Aquí te pongo un ejemplo:

Código COBOL:
  1.     CALL SETFOCUS OF EDIT1.        
  2.     CALL EXECAPL OF SHEET1 USING "SendKeys.exe 0 0 ""Prueba de copy y paste"" ""^C"" ".

Los dos ceros indican, el primero, el número de segundos (o fracción) que ha de esperar antes de enviar la pulsación simulada (una vez que la ventana del programa indicado en el tercer parámetro esté ya con el foco); el segundo, el número de segundos que ha de esperar hasta desistir, si no encuentra la ventana. En el ejemplo, "Prueba de copy y paste" es el título de la ventana de mi programa PC3, y "^C" es la combinación de teclas que se envía al sistema operativo (en este caso, CTRL-C, es decir, el atajo que se usa para copiar al portapapeles).

Lo bueno es que simula cualquier combinación de teclas con cualquier programa. Lo veo muy práctico.

Y un quebradero de cabeza que te quitas.

Kuk 21 de diciembre de 2015 21:58

Galileo, Adrianeloy, echádle un vistazo aquí: Obtener el Handle (HWND) de un control - COBOL Foro ;)

Galileo 22 de diciembre de 2015 09:15

Vale, ya he probado el código Kuk. Pero no consigo que funcione el copy.

Código COBOL:
  1.  ENVIRONMENT DIVISION.
  2.  DATA        DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  WS-HWND-P  PIC S9(9) COMP-5.
  5.  01  WS-HWND-C  PIC S9(9) COMP-5.
  6.  01  WS-TEXTO   PIC X(50).
  7.  01  WM_CUT     PIC S9(9) COMP-5 VALUE 768.  
  8.  01  WM_COPY    PIC S9(9) COMP-5 VALUE 769.  
  9.  01  WM_PASTE   PIC S9(9) COMP-5 VALUE 770.  
  10.  
  11.  PROCEDURE DIVISION.
  12.      CALL SETFOCUS OF EDIT1. <* Este es el control con el texto que quiero copiar
  13.      CALL "GetActiveWindow" WITH STDCALL.
  14.      MOVE PROGRAM-STATUS TO WS-HWND-P.
  15.  
  16.      CALL "GetDlgItem" WITH STDCALL USING BY VALUE WS-HWND-P BY VALUE 1.
  17.      MOVE PROGRAM-STATUS TO WS-HWND-C.
  18.  
  19.      CALL "GetDlgItemTextA" WITH STDCALL USING BY VALUE WS-HWND-P BY VALUE 1 BY REFERENCE WS-TEXTO BY VALUE 50.
  20.      CALL DISPLAYMESSAGE OF SHEET1 USING WS-TEXTO. <* Muestra el texto del control
  21.  
  22.      CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HWND-C BY VALUE WM_COPY BY VALUE 0 BY VALUE 0.

Abro el bloc de notas y, cuando intento pegar el contenido del portapapeles, este aparece como vacío.

Kuk 22 de diciembre de 2015 09:23

Galileo, imagino que tu EDIT1 no tiene ID = 1. Si primero has puesto un botón y luego el EDIT, el último tendrá ID = 2. El ID es el orden del TAB.

Galileo 22 de diciembre de 2015 10:31

Cita:

Citación del post de Kuk (Mensaje 1427)
Galileo, imagino que tu EDIT1 no tiene ID = 1. Si primero has puesto un botón y luego el EDIT, el último tendrá ID = 2. El ID es el orden del TAB.

El ID es correcto porque el código de la línea 20 me lo muestra. Es el código de la línea 22 el que no parece funcionar.

Kuk 22 de diciembre de 2015 11:37

Galileo, lo he comprobado y efectivamente en PC3 no funciona. Será porque la clase del EDIT no hereda todo lo necesario del Edit estandar.

Galileo 22 de diciembre de 2015 22:37

Pensaba que estaba haciendo algo mal. Gracias por aclararme el misterio.


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

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