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
[900] [Dialog] FindDialog에 대해..
장성호 [nasilso] 9685 읽음    2009-06-30 15:59
이상하게 델파이 커뮤니티에 FindDialog에 대한 내용이 별로없네요
별로 쓸일이 없는것인지?


저도 별로 많이 써보진 않았는데
이번에 회사 프로그램에 FindDialog를 이용한 검색기능을 넣으면서
알게된 몇가지 팁을 적어보고자 합니다.


근본적은 FindDialog도 OpenDialog 나 FontDialog처럼
comdlg32.dll 에 있는 api를 이용하셔 open하는 common-dialog입니다.
vcl이 아니라  windows에서 지원하는 놈이죠
그래서 대부분의 Windows-Application의 Dialog들이 똑같은게죠




@ 간단 사용방법
  먼저 간단히 FindDialog 사용방법을 소개합니다.

  1) 먼저 폼위에 컴포넌트를 올려놓거나 , 아니면 동적 생성하던가 하구요

  2) 둘째 필요한 시점에 FindDialog를 띄웁니다.
  
      버튼 클릭 이벤트라던가 아니면 Ctrl+F 클릭시 띄워면 되겟죠
void __fastcall TF_TForm1::LV_LogKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
   if(Shift.Contains(ssCtrl))
   {
       if(Key=='F' || Key=='f')
      {
          FindDialog1->Execute();
      }
   }
}


  3) FindDialog에서 OnFind이벤트에서 검색 key를 받아서 검색하시면 됩니다.

void __fastcall TForm1::FindDialog1Find(TObject *Sender)
{
     String sFindText= FindDialog1->FindTextA;
      ...

}



여기까지는 가장 기본적인 내용이니까 다들 아실테구..

이제 부터 몇가지 팁이 나갑니다.

@FindDialog옵션 정리

FindDialog의 옵션은 다음과 같이 13가지 입니다.(CBuilder6기준)
enum TFindOption { frDown, frFindNext, frHideMatchCase, frHideWholeWord, 
frHideUpDown, frMatchCase, frDisableMatchCase, frDisableUpDown, 
frDisableWholeWord, frReplace, frReplaceAll, frWholeWord, frShowHelp };


그런데 자세히 보시면 크게 3~4가지로 정리할수 있습니다.

  1) 검색 방향에 관한것
      frDown , frHideUpDown , frDisableUpDown

2) 대소문자 구분에 관한것
      frMatchCase,  frHideMatchCase , frDisableMatchCase

3) 단어단위 검색 옵션에 관한것
      frWholeWord , frHideWholeWord , frDisableWholeWord
4) 기타
     frFindNext , frShowHelp 

  옵션중 frHidexxx 옵션은 화면에 관련항목을 보여줄 것인지 말것인지 결정하구
   frDisablexxxx옵션은 화면에 관련항목  control을 disable시킬것인지 결정한다.

  기타 옵션들은 화면에서 체크한후에 OnFind이벤트에 체크해서 확인해 볼수있다.

다음은
frDisbalexxx 관련 옵션을 모두 true로 한후에 띄운 FindDialog이다.


  개인적으로 단어단위검색이 필요없기때문에
   frHideWholeWord를 true로 한후에 FindDialog를 Execute한다.

  OnFind이벤트에서 옵션을 체크하려면?
void __fastcall TForm1::FindDialog1Find(TObject *Sender)   
{
    // 아래로 찾기   
    if( FindDialog1->Options.Contains(frDown))
    {
        //  ...
    }
    else
    {
            // 위로 찾기 
    }
}


    참조   http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=716


@ StayOnTop 폼에서 FindDialog띄우기
  ; FindDialog는 OpenDialog와 다르게 Modal로 띄지 않는다.
    Dialog가 뜬 상태에서 폼에 접근할수 있다.
    그런데 현재 떠있는 폼이 Mopmost폼이라면 문제가 발생한다.
    FindDialog가 show된 상태에서 폼을 선택하면 FindDialog가 폼뒤로 사라져버린다.

    이분제 해결방법은 FindDialog도 top-most로 바꿔주면 되는것이다.
   다음과 같이 간단히 Execute호출후에 mop-most로 변경이 가능하다.
 void __fastcall Button1Click(TObject *Sender)
{
   FindDialog1->Execute();
   SetWindowPos(FindDialog1->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE |  SWP_NOSIZE | SWP_NOACTIVATE);

}



@ FindDialog를 현재폼의 가운데 띄우기
  ; VCL에서는 FindDialog가 기본적으로 Screen의 가운데에서 약간 위에 뜨고 있다.
    Dialog를 띄우는 폼이 Maximize된 상태라면 문제가 없지만 한쪽편에  가있는 상태라면
    폼의 가운데 떠지지 않고 엉뚱한곳에 Dialog가 뜨게 된다.

    다음과 같이 하면 FindDialog가 현재폼의 가운데 위치하게 할수 있다. 
 void __fastcall Button1Click(TObject *Sender)
{
   FindDialog1->Execute();
   //핸재폼의 가운데 위치하기
   TRect rc,trc;
   GetWindowRect(Handle,&rc);
   GetWindowRect(FindDialog1->Handle,&trc);
   MoveWindow(FindDialog1->Handle,rc.left+(rc.Width()-trc.Width())/2 ,rc.top+(rc.Height()-trc.Height())/2,trc.Width(),trc.Height(),true);

}




@ FindDialog의 Caption바꾸기
    이건뭐 팁이라 하기 거시기 하지만
    FindDialog에 무엇을 찾고자 하는지 Caption에 표시하면 좋지 않을까?
  
 void __fastcall TForm1::Button1Click(TObject *Sender)
{
   FindDialog1->Execute();
   SetWindowTextA(FindDialog1->Handle,"DB검색결과에서 - 찾기");
}





@ 폼 Close시 주의할점
  ; sub-form에서 FindDialog를 띄운상황에서 sub-form을 delete하지 않고
    단지 화면에서 hide(또는 Close)만 시킨다면

   Form의 OnClose이벤트에서 FindDialog도 Close해줘야 합니다.
   Form은 사라졌는데  FindDialog는 화면에 남이있을수 있죠
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    FindDialog1->CloseDialog();
}
//---------------------------------------------------------------------------

        


뭐 대단한 팁은 아니지만
요즘 인터넷 환경이든 어디든 검색기능은 기본기능이라고 할수있다.
간단한 기능이지만 내 프로그램에 적용하여 프로그램의 완성도를 높여보는것은 어떻까?

...

+ -

관련 글 리스트
900 [Dialog] FindDialog에 대해.. 장성호 9685 2009/06/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.