Ver Mensaje Individual
  #2  
Antiguo 26-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 28
Lepe Va por buen camino
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:
Código Delphi [-]
var NextClipboard:Thandle; // variable global 
procedure RegistrarVisor;
begin
      NextClipboard := SetClipboardViewer(frmppal.Handle);
end;

procedure EliminarVisor;
begin
      ChangeClipboardChain(FrmPpal.Handle, NextClipboard)
// aquí se elimina nuestro programa en la cadena de "visores del portapapeles" y se añade el que existía antes.
end;

- Obviamente necesitamos responder cuando cambie el portapapeles:
Código Delphi [-]
Tform1 = class(TForm)
  private
      procedure CambioPortapapeles(var Msg: TWMDrawClipboard); message wm_drawclipboard; 
// cada vez que se dibuje algo en el portapapeles, que nos avise
end;
implementation

procedure TFrmPpal.CambioPortapapeles(var Msg: TWMDrawClipboard);
var
  i:     Integer;
  found: Boolean;
  str:   String;

begin
  found := False;
  if (Clipboard.HasFormat(CF_TEXT)) then
  begin
    Str := clipboard.AsText; // ya tenemos el contenido nuevo

   // ahora enviamo el cambio que ha habido en el portapapeles al 
  // siguiente programa visor del portapapeles.
    SendMessage(NextClipboard, Msg.Msg, Msg.Msg, Msg.Msg);
  end
end;

El error que yo veo, es que la linea
Código Delphi [-]
 DrawClipBoardMessage.Result:= SendMessage(SiguienteHandle, WM_DRAWCLIPBOARD, 0, 0);
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
Código Delphi [-]
Memo1.Text:= ClipBoard.AsText
está desfasada con el contenido real del portapapeles.

Es más yo lo modificaba y solo ponía esto:
Código Delphi [-]
    SendMessage(NextClipboard, Msg.Msg, Msg.Msg, Msg.Msg);

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.
Responder Con Cita