본문 바로가기
Delphi/프로시저-함수

메모(TMemo) 팁

by MonoSoft 2023. 6. 14.
728x90
반응형

TMemo 팁

728x90

델파이에서 TMemo는 텍스트 기반

멀티라인 에디트 컨트롤입니다.

 

이 컨트롤을 사용하면 사용자가

여러 줄의 텍스트를 입력하고 편집할 수 있습니다.

 

TMemo는 다양한 속성과 이벤트를 제공하여

텍스트의 표시 및 편집을 제어할 수 있습니다.

 

일반적으로 TMemo 컨트롤은 대화형 애플리케이션에서

텍스트 입력 또는 출력에 사용됩니다.

 

예를 들어, 사용자가 메모를 작성하거나

텍스트 문서를 편집하는 등의 작업에 유용합니다.

 

TMemo의 중요한 속성 중 일부는 다음과 같습니다

 

Lines

Lines 속성은 TMemo에 표시되는 텍스트의 줄 목록을 나타냅니다.

이 속성을 통해 텍스트를 프로그래밍 방식으로 설정하거나 읽을 수 있습니다.

 

 

Text

Text 속성은 TMemo의 전체 텍스트 내용을 가져오거나

설정하는 데 사용됩니다.

Lines 속성과 유사하지만 전체 텍스트를 한 번에 다룰 때 유용합니다.

 

 

 

ReadOnly

ReadOnly 속성을 true로 설정하면 사용자가

TMemo의 내용을 편집할 수 없습니다.

읽기 전용 텍스트 표시에 유용합니다.

 

 

WordWrap

WordWrap 속성은 텍스트가 컨트롤의 너비를 초과할 때

줄을 자동으로 개행할지 여부를 결정합니다.

또한 TMemo에는 사용자가 텍스트를 편집하는 동안

발생하는 다양한 이벤트가 있습니다.

일반적인 예로는 OnChange, OnKeyPress, OnEnter 등이 있습니다.

 

이러한 이벤트를 사용하여 텍스트 변경에 대한 반응을

정의하거나 추가 동작을 수행할 수 있습니다.

 

TMemo 컨트롤은 사용자 인터페이스에서 텍스트 편집을 위해

일반적으로 사용되는 중요한 Delphi 컨트롤 중 하나입니다.

 

 

 

다음은 TMemo에 대한 팁을 알려드리겠습니다!

 

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;

 

728x90
반응형

댓글