Q&A

  • 연동하는 2개의 Memo콘트롤을..


가능할까요??

폼에 나란히 Momo 콘트롤을 2개 설치하고

한쪽의 메모콘트롤에서 수직으로 작업을 할 경우 '

다른쪽의 메모콘트롤이 동시에 수직으로

움직일수 있게 작성가능할까요?

이렇게하면 라인단위로 두개의 파일을 쉽게 비교할수 있을것

같은데요..

3  COMMENTS
  • Profile
    신인재 1999.05.21 19:54
    이미 두분이 답을 하셨군요.. 질문의 요지를 전 좀 다른 각도에서

    생각을 해보았습니다.

    아래와 같이 코딩하세요.



    한쪽이 스크롤될때 다른 한쪽도 스크롤이 되기를 원하신다는 것으로

    받아들였는데 이럴때 메세지 후킹을 사용합니다.

    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개 설치하고

    > 한쪽의 메모콘트롤에서 수직으로 작업을 할 경우 '

    > 다른쪽의 메모콘트롤이 동시에 수직으로

    > 움직일수 있게 작성가능할까요?

    > 이렇게하면 라인단위로 두개의 파일을 쉽게 비교할수 있을것

    > 같은데요..





  • Profile
    이정욱 1999.05.21 06:56
    파워러브 델파이 창간호에서 가져왔습니다.



    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:

    >

    > 가능할까요??

    > 폼에 나란히 Momo 콘트롤을 2개 설치하고

    > 한쪽의 메모콘트롤에서 수직으로 작업을 할 경우 '

    > 다른쪽의 메모콘트롤이 동시에 수직으로

    > 움직일수 있게 작성가능할까요?

    > 이렇게하면 라인단위로 두개의 파일을 쉽게 비교할수 있을것

    > 같은데요..





  • Profile
    안치봉 1999.05.21 03:54
    초보운전 wrote:

    >

    > 가능할까요??

    > 폼에 나란히 Momo 콘트롤을 2개 설치하고

    > 한쪽의 메모콘트롤에서 수직으로 작업을 할 경우 '

    > 다른쪽의 메모콘트롤이 동시에 수직으로

    > 움직일수 있게 작성가능할까요?

    > 이렇게하면 라인단위로 두개의 파일을 쉽게 비교할수 있을것

    > 같은데요..



    안녕하세요.



    제가 보기에는 가능할것 같습니다.



    윈도우즈가 원래 멀티(?)가 되잖아요. 그리고 메세지시스템이기도 하구요.



    하지만 메세지가 정확한 시간에 간다는 보장이 없기 때문에 정확이 동시에 움직



    인다는 보장은 없을것 같습니다.