Q&A

  • 리치에디터에서 특정값을 찾은후 변경하는중에..
RichEdit Control을 사용해서 글자마다 다른 색을 Runtime시에 주고 싶어서요

아래와 같이 로직을 구현하고 테스트해보기 위해서 파일을 하나 오픈 한 후에
적용해 보았더니 훌륭하게 작동합니다. ^^

하지만. 파일의 크기가 굉장히 크다면 아래의 로직이 문제가 있는듯 합니다.
너무 많은 시간이  걸려요..

어떻게 하면 좋게 바꿀수 있을까요

제생각에는 현재 화면에서 리치 에디터의 시작점과 끝을 알고난후에(시작과 끝을 아는 방법을 모르겠음. Length(richEdit.Text) 이렇게 하면 리티 에디터의 끝은 알수 있지만 현재 보이는 부분의 끝은 어떻게 알수가 있는건지..???? )
보이는 부분만 검색하고 만약 스크롤등 이벤트가 발생하면 화면의 변경이
있을시에는 그부분만 다시 아래 루틴을 검색하고 바꾸어 주고 그런식으로 하려고 합니다

또 다른 좋은 방법이 있을까요?

그리고 일반적인 프로그래밍 에디터들은 키입력을 할때마다 키워드 인지 아닌지
체크를 실시간으로 하는것 같은데 이거 어케 하나요?
제 생각에 리치에디터의 onchange 이벤트가 발생할때 마다 검사를 하면 될꺼 같은데 이거 역시..굉장히 무식한 방법인듯 하고요..

델파이 2주한 초짜입니다... 도와주세요..


procedure TForm1.Button1Click(Sender: TObject);
const
// 검사할 키워드들...
keywords: array [1..28] of String =
  ('procedure', 'function', 'begin', 'end', 'whilw',
   'do', 'with', 'if', 'try', 'finally',
   'interface', 'uses', 'type', 'private' ,'public',
   'var', 'const', 'implementation', 'class', 'array',
   'of', 'string' ,'integer', 'unit', 'to',
   'while', 'for', 'then');
var
i, n: Integer;
begin
with RichEdit1 do
begin
  Lines.BeginUpdate; // 변동사항을 잠시 막는다
  try
    for i := Low(keywords) to High(keywords) do
    begin
      n := 0;
      while n >= 0 do
      begin
        n:= FindText(keywords[i], n, GetTextLen-n, [stWholeWord]);
        if n >= 0 then
        begin
          SelStart := n;
          SelLength := Length(keywords[i]);
          SelAttributes.color := clBlue;
          SelLength := 0;
          n := n + Length(keywords[i]); // 검색된 다음 글자부터...
        end;
      end;
    end;
  finally
    Lines.EndUpdate;
  end;
end;
end;

0  COMMENTS