리치에디트 두개를 똑같이 스크롤할라하는게 도저히 안대서
마지막으루 생각해낸것이 SendMessage로
한쪽 키이벤트를 공유하는것이었습니당
리치1에서 입력받은걸 리치2에 보내는식이죠
긍데 막상해보니 ㅡㅡ;; 리치2에 키다운을 두어개 보내도
리치2는 영 ㅡ.ㅡㅋ; 받은건지 만건지 커서가 움직여서 스크롤이 돼야하는데
그래서 Send문이 맛간건가해서 이것저것 바까보고 해도 역시.. ㅡㅡ
알고보니 이벤트는 받았는데 리치2가 이상하게 그대로 첫화면을 뿌리고있더군요
탭키로 포커스를 움직이니 그재서야 재위치로 스크롤대는뎅
이것을 코드로 다시혀볼라궁 Rich2.Reflash도 넣어보고
FM으루 ㅡㅡ SetFocus를 리치1에 옴겼다 리치2에 옴겼다 해보고 그래도
어째댄것이 그대로 ㅡㅡ;;; 이거 도대체 왜이러져
리치에디트에서 스크롤값을 인수루 받아오는법만 알면 그냥 끈날텐데...
이런 무식한 방법을 써도 하루종일 시간만 잡아묵네여 ㅡㅜ 에혀
고수님들 답변좀 해쥬세여~ 델파이 써본지 일주일도 안돼가지고
딴언어에서 넘어가는게 델파이만 왜러캐 어려븐지 원 ㅡㅜ
그래도 근사(비슷)하게 되므로 일단 올립니다.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
HookType = function(hWnd: HWND; Msg: WORD; wParam: WORD; lParam: LONGINT): LONGINT; StdCall;
TForm1 = class(TForm)
RichEdit1: TRichEdit;
RichEdit2: TRichEdit;
RichEdit3: TRichEdit;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
OldWinProc: HookType;
richedit1handle, richedit2handle : HWND;
m_depthscroll : integer;
m_currentrow : integer;
function NewWinProc(hWnd: HWND; Msg: WORD; wParam: WORD; lParam: LONGINT): LONGINT; StdCall;
implementation
{$R *.dfm}
function NewWinProc(hWnd: HWND; Msg: WORD; wParam: WORD; lParam: LONGINT): LONGINT; StdCall;
var incrow : integer;
comparerow : integer;
i : integer;
begin
if (hWnd = richedit1handle) then
case Msg of
WM_PAINT :
begin
comparerow := SendMessage(richedit1handle, EM_GETTHUMB, 0, 0);
incrow := comparerow div m_depthscroll;
if m_currentrow <> incrow then
begin
SendMessage(richedit2handle, EM_SCROLL, incrow, 0);
end;
m_currentrow := incrow;
end;
end;
Result := CallWindowProc(@OldWinProc, hWnd, Msg, wParam, lParam)
end;
procedure TForm1.FormCreate(Sender: TObject);
var P : HookType;
begin
richedit1handle := RichEdit1.Handle;
richedit2handle := RichEdit2.Handle;
P := NewWinProc;
m_depthscroll := SendMessage(richedit1handle, EM_GETTHUMB, 0, 0);
SendMessage(richedit1handle, EM_SCROLL, 1, 0);
m_depthscroll := SendMessage(richedit1handle, EM_GETTHUMB, 0, 0) - m_depthscroll;
SendMessage(richedit1handle, EM_SCROLL, 0, 0);
m_currentrow := 0;
Integer(Pointer(@OldWinProc)) := SetWindowLong(RichEdit1.Handle, GWL_WNDPROC , integer(Pointer(@p)));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(RichEdit1.Handle, GWL_WNDPROC , Integer(Pointer(@OldWinProc)));
end;
end.