Q&A

  • RichEdit에서 찾는 문자열 색깔 바꾸기..
찾는 문자열은 입력한뒤 richedit에서 해당하는 문자열만 색을 바꿔주려구 하는데요..

M_contents.SelStart := Pos(Find_Text, sub_Text);
M_contents.SelLength := Length(Find_Text);
M_contents.SelAttributes.color := clRed;
M_contents.DefAttributes.color := clBlack;

selstart가 0이 아닐때는 색이 잘 바뀌는데요..
0일때는  색은 안바뀌고 Highlight만 되거든요..

방법이 없을까요?
3  COMMENTS
  • Profile
    홍성락 2002.10.11 22:56
    아래는 FindText메소드를 사용한겁니다.
    Pos스트링 함수는 -1를 해보세요
    procedure TForm1.Button2Click(Sender: TObject);
    var
        cPre, cNew : String;
        nPos   : Integer;
    begin
        cPre := 'Rich';
        nPos := Editor.FindText(cPre, Editor.SelStart, Length(Editor.Text), [stMatchCase]);
        //nPos := Pos(cPre, Editor.Text)-1;
        if nPos <> -1 then begin
           Editor.SelStart := nPos;
           Editor.SelLength := Length(cPre);
           Editor.SelAttributes.color := clRed;
           Editor.DefAttributes.color := clBlack;
        end;
    end;

    아래 예는 모든 문자를 바꾸는 예입니다.
    procedure TForm1.Button1Click(Sender: TObject);
    var
        cPre, cNew : String;
        nPos   : Integer;
        TA : TTextAttributes;
    begin
        cPre := 'Rich';
        cNew := '홍성락';
        while FindStr(cPre) do begin
            //Editor.SelStart := Editor.SelStart+1;
            //Editor.SelLength := Length(cPre)-1;
            //TA := Editor.SelAttributes;
            Editor.SelText := cNew;
            //Editor.SelStart := Editor.SelStart-Length(cNew);
            //Editor.SelLength := Length(cNew);
            //Editor.SelAttributes := TA;
        end;
    end;

    function TForm1.FindStr(str:string):Boolean;
    var
      FoundAt: LongInt;
      StartPos, ToEnd: Integer;
    begin
      Result := False;
      with Editor do begin
        StartPos := 0;
        ToEnd := Length(Text) - StartPos;
        FoundAt := FindText(str, StartPos, ToEnd, [stMatchCase]);
        if FoundAt <> -1 then begin
          SetFocus;
          SelStart := FoundAt;
          SelLength := Length(str);
          Result := True;
        end;
      end;
    end;
    hsr/////////////////////////////////////////////////////////
  • Profile
    송현경 2002.10.12 00:06
    답변 감사합니다.
    근데요
    찾는 문자가 맨 앞에 있을경우...
    '대한민국' 에서  '대'를 찾을경우
    SelStart := 1;
    이렇게 직접 넣어줘도 SelStart는 0을 고수하네요..
    그래서.. 선택이 되질 않습니다.
    제발 해결해 주세요..
    3일째에요...

  • Profile
    홍성락 2002.10.12 01:15
    문자열이나 POS함수등에서 1이라면 첫문자이므로 1이지만
    리치에디터등에서 문자열위치가 아닌 포지션이므로 0입니다.
    그리고 한글을 쓰시는경우 이므로 커서는 2칸씩이므로 사이 값을 넘기거나 바로 앞을 고수합니다.

    따라서 POS함수를 사용하셨다면 위치는 구한값-1을 해야하구요
    M_contents.SelStart := Pos(Find_Text, sub_Text)-1;

    FindText 메소드를 사용하셨다면
    M_contents.SelStart := M_contents.FindText(Find_Text, 0, Length(M_contents.Text), [stMatchCase]);


    procedure TForm1.Button1Click(Sender: TObject);
    var
        Find_Text, sub_Text : string;
    begin
    Find_Text := '대';
    sub_Text := M_contents.Text;
    M_contents.SelStart := Pos(Find_Text, sub_Text)-1;
    //M_contents.SelStart := M_contents.FindText(Find_Text, 0, Length(M_contents.Text), [stMatchCase]);
    M_contents.SelLength := Length(Find_Text);
    M_contents.SelAttributes.color := clRed;
    M_contents.DefAttributes.color := clBlack;
    end;

    hsr//////////////////////////////////