화면에 네게의 TMEMO field(Tmemo1,Tmemo2,Tmeom3,Tmemo4) 가 있고, 각각 vertical scroll bar가 있어서,
버티칼 스크롤바를 움직이면, 메모필드 속의 내용을 스크롤 시켜서 볼 수 있습니다.
만약 어느 하나의 스크롤바를 마우스로 클릭하고 하방으로 드래그 시킬때(그러면 메모필드의 텍스트들이 스크롤되어 보이겠죠) 나머지 세개의 스크롤바도 똑같이 움직이는 효과를 구현하려면,
어떻게 처리를 해야하는지요?
다시말씀드리면, 네게의 서로 다른 메모 필드의 버티컬스크롤바를 , 어느 한 필드의 버티컬스크롤바로
동시에 제어하는 방법입니다.
(제생각엔, 버티컬 스크롤바의 위치를 버티컬바에서 계산하여, 나머지에도 그 위치 값을 넣어주면
될것 같은데, 초보라 어찌할 바를 모르겠습니다.어떤 함수를 써야하는지도 모르겠구요^^)
감사합니다.
참고로...다음 프로시져는 여기서 확인한 내용임
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
begin
begin
memo1.Perform(WM_VSCROLL,SB_LINEDOWN,0);
memo2.Perform(WM_VSCROLL,SB_LINEDOWN,0);
end;
end;
end.
이렇게하면 하나의 추가 수직스크롤바를 추가하여 이것을 스크롤시키면 따라서
두개의 메모필드가 거의 같은 속도로 하방으로만 스크롤 됩니다.
이 수직 스크롤바에 따라 같이 움직이도록 제어코드를 넣어주면 쉬울것 같긴합니다.
우선 그 네개의 TMemo 콘트롤의 크기가 동일하다는 가정하에 아래 예제를 따라해보세요..
저는 두개로만 구현해보았는데, Memo3, Memo4 를 DoSync 프로시저 안에 기술해 주시면 되겠지요..
원리는 기준이 되는 Memo 콘트롤의 메시지를 가로채서 동일한 메시지를 다른 Memo 콘트롤에도 발생시키는 것입니다.
이런것을 '서브클래싱'이라고 부릅니다.. 한번 따라해 보시면 이해 되실거예요..
그럼 즐거운 프로그래밍 하시구요..
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm4 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FOldMemoWndProc: TWndMethod;
procedure NewMemoWndProc(var M: TMessage);
procedure DoSync(Msg: Cardinal; wParam: Integer; lParam: Integer);
public
{ Public declarations }
end;
var
Form4: TForm4;
OldWindowProc : Pointer;
implementation
{$R *.dfm}
procedure TForm4.DoSync(Msg: Cardinal; wParam: Integer; lParam: Integer);
begin
Memo2.Perform(Msg, Wparam, Lparam);
end;
procedure TForm4.NewMemoWndProc(var M: TMessage);
begin
case M.Msg of
WM_VSCROLL, WM_HSCROLL, WM_MOUSEWHEEL :
DoSync(M.Msg, M.WParam, M.LParam);
end;
FOldMemoWndProc(M);
end;
procedure TForm4.FormCreate(Sender: TObject);
begin
FOldMemoWndProc := Memo1.WindowProc;
Memo1.WindowProc := NewMemoWndProc;
end;
end.