PDA

Ver la Versión Completa : [Sintaxis] Copiar al portapapeles


Josber
20 de febrero de 2015, 12:45
¿ 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
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-HWND PIC S9(9) COMP-5.
01 WM_CUT PIC S9(9) COMP-5 VALUE H"0300".
01 WM_COPY PIC S9(9) COMP-5 VALUE H"0301".
01 WM_PASTE PIC S9(9) COMP-5 VALUE H"0302".
PROCEDURE DIVISION.

MOVE POW-MP-WAIT TO "MousePointer" OF POW-SELF
*>--------------------------------------------
MOVE "hwnd" OF RichTextBox1 TO WS-HWND

CALL "SendMessageA" WITH STDCALL USING BY VALUE WS-HWND
BY VALUE WM_COPY
BY VALUE 0
BY VALUE 0
CANCEL "SendMessageA"

*>--------------------------------------------
MOVE POW-MP-DEFAULT TO "MousePointer" OF POW-SELF

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

CALL SETFOCUS OF EDIT1.
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 (http://www.cobolforo.es/showthread.php?t=296) ;)

Galileo
22 de diciembre de 2015, 09:15
Vale, ya he probado el código Kuk. Pero no consigo que funcione el copy.

ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-HWND-P PIC S9(9) COMP-5.
01 WS-HWND-C PIC S9(9) COMP-5.
01 WS-TEXTO PIC X(50).
01 WM_CUT PIC S9(9) COMP-5 VALUE 768.
01 WM_COPY PIC S9(9) COMP-5 VALUE 769.
01 WM_PASTE PIC S9(9) COMP-5 VALUE 770.

PROCEDURE DIVISION.
CALL SETFOCUS OF EDIT1. <* Este es el control con el texto que quiero copiar
CALL "GetActiveWindow" WITH STDCALL.
MOVE PROGRAM-STATUS TO WS-HWND-P.

CALL "GetDlgItem" WITH STDCALL USING BY VALUE WS-HWND-P BY VALUE 1.
MOVE PROGRAM-STATUS TO WS-HWND-C.

CALL "GetDlgItemTextA" WITH STDCALL USING BY VALUE WS-HWND-P BY VALUE 1 BY REFERENCE WS-TEXTO BY VALUE 50.
CALL DISPLAYMESSAGE OF SHEET1 USING WS-TEXTO. <* Muestra el texto del control

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