Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
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 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
No hay un evento "OnScroll" en estos controles pero sí reciben el mensaje WM_VSCROLL cuando ocurre un desplazamiento (vertical en este caso).

Para intercepatr este mensaje tendríamos que crear derivados de TMemo y TRichEdit y redefinir sus manejadores de ventanas (método protegido WndProc).

O bien, hacerlo al vuelo como muestro en el siguiente ejemplo:

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    RichEdit1: TRichEdit;

    procedure FormCreate(Sender: TObject);
  private
    { Bandera para controlar el desplazamiento }
    Scrolling: Boolean;

    { Manejadores de mensajes originales }
    MemoOldWndProc: TWndMethod;
    RichEditOldWndProc: TWndMethod;

    { Manejadores de mensajes de reemplazo }
    procedure MemoWndProc(Var Msg: TMessage);
    procedure RichEditWndProc(Var Msg: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Scrolling := false;

  { Guardar referencias a los manejadores de mensajes originales }
  MemoOldWndProc := Memo1.WindowProc;
  Memo1.WindowProc := MemoWndProc;

  { Reemplazar los manejadors de mensajes }
  RichEditOldWndProc := RichEdit1.WindowProc;
  RichEdit1.WindowProc := RichEditWndProc;
end;

{ Manejador de mensajes del memo }
procedure TForm1.MemoWndProc(var Msg: TMessage);
begin
  { Enviar mensaje al rich edit }
  if (Msg.Msg = WM_VSCROLL) and not Scrolling then
  begin
    Scrolling := true;
    RichEdit1.Perform(WM_VSCROLL, Msg.WParam, Msg.LParam);
    Scrolling := false;
  end;

  { Llamar al manejador original }
  MemoOldWndProc(Msg);
end;

{ Manejador de mensajes del rich edit }
procedure TForm1.RichEditWndProc(var Msg: TMessage);
begin
  { Enviar mensaje al memo }
  if (Msg.Msg = WM_VSCROLL) and not Scrolling then
  begin
    Scrolling := true;
    Memo1.Perform(WM_VSCROLL, Msg.WParam, Msg.LParam);
    Scrolling := false;
  end;

  { Llamar al manejador original }
  RichEditOldWndProc(Msg);
end;

end.

Pero hay que notar que no es perfecto, más que nada- supongo -porque los controles no dibujan exactamente igual su contenido. Por ejemplo, cargué un mismo texto en ambos controles con las mismas dimensiones, tipo de letra, etc, y tuve que aumentar unos pixeles a la altura del memo para que el contenido se viera igual. La sincronización funcionó bien si desplazaba dando click entre la flecha y el botón de la barra pero no sí se arrastraba el botón.

Pero bueno, creo que es un comienzo.

// Saludos

Última edición por roman fecha: 28-08-2006 a las 19:55:01.
Responder Con Cita
  #2  
Antiguo 04-11-2007
serrano serrano is offline
Registrado
 
Registrado: nov 2007
Posts: 2
Poder: 0
serrano Va por buen camino
La solución de roman, con una pequeña modificación, para que también funcione al arrastrar el botón central de la barra de desplazamiento:


Código Delphi [-]
 

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    RichEdit1: TRichEdit;

    procedure FormCreate(Sender: TObject);
  private
    { Bandera para controlar el desplazamiento }
    Scrolling: Boolean;

    { Manejadores de mensajes originales }
    MemoOldWndProc: TWndMethod;
    RichEditOldWndProc: TWndMethod;

    { Manejadores de mensajes de reemplazo }
    procedure MemoWndProc(Var Msg: TMessage);
    procedure RichEditWndProc(Var Msg: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Scrolling := false;

  { Guardar referencias a los manejadores de mensajes originales }
  MemoOldWndProc := Memo1.WindowProc;
  RichEditOldWndProc := RichEdit1.WindowProc;

  { Reemplazar los manejadores de mensajes }
  Memo1.WindowProc := MemoWndProc;
  RichEdit1.WindowProc := RichEditWndProc;
end;

{ Manejador de mensajes del memo }
procedure TForm1.MemoWndProc(var Msg: TMessage);
begin
  { Enviar mensaje al rich edit }
  if (Msg.Msg = WM_VSCROLL) and not Scrolling then
  begin
    Scrolling := true;
    if Msg.WParam < 9 then
      RichEdit1.Perform(WM_VSCROLL, Msg.WParam, Msg.LParam)
    else
      RichEdit1.Perform(WM_VSCROLL, (Msg.WParam-5)*13+5, Msg.LParam);
    Scrolling := false;
  end;

  { Llamar al manejador original }
  MemoOldWndProc(Msg);
end;

{ Manejador de mensajes del rich edit }
procedure TForm1.RichEditWndProc(var Msg: TMessage);
begin
  { Enviar mensaje al memo }
  if (Msg.Msg = WM_VSCROLL) and not Scrolling then
  begin
    Scrolling := true;
    if Msg.WParam < 9 then
      Memo1.Perform(WM_VSCROLL, Msg.WParam, Msg.LParam)
    else
      Memo1.Perform(WM_VSCROLL, Round((Msg.WParam-5)/13/65536)*65536+5, Msg.LParam);
    Scrolling := false;
  end;

  { Llamar al manejador original }
  RichEditOldWndProc(Msg);
end;

end.

Última edición por serrano fecha: 04-11-2007 a las 09:01:41.
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
Establecer numero maximo lineas RichEdit o Memo pepecharlie67 Varios 9 05-04-2006 22:52:52
Parte de un RichEdit a otro RichEdit (donde esté el cursor) Tomy Varios 3 21-12-2005 21:08:15
Campo memo tabla escribirlo en componente Memo Sayuri Conexión con bases de datos 2 18-08-2005 13:58:01
Scrollbar jrgarlok C++ Builder 1 15-03-2005 16:36:11
ScrollBar Mario1980 Varios 1 19-12-2004 23:00:03


La franja horaria es GMT +2. Ahora son las 20:32:09.


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