Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-08-2006
lachuza lachuza is offline
Registrado
 
Registrado: ago 2006
Posts: 3
Poder: 0
lachuza Va por buen camino
Smile Scrollbar con un richedit y y un memo

HOLA A TODOS:
me gustaria mover con un mismo scrollbar un memo y un richedit para visualizar las mismas lineas al mismo tiempo
desde ya muchas gracias
Responder Con Cita
  #2  
Antiguo 28-08-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola lachuza, creo que en éste caso no se puede hacer, y digo creo, porque el scrollbar de un memo o un richedit no dispara ningún evento y no sé si se puede capturar cuando lo mueves.

Se me ocurre ahora mismo que se podría intentar trabajar con el componente ScrollBar de la pestaña Standard, tendrían que ser dos, coordinados totalmente entre ellos y cada uno con un memo o richedit según el caso.

A ver si podemos madurarlo un poco o alguien nos da una idea mejor.

Saludos
Responder Con Cita
  #3  
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
  #4  
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



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 09:41:21.


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