Solved

Scrolling 2 Richedit controls in sync

Posted on 1998-12-13
11
1,911 Views
Last Modified: 2013-11-22
I have 2 richedit controls. I want to scroll one of them in sync with the other... so that if I cursor up/down or scroll using the scroll bar, the other richedit scrolls with it. Anyone have any ideas for the best way to do this?
0
Comment
Question by:davegreen
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 3
11 Comments
 
LVL 12

Expert Comment

by:rwilson032697
ID: 1350861
Create a component derived from TRichEdit and override the WM_HSCROLL and WM_VSCROLL messages. In the handlers for these messages send a copy of them to the second memo which will then scroll in step with the first memo.

Cheers,

Raymond.
0
 

Author Comment

by:davegreen
ID: 1350862
Thanks for a quick response!

I am actually using two WPTools Richedits... have you got any example code to give me more of an idea what to do?
0
 
LVL 12

Expert Comment

by:rwilson032697
ID: 1350863
You are too quick Dave!

After dashing off that quick answer I decided to give it a go. I am very embarassed to say the initial approach I outlined does not appear to work. I also tried overriding the WM_NCHITTEST message and passing that along but again this didn't work.

You should reject my answer and allow other experts to answer it. My apologies.

Cheers,

Raymond.

0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:davegreen
ID: 1350864
Thanks Raymond,
Well in theory it seems easy to do..but I have yet to come p with a solution. Still its not a thing you need to do everyday.

Dave
0
 
LVL 3

Expert Comment

by:philipleighs
ID: 1350865
Have you tried sending an EM_SCROLL message?
0
 
LVL 12

Expert Comment

by:rwilson032697
ID: 1350866
Dave, I wrote this (code below), which DOES work in terms of keeping them in sync when the user click on a scroll bar (I actually messed up the first attempt which is why it didn't work :-( )

Unfortunately this doesn't deal with the user arrowing down. Though I think this could be done with using EM_GETFIRSTVISIBLELINE and EM_SETFIRSTVISIBLELINE in the OnChange event (I havn't tried it out yet - I'll let you know how I go...)

I also tried EM_SCROLL (as Philipleighs suggested), but for some reason the control does not appear to be sent that message.

Cheers,

Raymond.

unit Unit1;

interface

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

type
  TMyRichEdit = class(TRichEdit)
    protected
      procedure OnWMHScroll(var Message : TMessage); message WM_HSCROLL;
      procedure OnWMVScroll(var Message : TMessage); message WM_VSCROLL;

    public
      SyncWithRichEdit : TRichEdit;
  end;

procedure Register;

implementation

{ TMyRichEdit }

procedure TMyRichEdit.OnWMHScroll(var Message: TMessage);
begin
  SendMessage(SyncWithRichEdit.Handle, WM_HSCROLL, Message.WParam, Message.LParam);
end;

procedure Register;

begin
  RegisterComponents('Samples', [TMyRichEdit]);
end;

procedure TMyRichEdit.OnWMVScroll(var Message: TMessage);
begin
 SendMessage(SyncWithRichEdit.Handle, WM_VSCROLL, Message.WParam, Message.LParam);
 inherited;
end;

end.

0
 
LVL 12

Expert Comment

by:rwilson032697
ID: 1350867
Except there isn't a EM_SETFIRSTVISIBLELINE so you can't do

  RichEdit1.Perform(EM_SETFIRSTVISIBLELINE,
  Perform(EM_GETFIRSTVISIBLELINE, 0, 0));

sigh.

Raymond.
0
 
LVL 12

Expert Comment

by:rwilson032697
ID: 1350868
I tried this in the on change but jut moving the cursor does not generate an onchange...

Cheers,

Raymond

  if Richedit1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0) >
     MyRichEdit1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0) then
    MyRichEdit1.perform(em_scroll, SB_LINEDOWN, 0)
  else
    MyRichEdit1.perform(em_scroll, SB_LINEUP, 0);
0
 
LVL 12

Accepted Solution

by:
rwilson032697 earned 350 total points
ID: 1350869
OK here another attempt at the answer:

With the code I posted above for the WM_VSCROLL and WM_HSCROLL messages add this code (from above) to the KeyUp event like this:

procedure TForm1.MyRichEdit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_UP) or (Key = VK_Down) or (key = vk_left) or (key = vk_right) then
  begin
     if MyRichedit1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0) > 
            MyRichEdit2.Perform(EM_GETFIRSTVISIBLELINE, 0, 0) then
           MyRichEdit2.perform(em_scroll, SB_LINEDOWN, 0)
         else
           MyRichEdit2.perform(em_scroll, SB_LINEUP, 0);
  end
end;

Cheers,

Raymond.
0
 
LVL 12

Expert Comment

by:rwilson032697
ID: 1350870
Eureka! Here 'tis: A complete solution...

Cheers,

Raymond.

//************************* Source for the TMyRichEdit component...

unit Unit1;

interface

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

type
  TMyRichEdit = class(TRichEdit)
    protected
      procedure OnWMHScroll(var Message : TMessage); message WM_HSCROLL;
      procedure OnWMVScroll(var Message : TMessage); message WM_VSCROLL;
      procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
    public
      SyncWithRichEdit : TRichEdit;
  end;

procedure Register;

implementation

uses
  RichEdit;

{ TMyRichEdit }

procedure TMyRichEdit.OnWMHScroll(var Message: TMessage);
begin
  SendMessage(SyncWithRichEdit.Handle, WM_HSCROLL, Message.WParam, Message.LParam);
end;

procedure TMyRichEdit.OnWMVScroll(var Message: TMessage);
begin
 SendMessage(SyncWithRichEdit.Handle, WM_VSCROLL, Message.WParam, Message.LParam);
 inherited;
end;

procedure TMyRichEdit.CNNotify(var Message: TWMNotify);
var
  Diff : Integer;
  c : integer;
begin
  Inherited;
  with Message do
    case NMHdr^.code of
      EN_SELCHANGE:
      begin
        Diff := SyncWithRichEdit.Perform(EM_GETFIRSTVISIBLELINE, 0, 0) -
                 Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
        c := abs(diff);
        while c > 0 do
          begin
            if diff < 0 then
              SyncWithRichEdit.perform(em_scroll, SB_LINEDOWN, 0)
             else
              SyncWithRichEdit.perform(em_scroll, SB_LINEUP, 0);
            dec(c);
          end;
      end;
    end;
end;


procedure Register;

begin
  RegisterComponents('Samples', [TMyRichEdit]);
end;

end.

//************************* Form to test it with - just put a TRichEdit and a TMyRichEdit on it
unit RicheditForm;

interface

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

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    MyRichEdit1: TMyRichEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyRichEdit1.SyncWithRichEdit := RichEdit1;
end;


0
 

Author Comment

by:davegreen
ID: 1350871
BRILLIANT!
Thank you Raymond...this looks a great solution.
Just when I thought there was not solution you found one..

Thanks again.
Dave

0

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…
If you’ve ever visited a web page and noticed a cool font that you really liked the look of, but couldn’t figure out which font it was so that you could use it for your own work, then this video is for you! In this Micro Tutorial, you'll learn yo…

717 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question