Q&A

  • richedit 에서 일시적으로 스크롤이 안되게 잡고 싶습니다.
richedit를 사용해서 로그 뷰어를 만들어 볼려고 합니다.
프로그래밍을 하다보니 문제가 생겼는데...

Telnet으로 5개정도의 web서버의 로그를 모니터링하는
프로그램을 만드는 중이거든요.

richedit에 보여주는 로그메시지를 1000라인으로 한정하려고
라인수가 1000라인을 넘어가면 맨위에 라인을 삭제하고
아래에는 로그메시지를 삽입하는 방법으로 하려고 합니다.

문제는 커서포지션이 delete할때는  richedit의 top으로
옮겨지고 삽입할때는 bottom으로 옮겨지는 바람에
화면이 번쩍번쩍합니다.

다행이 메시지가 한라인씩 삽입되면 괜찮은데
한꺼번에 20~30라인씩 삽입되면
눈이 아파서 못볼 정도거든요.

삭제하는 순간에는 스크롤이 안되게 잡아두면 될것 같은데
아무리 뒤져 봐도 해결책이 안보이네요.

그나마 CPU의 속도가 빠른 PC에서는 괜찮은데
팬티엄3정도에서 보려고 하니 깝깝하네요.

아니면 스크롤을 delete순간에는 동작을 못하도록 잡아두는
방법이 있는지요.
아니면   혹 더좋은 해결방법이 있는지요?

  고수님들의 도움이 필요하네요.


--------------고민에 빠지게 하는 부분------------------
   // 맨위에 라인 삭제 ---------------------------------------------
  while (RichEdit1.Lines.Count > 1000) do   RichEdit1.Lines.delete(0);
  
    // 로그메시지 삽입
    RichEdit1.Lines.Strings[RichEdit1.Lines.Count-1] :=
          RichEdit1.Lines.Strings[RichEdit1.Lines.Count-1] + Copy(Buffer, s, e-s);
 
     if Buffer[e] = CR then  Memo.Lines.Add('');
 
3  COMMENTS
  • Profile
    도끼로이마까 2005.04.29 20:37
    <!--CodeS-->
      RichEdit1.Lines.BeginUpdate;
      try
        ...
      finally
        RichEdit1.Lines.EndUpdate;
      end;
    <!--CodeE-->

    원하시는 작업 사이에 BeginUpdate, EndUpdate 사용하시구요.
    강제로 맨밑으로 스크롤 하구 싶으시면
    SendMessage(RichEdit1.Handle, WM_VSCROLL, SB_BOTTOM, 0);
    이렇게 하심 됩니다.

  • Profile
    akc 2005.04.30 01:49
    감사합니다. (꾸벅)
    아래처럼 적용을 해봤는데 안되네요.
    제가 잘못 한건가요???

      RichEdit1.Lines.BeginUpdate;
      try
       while (RichEdit1.Lines.Count > 1000) do   RichEdit1.Lines.delete(0);
      finally
        RichEdit1.Lines.EndUpdate;
      end;
      SendMessage(RichEdit1.Handle, WM_VSCROLL, SB_BOTTOM, 0);


  • Profile
    akc 2005.05.07 03:19
    아래와 같이 했더니 해결이 되네요.

    RichEdit1.Lines.BeginUpdate;
    while (RichEdit1.Lines.Count > 1000) do   RichEdit1.Lines.delete(0);
    RichEdit1.Perform(WM_VSCROLL,SB_BOTTOM,0);
    RichEdit1.Lines.EndUpdate;