Solved

Scrolling 2 Richedit controls in sync

Posted on 1998-12-13
11
1,830 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
  • 7
  • 3
11 Comments
 
LVL 12

Expert Comment

by:rwilson032697
Comment Utility
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
Comment Utility
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
Comment Utility
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
 

Author Comment

by:davegreen
Comment Utility
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
Comment Utility
Have you tried sending an EM_SCROLL message?
0
Do You Know the 4 Main Threat Actor Types?

Do you know the main threat actor types? Most attackers fall into one of four categories, each with their own favored tactics, techniques, and procedures.

 
LVL 12

Expert Comment

by:rwilson032697
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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

Maximize Your Threat Intelligence Reporting

Reporting is one of the most important and least talked about aspects of a world-class threat intelligence program. Here’s how to do it right.

Join & Write a Comment

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…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

744 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

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now