C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[716] [Dialog] FindDialog를 이용해 Backword로 찾기
장성호 [nasilso] 7133 읽음    2007-10-12 02:54
TMemo에서 string을 아래로(Forward) 찾는것은
AnsiString의 Pos함수를 이용해서 쉽게 구현할 수 있다.

하지만  현재위치에서  위로(Backward) 찾는것은 그리 간단하지 않다.

Backword검색은?

방법1.
    TRichEdit 에는 FindText라는 함수가 있다.
    이 함수를 이용하여  검색 시작위치와 끝 위치를 정해주어서 Find할수있다.
    델마당에 예제가 있다.
     http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?backdepth=1&db=dmdqa&mode=read&num=109012
  

방법2.
   그냥 AnsiString의 Pos함수를 이용하는데..
   Pos를 반복하여 더이상 찾지 못할때까지 반복한다.
   문론 반복할때는 앞에 찾는위치부터 검색 시작하는것이다.
   그렇게 반복하여 더이상 못찾으면 가장 최근에 찾은 위치가
   Backward로 찾은 위치가 된다.
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    FindDialog1->Execute();
}
//---------------------------------------------------------------------------
int iPos=0;
void __fastcall TForm1::FindDialog1Find(TObject *Sender)
{
    int icPos=0;
    if(FindDialog1->Options.Contains(frDown))        //Forward   아래로 찾기
    {
        String s=Memo1->Lines->Text.c_str()+iPos;
        icPos=s.Pos(FindDialog1->FindTextA);
        if(icPos>0)
        {
            Memo1->SelStart=iPos+icPos-1;
            Memo1->SelLength=FindDialog1->FindTextA.Length();
            iPos=iPos+icPos+FindDialog1->FindTextA.Length();
            Memo1->SetFocus();
        }
        else
        {
            ShowMessage("더이상 없습니다.");
            iPos=0;
        }
    }
    else                                        //Backward   위로 찾기
    {
        String s;
        if(iPos==0)
        {
             s=Memo1->Lines->Text.c_str();
        }
        else
        {
            s.SetLength(iPos);
            memcpy(s.c_str(), Memo1->Lines->Text.c_str(),iPos);
        }

        int tpos=0;
        icPos=0;
        do
        {
          icPos=icPos+tpos;
          s=s.c_str()+tpos;
          tpos=s.Pos(FindDialog1->FindTextA);
        }
        while(tpos);

        if(icPos>0)
        {
          Memo1->SelStart=icPos-1;
          Memo1->SelLength=FindDialog1->FindTextA.Length();
          iPos=icPos-FindDialog1->FindTextA.Length();
          Memo1->SetFocus();
        }
        else
        {
          ShowMessage("더이상 없습니다.");
          iPos=0;
        }
    }
}
//---------------------------------------------------------------------------



방법2-1  ( 추가 : 08-01-28  )

; 위에 방법1에는 memo장에서 사용자가 캐럿의 위치를 옮기면 그 위치부터 검색하지 않는 문제가 있습니다.
  그래서 약간 수정했구요.. 또 backword로 찾을때 memcpy를 쓰지 않고 pointer연산을 통해 풀어봤습니다.
void __fastcall TForm1::FindDialog1Find(TObject *Sender)
{
    int icPos=0;
    int iPos;
    if(FindDialog1->Options.Contains(frDown))        //Forward   아래로 찾기
    {
        iPos=Memo1->SelStart+Memo1->SelLength;
        String s=Memo1->Lines->Text.c_str()+iPos;
        icPos=s.Pos(FindDialog1->FindTextA);
        if(icPos>0)
        {
            Memo1->SelStart=iPos+icPos-1;
            Memo1->SelLength=FindDialog1->FindTextA.Length();
            Memo1->SetFocus();
        }
        else
        {
            ShowMessage("아래로 더이상 없습니다.");
        }
    } 
    else                                        //Backward   위로 찾기
    {
        iPos=Memo1->SelStart;
        char *pStart=Memo1->Lines->Text.c_str();
        char *pStr,*pCStr;
        pStr=pStart+iPos-FindDialog1->FindTextA.Length();
        pCStr=pStr;

        char *pFind;
        do
        {
            pFind=AnsiStrPos(pCStr,FindDialog1->FindTextA.c_str());
            if(pFind==NULL)pCStr=pCStr-1; //못찾으면 pointer를 하나 앞으로 당긴다.
            else if((pStr-pFind)<=0) pCStr=pCStr-1; //찾더라도 이전에 찾은것이면 pointer를 하나 앞으로 당긴다.
            else                                    //찾으면 찾은 string을 Select시킨후 break..
            {
                Memo1->SelStart=pFind - pStart;
                Memo1->SelLength=FindDialog1->FindTextA.Length();
                Memo1->SetFocus();
                break;
            }
            if(pCStr




누가 더 좋은 방법있으면 소개좀 해주세요
그럼..

+ -

관련 글 리스트
716 [Dialog] FindDialog를 이용해 Backword로 찾기 장성호 7133 2007/10/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.