FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
Error al copiar texto
Saludos compas del Club Delphi
Hace tiempo estaba desarrollando una aplicación que monitoreaba el portapapeles en busca de contenido apto para mi aplicación, pero al encontrar un error que jamás pude erradicar, me dí por vencido, ahora he retomado esta aplicación de nuevo, y e identifico más o menos por donde va el error, usé el truco 214 de Trucomania y un artículo que leí en la revista Síntesis no. 17 de Grupo Albor, lo que hago es que al crear el form registrarme para ver los mensajes del portapapeles;
al destruir el form, informar que salgo de la cadena de mensajes del portapapeles:
al detectar un cambio en la cadena del portapapeles trato el mensaje:
y al recibir el mensaje de que ha cambiado el portapapeles ejecuto lo siguiente Ahora algo importante: el error sucede aquí: Solo cuando estoy ejecutando algún programa de Office, por ejemplo Excel y solamente cuando efectúo una operación de arrastre y lo raro es que algunas veces aparece el mensaje de error en Office y otras en mi aplicación, el mensaje de error de Office es: "No se puede vaciar el portapapeles"y el que aparece en mi aplicación es: "Cannot open clipboard", lo que me hace pensar que al efectuar una operación de arrastre del contenido de algún documento de Office sucede lo siguiente:
El código de aquí es solo de prueba, una vez que funcione exitosamente lo implementaré en mi aplicación. Bueno, después de alargarme un poco con la explicación de mi problema me despido, enviando un saludo y un abrazo amistoso a todos los delphimaniacos de Club Delphi y agradeciendo de una vez a todos aquellos que me puedan ayudar. Gracias
__________________
Herr Heins Faust |
#2
|
||||
|
||||
La filosofía es la siguiente:
Cualquier programa puede registrarse como Visor del portapapeles. Cuando el usuario copia algo en el portapapeles, windows mira quien es el primer programa "visor del portapapeles" (obviamente el programa de windows) y le pasa un mensaje indicando que el contenido del portapapeles ha cambiado. Ese programa, debe continuar la cadena, es decir, seguir informando al resto de programas que son visores del portapapeles del cambio surgido. Por tanto tenemos que: - Registrar nuestro programa para que capture cosas del Portapapeles automaticamente, y guardar quien es el siguiente programa "visor del portapapeles". Además debemos quitarnos de esa lista al cerrar nuestro programa:
- Obviamente necesitamos responder cuando cambie el portapapeles:
El error que yo veo, es que la linea tienes que ponerlo al final de la rutina ¿por qué?, porque un programa "visor del portapapeles" puede cambiar el contenido del mismo, y si lo hace, tu línea está desfasada con el contenido real del portapapeles. Es más yo lo modificaba y solo ponía esto:
Tu procedimiento WMChangeCBCHain creo que es inconsistente, simplemente elimínalo. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#3
|
||||
|
||||
¿y luego cómo sé cuál es el siguiente visor?
Gracias por tu respuesta... pero...
Cita:
__________________
Herr Heins Faust |
#4
|
||||
|
||||
Hola,
Cita:
Cita:
|
#5
|
||||
|
||||
Continuo con el error en office
Gracias por sus respuestas camaradas, aunque he usado la solución de Lepe han continuado los errores en Office, por lo que yo creo que la solución es en saber si algún otro programa ha bloqueado temporalmente el portapapeles, pues así antes de extraer el contenido del portapapeles puedo preguntar si está disponible, y evitar el error de Office.
De nuevo gracias por su ayuda y les mando un afectuoso saludo.
__________________
Herr Heins Faust |
#6
|
||||
|
||||
Te propongo una solución, no utilizar la unit clipbrd y copiar el contenido del portapapeles usando solo funciones de la API. Para copiar el texto podemos usar una función como esta:
La funcion anterior intentara copiar el texto del portapapeles, si no lo consigue devolvera una cadena vacia, pero no mostrara ningun error. Asi que podriamos utilizarla de la siguiente manera:
¿Que te parece? por lo menos a mi ya no me sale ningún error al arrastrar en excel. |
#7
|
||||
|
||||
Tengo un programa como he dicho, y me lee todo el contenido cada vez que se copia algo. Uso office 2002.
En casos de arrastrar y soltar, no me lee el portapapeles, ya no se "copia nada en esos momentos", incluso arrastrando desde excel a word y viceversa. Puede que un office de versión superior esté "haciendo virguerías". Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#8
|
||||
|
||||
Lepe yo tampoco entiendo porque da ese error, así que monte el código tal como describíais y en el excel al arrastrar texto de una celda a otra me daba un error en mi aplicación. Con la función que puse ya no da errores mi aplicación, pero una de cada 3 veces (aproximadamente, no las conte ) excel muestra el error "No se puede vaciar el portapapeles", así que volvemos a estar en la misma
|
#9
|
||||
|
||||
Pues yo tampoco sé que pasa.
Acabo de hacer la prueba como dices, seoane, y efectivamente si se copia texto en el portapapeles con el office 2002. Mi programa hace uso del Microsoft Agent y habla por los altavoces (parlantes) el texto que se copia. acabo de escribir en una celda "quillo no me asustes que me da una flojera del copon" y moviendo la celda 15 veces consecutivas, le ha dado una flojera... En serio, al menos en mi ordenador no puedo reproducir el error. Me funciona correctamente. Ahora mismo no sé como tendrá el código nuestro compañero, yo al menos no toco el Result del TMessage para nada. Tengo el presentimiento de que si el siguiente "visor del portapapeles" no es válido, se está devolviendo false en ese parámetro lo cual "podría provocar" que excel mostrase ese error ... no sé... Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#10
|
||||
|
||||
Un comentario: en algún momento de este hilo, eliminaron al procedimiento WMChangeCBCHain. Esto no debe hacerse porque es fundamental para preservar el orden de la cadena. El valor de la siguiente ventana que se obtiene al usar SetClipboardViewer puede cambiar durante la vida de la aplicación, por ejemplo si el siguiente visor se sale de la cadena. Por ello es que hay que manejar WM_CHANGECBCHAIN, para detectar esos cambios.
// Saludos |
#11
|
||||
|
||||
Parece que este error no es la primera vez que aparece, según este articulo de microsoft el programa GetRight provocaba el mismo error si tenia activada la función de Monitorizar el portapapeles:
http://support.microsoft.com/default...b;en-us;196620 Para colmo, acabo de volver a probar con el mismo código de antes y ahora no consigo que aparezca el error y me canse de arrastrar celdas Parece mas un capricho del excel que un error por nuestra parte. |
#12
|
||||
|
||||
Estos de Microsoft son increibles. Le echan la culpa al GetRight por montar un visor del portapapeles, siendo que éstos están documentados en el SDK, en lugar de aceptar que su excel está haciendo un uso incorrecto del clipboard.
// Saludos |
#13
|
||||
|
||||
Esos del Microsoft
Pues quien lo iba a decir, Microsoft es el creador de Windows y de Office, pero no parece, es como cuando uno activa la alarma de su propio coche...
el primero que cae es el dueño.
__________________
Herr Heins Faust |
#14
|
||||
|
||||
Gracias camaradas
Efectivamente, me sirvió la solución de seoane, pero Excel continua haciendo de las suyas, pues ni modo, sino pues no hacer uso del monitor del portapapeles.
Gracias por su ayuda camaradas.
__________________
Herr Heins Faust |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
copiar texto sin formato en un TRichEdit!!!! | aranel | OOP | 1 | 20-12-2005 20:24:17 |
Copiar texto en RichEdit | darkerbyte | Varios | 4 | 16-11-2005 02:37:17 |
Copiar el texto de un RichEdit | soul6301 | Varios | 5 | 11-11-2005 04:31:24 |
Copiar las columnas en un archivo de texto | Paulina | DelphiPACK | 0 | 08-10-2004 19:54:07 |
Copiar texto de un RichEdit a otro | SCH | Varios | 2 | 11-08-2003 09:16:26 |
|