?
Solved

Scrolling 2 Richedit controls in sync

Posted on 1998-12-13
11
Medium Priority
?
1,995 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
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
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 

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 1400 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

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
In a question here at Experts Exchange (https://www.experts-exchange.com/questions/29062564/Adobe-acrobat-reader-DC.html), a member asked how to create a signature in Adobe Acrobat Reader DC (the free Reader product, not the paid, full Acrobat produ…
This lesson discusses how to use a Mainform + Subforms in Microsoft Access to find and enter data for payments on orders. The sample data comes from a custom shop that builds and sells movable storage structures that are delivered to your property. …
Suggested Courses
Course of the Month17 days, 3 hours left to enroll

864 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