Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Faust
Pero si elimino el procedimiento WMChangeCBChain cómo sé si el handle al siguiente visor sigue siendo válido
Según la ayuda del SDK de Win32 sobre la función "SetClipboardViewer":

Cita:
If the function succeeds, the return value identifies the next window in the clipboard viewer chain. If an error occurs or there are no other windows in the clipboard viewer chain, the return value is NULL. To get extended error information, call GetLastError.
Es decir, por eso Lepe recoge el resultado de dicha función en la variable "global" "NextClipboard", y es esta misma variable la que se utiliza después en la función "ChangeClipboardChain".
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 28-08-2006
Avatar de Faust
Faust Faust is offline
Miembro
 
Registrado: abr 2006
Ubicación: México D.F.
Posts: 930
Poder: 21
Faust Va por buen camino
Red face 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
Responder Con Cita
  #3  
Antiguo 28-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
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:

Código Delphi [-]
function LeerTexto: string;
var
  hText: THandle;
  pText: PChar;
begin
  Result:= EmptyStr;
  if IsClipboardFormatAvailable(CF_TEXT) then
    if OpenClipboard(0) then
    try
      hText:= GetClipboardData(CF_TEXT);
      if hText <> 0 then
      begin
        pText:= GlobalLock(hText);
        if pText <> nil then
        begin
          Result:= String(PChar(pText));
          GlobalUnlock(hText);
        end;
      end;
    finally
      CloseClipboard;
    end;
end;

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:

Código Delphi [-]
procedure TForm1.WMDrawClipboard(var Msg: TMessage);
var
  Str:   String;
begin
  Str:= LeerTexto;
  if Str <> EmptyStr then
    memo1.Lines.Add(Str);
  Msg.Result:= SendMessage(NextClipboard, Msg.Msg, Msg.wParam, Msg.LParam);
end;

¿Que te parece? por lo menos a mi ya no me sale ningún error al arrastrar en excel.
Responder Con Cita
  #4  
Antiguo 28-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 28-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 28-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 28-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #8  
Antiguo 28-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
copiar texto sin formato en un TRichEdit!!!! aranel OOP 1 20-12-2005 19:24:17
Copiar texto en RichEdit darkerbyte Varios 4 16-11-2005 01:37:17
Copiar el texto de un RichEdit soul6301 Varios 5 11-11-2005 03:31:24
Copiar las columnas en un archivo de texto Paulina DelphiPACK 0 08-10-2004 18:54:07
Copiar texto de un RichEdit a otro SCH Varios 2 11-08-2003 08:16:26


La franja horaria es GMT +2. Ahora son las 13:42:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi