Delphi Tips 
-----------------------------

0322  D1   D2   D3   D4   D5   D6   D7   3.1   95   98    作成: 2002/05/17 osamu rev 1.1
   B1   B3   B4   B5   B6   B7   NT3   NT4   2K   XP  更新: 2002/05/17 osamu 編集
2つの TRichEdit のスクロールを同期させる

2つのTMemo のスクロールを同期させるやり方が[Tips:321]にありますが、実は TRichEdit だと同じようにしてもうまく行きません。

解決方法は、やはり Halbow さんの[Delphi-ML:67313]にあります。

うまく行かないのは、TRichEdit では CN_COMMAND を通じたスクロール通知メッセージ EN_VSCROLL が発行されないためです。EM_SETEVENTMASK というメッセージを送って、LParam に ENM_SCROLL を設定すると、親に EN_VSCROLL を通知するようになります。

親にイベントを通知するかどうかをプログラムで設定するためのこのようなマスクについて、[Delphi-ML:67328]にさらに詳しい説明があります。

  public
    RichEdit1Proc:TWndMethod;
    MKEY:WORD;
    procedure RichEdit1SuclassProc(var Msg:TMessage);
    procedure SyncVScroll;
    procedure PageDown;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  richedit;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RichEdit1Proc := RichEdit1.WindowProc;
  RichEdit1.WindowProc := RichEdit1SuclassProc;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  MASK:LPARAM;
begin
  MASK := RichEdit1.Perform(EM_GETEVENTMASK,0,0);
  RichEdit1.Perform(EM_SETEVENTMASK,0,MASK or ENM_SCROLL);
end;

procedure TForm1.RichEdit1SuclassProc(var Msg: TMessage);
begin
  RichEdit1Proc(Msg);
  case Msg.Msg of
    WM_VSCROLL:RichEdit2.Dispatch(Msg);
    CN_COMMAND:begin
      if (Msg.WParamHi = EN_VSCROLL) then
        case MKEY of
          VK_DOWN,VK_UP,VK_PRIOR:SyncVScroll;
          VK_NEXT:PageDown;
          VK_HOME,VK_END:
            if (GetAsyncKeyState(VK_CONTROL) and $8000) <> 0 then
              SyncVScroll;
        end;
    end;
    CN_KEYDOWN:MKEY := Msg.WParam;
  end;
end;

procedure TForm1.SyncVScroll;
var
  Msg:TWMScroll;
begin
  Msg.Msg := WM_VSCROLL;
  Msg.Pos := GetScrollPos(RichEdit1.Handle,SB_VERT);
  Msg.ScrollBar := 0;
  Msg.ScrollCode := SB_THUMBTRACK;
  RichEdit2.Dispatch(Msg);
  Msg.ScrollCode := SB_THUMBPOSITION;
  RichEdit2.Dispatch(Msg);
  Msg.ScrollCode := SB_ENDSCROLL;
  RichEdit2.Dispatch(Msg);
end;

procedure TForm1.PageDown;
var
  Msg:TWMScroll;
begin
  Msg.Msg := WM_VSCROLL;
  Msg.Pos := 0;
  Msg.ScrollBar := 0;
  Msg.ScrollCode := SB_PAGEDOWN;
  RichEdit2.Dispatch(Msg);
end;
参照: [Delphi-ML:67313] [Delphi-ML:67328] <Win95> <Standard> <コンポーネント > [Tips:321]

[新規作成] [最新の情報に更新]

How To
Lounge
KeyWords


Tips
Delphi
Home
Osamu Takeuchi osamu@big.or.jp