현재 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);
1. 현재 라인번호 알아내기
메모에서 현재 Caret이 위치하고 있는 줄이 몇번째 줄인지를 리턴한다.
Caption := IntToStr( GetCurrLine(Memo1) );
function GetCurrLine(Memo : TMemo) : integer;
begin
Result := Memo.Perform(EM_LINEFROMCHAR, Memo.SelStart, 0);
end;
2. 현재 컬럼알아내기
현재 Caret이 몇번째 컬럼에 위치하는지를 리턴한다.
Caption := IntToStr( GetCurrPos(Memo1) );
function GetCurrPos(Memo : TMemo) : integer;
begin
Result := Memo.SelStart -
Memo.Perform(EM_LINEINDEX, GetCurrLine(Memo), 0);
end;
3. 커서를 원하는 라인으로
Caret을 원하는 라인으로 위치시킨다. 이때 넘겨주는 값이 라인의 한계를 벗어나면 그안으로 위치시킨다. 즉 메모의 맨 끝으로 Caret을 위치시키려면 매우 큰수를 주면된다.
SetCurrLine(Memo1, 10);
procedure SetCurrLine(Memo : TMemo; Value: integer);
begin
if Value < 0 then Value := 0;
if Value > Memo.Lines.Count then Value := Memo.Lines.Count;
Memo.SelLength := 0;
Memo.SelStart := Memo.Perform(EM_LINEINDEX, Value, 0);
end;
4. 커서를 원하는 컬럼으로
Caret의 컬럼위치를 변경한다.
SetCurrPos(Memo1, 10);
procedure SetCurrPos(Memo : TMemo; Value: integer);
var CurrLine : integer;
begin
CurrLine := GetCurrLine(Memo);
if Value < 0 then Value := 0;
if (Value > Length(Memo.Lines[CurrLine])) then
Value := Length(Memo.Lines[CurrLine]);
Memo.SelLength := 0;
Memo.SelStart := Memo.Perform(EM_LINEINDEX, CurrLine, 0) + Value;
end;
5. Text가 쓰여지는 영역알기
현재 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);
end;
7. 원하는 라인만큼 스크롤
현재상태에서 원하는 만큼 x,y로 스크롤한다.
Scroll_By(Memo1, 10, 10);
procedure Scroll_By(Memo : TMemo; X: integer; Y: integer);
begin
Memo.Perform(EM_LINESCROLL, X, Y);
end;
파워러브 델파이!! 97년 3월 제 1호!!
배리스 wrote:
> 안녕하세요.
> 질문 하나가 있어서....
> 메모 컴포넌트를 사용하고 있는데 메모에는 계속적으로 1라인씩 증가하는
> 데 사용 하고 있습니다.
> 최근것을 보기 위해서는 메모의 마지막으로 가는 방법이 필요 한데
> 알 수가 없군요.
> 답변좀 부탁합니다.