현재 Text가 쓰여지는 영역을 TRect형으로 리턴한다. 단순히 TMemo의 Width와 Height만을 가지는 텍스트가 그려지는 정확한 영역을 알수 없다. 즉 글자의 높이가 10이고 메모의 높이가 25라면 2라인만이 그려지게된다. 따라서 글자가 그려지는 정확한 영역을 알아야 한다면 이함수를 쓰는게 좋다.
Rect := GetTextRect(Memo1);
function GetTextRect(Memo : TMemo) : TRect;
var
lParam : TRect;
begin
Memo.PerForm(EM_GETRECT, 0, Integer(@lParam) );
Result := lParam;
end;
6. 메모에서 현재 보이는 라인수 알기
GetTextRect를 이용해서 현재 메모에 그려지는 글자들이 몇줄로 그려지는지를 정확히 알수 있다.
Caption := IntToStr( GetVisibleLine(Memo1) );
function GetVisibleLine(Memo : TMemo) : integer;
var
Metric : TTextMetric;
DC : hDC;
begin
DC := GetWindowDC(Memo.Handle);
GetTextMetrics(DC, Metric);
Result := (GetTextRect(Memo).Bottom div Metric.tmHeight);
생각을 해보았습니다.
아래와 같이 코딩하세요.
한쪽이 스크롤될때 다른 한쪽도 스크롤이 되기를 원하신다는 것으로
받아들였는데 이럴때 메세지 후킹을 사용합니다.
memo1을 메세지 후킹해서 거기에 해당하는 메세지를 다른 Memo2에도
똑같이 발생시켜 주는거죠....
코딩은 아래와 같슴다.
var
Form1: TForm1;
OldListWinProc: TWndMethod;
implementation
{$R *.DFM}
procedure TForm1.NewListWinProc(var Message: TMessage);
begin
OldListWinProc(Message);
with Message do
Case Msg of
WM_VSCROLL:
SendMessage(Memo2.Handle,WM_VSCROLL,wParam,lParam);
WM_HSCROLL:
SendMessage(Memo2.Handle,WM_HSCROLL,wParam,lParam);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldListWinProc:=Memo1.WindowProc;
Memo1.WindowProc:=NewListWinProc;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Memo1.WindowProc := OldListWinProc;
end;
초보운전 wrote:
>
> 가능할까요??
> 폼에 나란히 Momo 콘트롤을 2개 설치하고
> 한쪽의 메모콘트롤에서 수직으로 작업을 할 경우 '
> 다른쪽의 메모콘트롤이 동시에 수직으로
> 움직일수 있게 작성가능할까요?
> 이렇게하면 라인단위로 두개의 파일을 쉽게 비교할수 있을것
> 같은데요..