

//[2009.05.06.수][생성!!!]{---------------------------
//<optionIde_DialogBox_Form> 을 가지고 새로 생성한다.
//
//[2019.03.03.일][참고]-------------------------------
//[전체찾기], [찾은목록] 등 중요 기능 완벽 추가 됐음.
//}---------------------------------------------------


#include <vcl.h>
#pragma hdrstop

#include "find_DialogBox.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tfind_DialogBox_Form *find_DialogBox_Form;
//---------------------------------------------------------------------------


#include "main.h"
#include "ide_main.h"
#include "ide_library.h"
#include "ide_msgbox.h"
#include "gui.h"
#include "editor_edit.h"
#include "ide_BalloonBox.h"

//[2010.04.03.토][추가!!!]
#include "ide_editor.h"

//[2019.02.16.토][추가]
#include "ide_tree.h"
#include "tree_tree.h"

//[2019.02.17.일][추가]
#include "editor_top.h"
#include "msg_msg.h"
#include "file.h"



//[설명!!!]
//{
    //[2007.12.15.토]{------------------------------------------------------------------
    //[통합개발환경] 의 모든 관련 부분을 설정한다.
    //각종 색 정보, [편집기] 색 설정등을 각각의 [페이지] 로 나누어서 보여주고 처리한다.
    //}---------------------------------------------------------------------------------
//}


//------------------------------------------------------------------------------
//[서브클래싱]------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tfind_DialogBox_Form::WndProc(Messages::TMessage  &Message)
{
  //[설명!!!]{--------------------------------------------------------------------
  //TForm 의 경우는 바탕을 칠하고 OnPaint() 를 발생하게 되므로 실제 _Draw() 를
  //OnPaint() 에서 사용하는 경우는 크기가 변경되는 경우 바로 칠해지지 않아서
  //하얀색 바탕이 그대로 나오게 되어 보기 좋지 않게 된다.
  //따라서 TForm 자체의 바탕을 그리는 WM_ERASEBKGND 에서 바로 _Draw() 를 사용하여
  //그리고 OnPaint() 는 처리하지 않는다.
  //C++Builder 와 같이 완벽하게 처리되는 깜박임이 전혀 없는 화면을 만들수 있다.
  //
  //[2012.05.20.일][수정!!!]------------------------------------------------------
  //}-----------------------------------------------------------------------------

  if     (Message.Msg == WM_ERASEBKGND)
  {
    _Draw();

    //바로 죵료하지 않으면 WM_ERASEBKGND 메세지가 다음 TForm::WndProc(Message); 에서
    //다시 처리 되어 TForm->Color 로 칠해지게 되어 _Draw() 로 그린 것이 다 지워지므로
    //바로 종료한다.
    return;

  }
  else if(Message.Msg == WM_KEYDOWN)
  {
    //[2012.05.20.일][추가!!!]{----
    //<ESC 키> 처리를 위하여 추가.
    //}----------------------------

    switch(Message.WParam)
    {
      case VK_ESCAPE : //[키:ESC]
      {
        //[참고!!!]{------------------------------------------------------------
        //실제 <_EVENT_KeyDown_Esc_All()> 함수에서 모두 처리되고
        //여기서는 처리되지 않는다.
        //아마도 항상 [한줄 편집기] 에 [촛점] 이 맞춰져 있기 때문인것같다.
        //동작이 되는 것이 중요하므로 이 부분은 무시하나 일단 추가는 해 놓는다.
        //}---------------------------------------------------------------------

        //[대화상자] 닫기.
        _EVENT_CloseButton_Click();

        Message.Result = true;
        return;

      } break;

    }

  }

  //[기본처리]
  //{
      //기본 메세지는 반드시 처리 되어야 한다.
      TForm::WndProc(Message);
  //}

  return;

}

//------------------------------------------------------------------------------

__fastcall Tfind_DialogBox_Form::Tfind_DialogBox_Form(TComponent* Owner)
        : TForm(Owner)
{
  //[VAR]
  //{
      AnsiString     bmp_path;
      int            width, height;

      TRect          colorBoxTRect;
      int            w, h;

      int            i;

      //[2019.02.16.토][추가]
      int            color;

  //}

  //[환경변수]
  //{
      //[2007.10.02.화][추가!!!]
      IDE_Get_Option(&_ide_option);

  //}

  //[초기화]
  //{
      //--------------------------------------------------------------------------
      //크기는 표시되는 내용에 따라 자동으로 처리 되지만 일단 임의 값을 기록한다.
      this->Left     = 0;
      this->Top      = 0;
      this->Width    = 300;
      this->Height   = 122 + 28;
      this->Color    = clWhite;

      //실제 그림 영역을 생성한다.
      _bmp_ = new Graphics::TBitmap;

      //그림 영역 크기 설정.
      _bmp_->Width       = this->Width;
      _bmp_->Height      = this->Height;

      //24bit bitmap 으로 지정한다.
      _bmp_->PixelFormat = pf24bit;
      //--------------------------------------------------------------------------
  //}

  //[글꼴 설정]
  //{
      //[기본 끌꼴 등록]{------------------------------------------------
      //모든 프로그램에서 기본적으로 사용하는 [system 글꼴] 을 등록한다.
      FONTPACK_SetDefault(&_font);
      //}----------------------------------------------------------------

      //[editor debug margin]
      //{
          _font.margin_size = 0;

      //}

      //문자 margin 을 설정한다.
      _font.offset_left   = 0;
      _font.offset_right  = 0;
      _font.offset_top    = 0;
      _font.offset_bottom = 0;

      //[2010.01.26.화][추가!!!]{---
      _font.en_offset_left  = 0;
      _font.en_offset_right = 0;
      //}---------------------------

  //}

  //[속성초기화]
  //{
      //기본적으로 선택되지 않은 상태.
      _caption_selected = false;

  //}

  //[caption 설정]
  //{
      //caption 문자열.(크게 바끨일이 없다.)
      STR_Assign(_caption, " 찾기(형광문자)/교환 대화상자 ");

      //높이 지정.
      _caption_height = 22;

      //caption 문자열의 width 를 구한다.
      FONT_Get_StringOutAreaInfo(&_font, d_FONTSTYLE_default, _caption, &width, &height);

      //실제 사용할 caption 폭을 설정한다.
      //_font.margin_size 는 처음 기본값인 0 을 사용한다.(한번만 그려주면 된다.)
      _caption_width = width + (_font.margin_size * 2) + 2;

  //}

  //[기본 부품들]
  //{
      //[닫기 버튼]
      //{
          _close_bmpbtns          = new Tgui_bmpbutton_Form(this);
          _close_bmpbtns->Parent  = this;
          _close_bmpbtns->Visible = true;

          //[초기화]
          //{
              //그림 할당하기.
              bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\control\\close.bmp";

              _close_bmpbtns->_Top(0);
              _close_bmpbtns->_Width(12);
              _close_bmpbtns->_Left(0);
              _close_bmpbtns->_Height(12);
              _close_bmpbtns->_Border(true);
              _close_bmpbtns->_Bitmap(bmp_path);
              _close_bmpbtns->_Image_Width(12);
              _close_bmpbtns->_Image_Height(12);

              //동작함수 등록.
              _close_bmpbtns->_EVENT_Click = _EVENT_CloseButton_Click;

          //}

      //}

  //}

  //[내부 부품들]
  //{
      //[찾기 이름표]
      //{
          _find_Label          = new Tgui_Label_Form(this);
          _find_Label->Parent  = this;
          _find_Label->Visible = true;

          _find_Label->_Width(72 + 4*9);
          _find_Label->_Left(8);
          _find_Label->_Top(28);
          _find_Label->_FontColor(_ide_option->color_0);
          _find_Label->_Caption("찾을 문자열(F3)");
          _find_Label->_Border(false);

      //}

      //[찾을 문자열]
      //{
          _find_Edit          = new Tgui_edit_Form(this);
          _find_Edit->Parent  = this;
          _find_Edit->Visible = true;
                                      
          //[초기화]{---------------------------------------------------------
          //[2022.01.06.목][수정]
          //오른쪽 [v] 버튼을 밖으로 꺼내며서 폭을 줄인다.---------------v
          _find_Edit->_Width(this->Width - _find_Label->Width - 20 + 4 - 14);
          _find_Edit->Left = (_find_Label->Left + _find_Label->Width - 2);
          _find_Edit->Top  = (_find_Label->Top);
          _find_Edit->_EDIT_TextOut("");
          //}-----------------------------------------------------------------

          //[배경색 설정]
          //{
              //[2019.02.16.토][추가!!!]{------------------------------------------
              //전체 바탕이 [흰색] 으로 <edit> 의 것과 구분이 안되므로 [배경색] 을
              //기본 [테마색:밝기적용] 으로 설정해 준다.
              //}------------------------------------------------------------------

              BMP_Get_Bright_Color(_ide_option->color_0, Ide_Bright_Edit, &color);
              _find_Edit->_BackColor(color);

          //}

          //[2009.05.09.토][추가!!!]
          _find_Edit->_EVENT_KeyEnter    = _EVENT_KeyEnter_find_Edit;

          //[2012.05.20.일][추가!!!]
          _find_Edit->_EVENT_KeyDown_Esc = _EVENT_KeyDown_Esc_All;

          //[2019.03.02.토][추가]
          //{
              //[!]{-------------------------------
              //[근접단어정렬] 기능 지원을 위한것.
              //}----------------------------------

              //[내용] 의 변경이 있는 경우 발생(문자입/삭제/잘라내기/붙이기 등 전부 포함).
              _find_Edit->_EVENT_Change        = _EVENT_Change_find_Edit;

              _find_Edit->_EVENT_KeyDown_Left  = _EVENT_KeyDown_Left_find_Edit;

              _find_Edit->_EVENT_KeyDown_Right = _EVENT_KeyDown_Right_find_Edit;

              _find_Edit->_EVENT_KeyDown_Up    = _EVENT_KeyDown_Up_find_Edit;

              _find_Edit->_EVENT_KeyDown_Down  = _EVENT_KeyDown_Down_find_Edit;

              _find_Edit->_EVENT_KeyDown_Home  = _EVENT_KeyDown_Home_find_Edit;

              _find_Edit->_EVENT_KeyDown_End   = _EVENT_KeyDown_End_find_Edit;

          //}

      //}

      //[교환 이름표]
      //{
          _replace_Label          = new Tgui_Label_Form(this);
          _replace_Label->Parent  = this;
          _replace_Label->Visible = true;

          _replace_Label->_Width(72 + 4*9);
          _replace_Label->_Left(8);
          _replace_Label->_Top(_find_Label->Top + _find_Label->Height + 4);
          _replace_Label->_FontColor(_ide_option->color_0);
          _replace_Label->_Caption("교환 문자열(F4)");
          _replace_Label->_Border(false);

      //}

      //[교환 문자열]
      //{
          _replace_Edit          = new Tgui_edit_Form(this);
          _replace_Edit->Parent  = this;
          _replace_Edit->Visible = true;

          //[초기화]{---------------------------------------------------------------
          _replace_Edit->_Width(this->Width - _replace_Label->Width - 20 + 4);
          _replace_Edit->Left = (_replace_Label->Left + _replace_Label->Width - 2);
          _replace_Edit->Top  = (_replace_Label->Top);
          _replace_Edit->_EDIT_TextOut("");
          //}-----------------------------------------------------------------------

          //[배경색 설정]
          //{
              //[2019.02.16.토][추가!!!]{------------------------------------------
              //전체 바탕이 [흰색] 으로 <edit> 의 것과 구분이 안되므로 [배경색] 을
              //기본 [테마색:밝기적용] 으로 설정해 준다.
              //}------------------------------------------------------------------

              BMP_Get_Bright_Color(_ide_option->color_0, Ide_Bright_Edit, &color);
              _replace_Edit->_BackColor(color);

          //}

          //[2012.05.20.일][추가!!!]
          _replace_Edit->_EVENT_KeyDown_Esc = _EVENT_KeyDown_Esc_All;

      //}

      //[단어단위 구분]
      //{
          _word_CheckBtn          = new Tgui_check_button_Form(this);
          _word_CheckBtn->Parent  = this;
          _word_CheckBtn->Visible = true;

          _word_CheckBtn->_Left(_replace_Label->Left + 2);
          _word_CheckBtn->_Top(_replace_Label->Top + _replace_Label->Height + 8);

          //[2009.05.09.토][추가!!!]
          _word_CheckBtn->_EVENT_Click = _EVENT_Click_word_CheckBtn;

      //}

      //[단어단위 구분 이름표]
      //{
          _word_Label          = new Tgui_Label_Form(this);
          _word_Label->Parent  = this;
          _word_Label->Visible = true;

          _word_Label->_Width(24);
          _word_Label->_Left(_word_CheckBtn->Left + _word_CheckBtn->Width + 2);
          _word_Label->_Top(_word_CheckBtn->Top - 1);
          _word_Label->_FontColor(_ide_option->color_0);
          _word_Label->_Caption("단어");
          _word_Label->_Border(false);

      //}

      //[대소문자 구분]
      //{
          _case_CheckBtn          = new Tgui_check_button_Form(this);
          _case_CheckBtn->Parent  = this;
          _case_CheckBtn->Visible = true;

          _case_CheckBtn->_Left(_word_Label->Left + _word_Label->Width + 14);
          _case_CheckBtn->_Top(_replace_Label->Top + _replace_Label->Height + 8);

          //[2009.05.09.토][추가!!!]
          _case_CheckBtn->_EVENT_Click = _EVENT_Click_case_CheckBtn;

      //}

      //[대소문자 구분 이름표]
      //{
          _case_Label          = new Tgui_Label_Form(this);
          _case_Label->Parent  = this;
          _case_Label->Visible = true;

          _case_Label->_Width(60);
          _case_Label->_Left(_case_CheckBtn->Left + _case_CheckBtn->Width + 2);
          _case_Label->_Top(_word_Label->Top - 1);
          _case_Label->_FontColor(_ide_option->color_0);
          _case_Label->_Caption("대/소문자");
          _case_Label->_Border(false);

      //}

      //[전체 찾기 기능 관련]
      //{
          //[2019.02.16.토][추가]{----------
          //[전체찾기] 관련 두개 버튼 추가.
          //}-------------------------------

          //[조건 선택]
          //{
              //[전체찾기 정보만 보기]
              //{
                  _allFind_CheckBtn          = new Tgui_check_button_Form(this);
                  _allFind_CheckBtn->Parent  = this;
                  _allFind_CheckBtn->Visible = true;

                  _allFind_CheckBtn->_Left(_case_Label->Left + _case_Label->Width + 16);
                  _allFind_CheckBtn->_Top(_replace_Label->Top + _replace_Label->Height + 8);

              //}

              //[전체찾기 정보만 보기 이름표]
              //{
                  _allFind_Label          = new Tgui_Label_Form(this);
                  _allFind_Label->Parent  = this;
                  _allFind_Label->Visible = true;

                  _allFind_Label->_Width(132);
                  _allFind_Label->_Left(_allFind_CheckBtn->Left + _allFind_CheckBtn->Width + 2);
                  _allFind_Label->_Top(_word_Label->Top - 1);
                  _allFind_Label->_FontColor(_ide_option->color_0);
                  _allFind_Label->_Caption("전체찾기 정보만 표시");
                  _allFind_Label->_Border(false);

              //}

          //}

          //[현재 문서 전체 찾기]
          //{
              _pageAllFind_Btn          = new Tgui_button_Form(this);
              _pageAllFind_Btn->Parent  = this;
              _pageAllFind_Btn->Visible = true;

              _pageAllFind_Btn->_Top(_word_CheckBtn->Top + _word_CheckBtn->Height + 8);
              _pageAllFind_Btn->_Left(_word_CheckBtn->Left);
              _pageAllFind_Btn->_Width(this->Width/2 - 5*2 - 4);
              _pageAllFind_Btn->_Height(20);
              _pageAllFind_Btn->_FontColor(_ide_option->color_0);
              _pageAllFind_Btn->_Caption("현재 문서 전체 찾기");

              //[풍선 도움말 설정]
              //{
                  _pageAllFind_Btn->_BalloonHelpUse(true);
                  _pageAllFind_Btn->_BalloonHelpStr
                  ("[찾을 문자열] 에 등록된 문자열과 일치하는 문자열을\r\n"
                   "조건에 맞게 [현재 문서] 를 대상으로 모두 찾아줍니다."
                  );

              //}

              _pageAllFind_Btn->_EVENT_Click = _EVENT_Click_pageAllFind_Btn;

          //}

          //[전체 찾기]
          //{
              _gprjAllFind_Btn          = new Tgui_button_Form(this);
              _gprjAllFind_Btn->Parent  = this;
              _gprjAllFind_Btn->Visible = true;

              _gprjAllFind_Btn->_Top(_word_CheckBtn->Top + _word_CheckBtn->Height + 8);
              _gprjAllFind_Btn->_Left(_pageAllFind_Btn->Left + _pageAllFind_Btn->Width + 4);
              _gprjAllFind_Btn->_Width(this->Width/2 - 5*2);
              _gprjAllFind_Btn->_Height(20);
              _gprjAllFind_Btn->_FontColor(_ide_option->color_0);
              _gprjAllFind_Btn->_Caption("전체 찾기");

              //[풍선 도움말 설정]
              //{
                  _gprjAllFind_Btn->_BalloonHelpUse(true);
                  _gprjAllFind_Btn->_BalloonHelpStr
                  ("[찾을 문자열] 에 등록된 문자열과 일치하는 문자열을\r\n"
                   "조건에 맞게 [전체 문서] 를 대상으로 모두 찾아줍니다."
                  );

              //}

              _gprjAllFind_Btn->_EVENT_Click = _EVENT_Click_gprjAllFind_Btn;

          //}

      //}

      //[찾기 버튼]
      //{
          _find_Btn          = new Tgui_button_Form(this);
          _find_Btn->Parent  = this;
          _find_Btn->Visible = true;

          _find_Btn->_Top(_pageAllFind_Btn->Top + _pageAllFind_Btn->Height + 8);
          _find_Btn->_Left(_word_CheckBtn->Left);
          _find_Btn->_Width(this->Width/3 - 5*2);
          _find_Btn->_Height(20);
          _find_Btn->_FontColor(_ide_option->color_0);
          _find_Btn->_Caption("찾기(F3)");

          //[풍선 도움말 설정]
          //{
              _find_Btn->_BalloonHelpUse(true);
              _find_Btn->_BalloonHelpStr
              ("[찾을 문자열] 에 등록된 문자열과 일치하는 문자열을\r\n"
               "조건에 맞게 찾아줍니다."
              );

          //}

          _find_Btn->_EVENT_Click = _EVENT_Click_find_Btn;

      //}

      //[교환 버튼]
      //{
          _replace_Btn          = new Tgui_button_Form(this);
          _replace_Btn->Parent  = this;
          _replace_Btn->Visible = true;

          _replace_Btn->_Top(_pageAllFind_Btn->Top + _pageAllFind_Btn->Height + 8);
          _replace_Btn->_Left(_find_Btn->Left + _find_Btn->Width + 4);
          _replace_Btn->_Width(this->Width/3 - 5*2);
          _replace_Btn->_Height(20);
          _replace_Btn->_FontColor(_ide_option->color_0);
          _replace_Btn->_Caption("교환");

          //[풍선 도움말 설정]
          //{
              _replace_Btn->_BalloonHelpUse(true);
              _replace_Btn->_BalloonHelpStr
              ("[찾을 문자열] 에 등록된 문자열을 조건에 맞게 찾아서\r\n"
               "[교환 문자열] 에 등록된 문자열로 바꿔 줍니다.\r\n"
               "수정된 내용은 [되돌리기/되살리기] 기능으로 복구할수\r\n"
               "있습니다."
              );

          //}

          _replace_Btn->_EVENT_Click = _EVENT_Click_replace_Btn;

      //}

      //[모두교환 버튼]
      //{
          _replaceAll_Btn          = new Tgui_button_Form(this);
          _replaceAll_Btn->Parent  = this;
          _replaceAll_Btn->Visible = true;

          _replaceAll_Btn->_Top(_pageAllFind_Btn->Top + _pageAllFind_Btn->Height + 8);
          _replaceAll_Btn->_Left(_replace_Btn->Left + _replace_Btn->Width + 4);
          _replaceAll_Btn->_Width(this->Width/3 - 5*2 + 2);
          _replaceAll_Btn->_Height(20);
          _replaceAll_Btn->_FontColor(_ide_option->color_0);
          _replaceAll_Btn->_Caption("모두 교환");

          //[풍선 도움말 설정]
          //{
              _replaceAll_Btn->_BalloonHelpUse(true);
              _replaceAll_Btn->_BalloonHelpStr
              ("[찾을 문자열] 에 등록된 문자열을 조건에 맞게 찾아서\r\n"
               "[교환 문자열] 에 등록된 문자열로 모두 바꿔 줍니다.\r\n"
               "수정된 내용은 [되돌리기/되살리기] 기능으로 복구할수\r\n"
               "있습니다."
              );

          //}

          _replaceAll_Btn->_EVENT_Click = _EVENT_Click_replaceAll_Btn;

      //}

      //[진행막대]
      //{
          //[2019.02.22.금][추가]{------------------------------
          //<_find_Edit> 와 [같은크기/위치] 에 표시되도록 설정.
          //}---------------------------------------------------

          _search_Progress          = new TGProgress_Form(this);
          _search_Progress->Parent  = this;
          //처음에는 보이지 않는다.
          _search_Progress->Visible = false;

          //[초기화]
          //{
              _search_Progress->_Width_Height(_find_Edit->Width, _find_Edit->Height);
              _search_Progress->_Left(_find_Edit->Left);
              _search_Progress->_Top(_find_Edit->Top);

              _search_Progress->_BorderColor(_ide_option->color_0);
              _search_Progress->_ProgressBorderColor(_ide_option->color_0);

              BMP_Get_Bright_Color(_ide_option->color_0, 100, &color);
              _search_Progress->_ProgressColor(color);
              
              _search_Progress->_Min(0);
              _search_Progress->_Max(100);
              _search_Progress->_Progress(0);

          //}

      //}

      //[찾기목록 관련]
      //{
          //[2019.02.27.수][추가]

          //[_findList_BmpBtn]
          //{
              _findList_BmpBtn = new TGBmpButton_Form(this);

              //[2022.01.06.목][수정]
              //[V] 버튼을 <_find_Edit> 밖으로 뺀다.
              //-------------------------v
              _findList_BmpBtn->Parent = this;//_find_Edit;

              _findList_BmpBtn->_Width(15);
              _findList_BmpBtn->_Height(16);

              //[2022.01.06.목][수정]
              //[V] 버튼을 <_find_Edit> 밖으로 빼면서 관련 위치를 수정.
              _findList_BmpBtn->_Left(_find_Edit->Left + _find_Edit->Width - 1);
              _findList_BmpBtn->_Top(_find_Edit->Top);

              _findList_BmpBtn->_FrontColor(_ide_option->color_0);
              BMP_Get_Bright_Color(_ide_option->color_0, Ide_Bright_Edit, &color);
              _findList_BmpBtn->_BackColor(color);

              _findList_BmpBtn->_BorderColor(_ide_option->color_0);

              _findList_BmpBtn->_Bitmap(ExtractFilePath(Application->ExeName) + "sysbmp\\control\\trigger_all_26_12.bmp");
              _findList_BmpBtn->_ImageWidth(13);
              _findList_BmpBtn->_ImageHeight(12);

              _findList_BmpBtn->_IndexBitmap(true);
              _findList_BmpBtn->_IndexWidth(13);

              _findList_BmpBtn->_ImageX(1);
              _findList_BmpBtn->_ImageY(2);

              //[가선택] 금지.
              _findList_BmpBtn->_selColorUse = false;

              _findList_BmpBtn->Visible = true;
              _findList_BmpBtn->BringToFront();

              //[동작 함수]
              //{
                  _findList_BmpBtn->_EVENT_Click = _EVENT_Click_findList_BmpBtn;

              //}

          //}

          //[_findList_List]
          //{
              _findList_List = new TGList_Form(this);

              //[빠른목록] 처럼 [찾을 문자열:GEdit] 아래에 나오게 만든다.
              _findList_List->Parent = this;

              _findList_List->_Left(_find_Edit->Left);
              _findList_List->_Top(_find_Edit->Top + _find_Edit->Height - 1);

              //[2022.01.06.목][수정]
              //[V] 버튼을 <_find_Edit> 밖으로 빼면서 관련 폭 수정.
              //-----------------------------------------v
              _findList_List->_Width(_find_Edit->Width + 14);

              //최대 16개 항목을 표시한다.
              _findList_List->_Height(_findList_List->_fontMaxHeight * (7 - 2) + 1);

              _findList_List->_AutoWidth(false);
              _findList_List->_AutoHeight(false);
              _findList_List->_ScrollVisible(false);

              _findList_List->_BorderColor(_ide_option->color_0);

              BMP_Get_Bright_Color(_ide_option->color_0, 240, &color);
              _findList_List->_BackColor(IDE_COLOR_3);

              //[2022.01.06.목][수정]
              //<_find_Edit> 에서 문자가 너무 왼쪽 테두리에 붙이 않도록 <+2> 정도 간격을 추가했으므로
              //문자열 출력 위치를 동기화 시키기 위하여 바로 아래에 붙어 보여지는 <_findAlign_List> 역시
              //<+2> 로 출력위치를수정한다.
              //---------------------------v
              _findList_List->_MarginX(0 + 2);

              BMP_Get_Bright_Color(clBlack, 75, &color);
              _findList_List->_FontColor(clGray);

              //항목 선택은 불필요하므로 평상시와 같이 보이게 만든다.
              _findList_List->_FontSelBackColor(_ide_option->color_0);
              _findList_List->_FontSelColor(IDE_COLOR_3);

              _findList_List->_FontMouseSelBackColor(_ide_option->color_0);
              _findList_List->_FontMouseSelColor(IDE_COLOR_3);
              _findList_List->_FontMouseSelBackBright(_findList_List->_fontSelBackBright + 100/4);

              //[항목 설정]
              //{
                  //각 항목은 간단하게 [행단위] 로 구분된다.
                  _findList_List->_ItemStr("");

              //}

              //[동작함수 등록]
              //{
                  _findList_List->_EVENT_ItemSelect      = _EVENT_ItemSelect_findList_List;

                  _findList_List->_EVENT_ItemReSelect    = _EVENT_ItemReSelect_findList_List;

                  _findList_List->_EVENT_ItemMouseSelect = _EVENT_ItemMouseSelect_findList_List;

                  _findList_List->_EVENT_KeyDown_Esc     = _EVENT_KeyDown_Esc_findList_List;

                  //[빠른목록] 호출시 필요.
                  _findList_List->_EVENT_MouseUp_R       = _EVENT_MouseUp_R_findList_List;

                  //[2019.03.02.토][추가]
                  _findList_List->_EVENT_KeyDown_PreUp   = _EVENT_KeyDown_PreUp_findList_List;

              //}

          //}

          //[_findAlign_List]
          //{
              //[2019.03.02.토][추가]

              _findAlign_List = new TGList_Form(this);

              //[빠른목록] 처럼 [찾을 문자열:GEdit] 아래에 나오게 만든다.
              _findAlign_List->Parent = this;

              _findAlign_List->_Left(_find_Edit->Left);
              _findAlign_List->_Top(_find_Edit->Top + _find_Edit->Height - 1);

              //[2022.01.06.목][수정]
              //[V] 버튼을 <_find_Edit> 밖으로 빼면서 관련 폭 수정.
              //------------------------------------------v
              _findAlign_List->_Width(_find_Edit->Width + 14);

              //최대 16개 항목을 표시한다.
              _findAlign_List->_Height(_findAlign_List->_fontMaxHeight * (7 - 2) + 1);

              _findAlign_List->_AutoWidth(false);
              _findAlign_List->_AutoHeight(false);
              _findAlign_List->_ScrollVisible(false);

              _findAlign_List->_BorderColor(_ide_option->color_0);

              BMP_Get_Bright_Color(_ide_option->color_0, 240, &color);
              _findAlign_List->_BackColor(IDE_COLOR_3);

              //[2022.01.06.목][수정]
              //<_find_Edit> 에서 문자가 너무 왼쪽 테두리에 붙이 않도록 <+2> 정도 간격을 추가했으므로
              //문자열 출력 위치를 동기화 시키기 위하여 바로 아래에 붙어 보여지는 <_findAlign_List> 역시
              //<+2> 로 출력위치를수정한다.
              //----------------------------v
              _findAlign_List->_MarginX(0 + 2);

              BMP_Get_Bright_Color(clBlack, 75, &color);
              _findAlign_List->_FontColor(clGray);

              //항목 선택은 불필요하므로 평상시와 같이 보이게 만든다.
              _findAlign_List->_FontSelBackColor(_ide_option->color_0);
              _findAlign_List->_FontSelColor(IDE_COLOR_3);

              _findAlign_List->_FontMouseSelBackColor(_ide_option->color_0);
              _findAlign_List->_FontMouseSelColor(IDE_COLOR_3);
              _findAlign_List->_FontMouseSelBackBright(_findAlign_List->_fontSelBackBright + 100/4);

              //[항목 설정]
              //{
                  //각 항목은 간단하게 [행단위] 로 구분된다.
                  _findAlign_List->_ItemStr("");

              //}

              //[동작함수 등록]
              //{
                  _findAlign_List->_EVENT_ItemSelect      = _EVENT_ItemSelect_findAlign_List;

                  //[2019.03.02.토][추가]
                  _findAlign_List->_EVENT_KeyDown_PreUp   = _EVENT_KeyDown_PreUp_findAlign_List;

                  //[2019.03.02.토][추가]
                  _findAlign_List->_EVENT_MouseUp_R       = _EVENT_MouseUp_R_findAlign_List;

                  //[2019.03.02.토][추가]
                  _findAlign_List->_EVENT_ItemMouseSelect = _EVENT_ItemMouseSelect_findAlign_List;

                  //[2019.03.02.토][추가]
                  _findAlign_List->_EVENT_KeyDown_Esc     = _EVENT_KeyDown_Esc_findAlign_List;

              //}

          //}

          //[_findList_PopupMenu]
          //{
              _findList_PopupMenu         = new TGList_Form(this);

              //[!]{---------------------------------------------------------------------------
              //전체 화면을 대상으로 한다.
              //[빠른목록] 이나 [풍선도움말], [귀뜸말] 등은 전체화면을 대상으로 하는것이 좋다.
              //이렇게 해야 어떤 상황에서도 정확하게 위치를 지정할수 있다.
              _findList_PopupMenu->Parent = NULL;
              //}------------------------------------------------------------------------------

              //<GList> 를 [빠른목록] 으로 사용하므로 처음에 보이지 않게 만들어야 한다.
              _findList_PopupMenu->Visible = false;

              //[빠른메뉴] 로 사용하도록 설정한다.
              _findList_PopupMenu->_MenuMode(true);

              _findList_PopupMenu->_MarginY(1);

              _findList_PopupMenu->_AutoWidth(true);
              _findList_PopupMenu->_AutoHeight(true);

              _findList_PopupMenu->_BorderColor(_ide_option->color_0);

              BMP_Get_Bright_Color(_ide_option->color_0, 245, &color);
              _findList_PopupMenu->_BackColor(color);

              _findList_PopupMenu->_FontSelBackColor(_ide_option->color_0);
              _findList_PopupMenu->_FontSelColor(IDE_COLOR_3);

              _findList_PopupMenu->_FontMouseSelBackColor(_ide_option->color_0);
              _findList_PopupMenu->_FontMouseSelColor(IDE_COLOR_3);
              _findList_PopupMenu->_FontMouseSelBackBright(_findList_PopupMenu->_fontSelBackBright + 50/2);

              //[항목 설정]
              //{
                  //각 항목은 간단하게 [행단위] 로 구분된다.
                  _findList_PopupMenu->_ItemStr(" 삭제 \r\n"
                                                " 모두삭제 \r\n"
                                                " 내용보기 ");

              //}

              //[동작함수 등록]
              //{
                  _findList_PopupMenu->_EVENT_ItemSelect = _EVENT_ItemSelect_findList_PopupMenu;

              //}

          //}

      //}

  //}

  //[그리기]
  //{
      _Shape();

  //}

  //[폼 위치 조정]
  //{
      //폼이 항상 화면의 중앙에 나오도록 위치를 조정한다.
      this->Left = Screen->Width/2  - this->Width/2;
      this->Top  = Screen->Height/2 - this->Height/2;

  //}

  return;

}

__fastcall Tfind_DialogBox_Form::~Tfind_DialogBox_Form(void)
{
  //[2012.04.30.월][수정!!!]{---------------
  //안전을 위하여 선언한 역순으로 삭제한다.
  //}---------------------------------------

  //[2019.03.03.일][추가]{--------------------------------------------------------------------
  if(_findAlign_List     != NULL) { delete _findAlign_List; _findAlign_List = NULL;         }
  //}-----------------------------------------------------------------------------------------

  //[2019.02.27.수][추가]{--------------------------------------------------------------------
  if(_findList_PopupMenu != NULL) { delete _findList_PopupMenu; _findList_PopupMenu = NULL; }
  if(_findList_BmpBtn    != NULL) { delete _findList_BmpBtn; _findList_BmpBtn = NULL;       }
  if(_findList_List      != NULL) { delete _findList_List; _findList_List = NULL;           }
  if(_search_Progress    != NULL) { delete _search_Progress; _search_Progress = NULL;       }
  if(_gprjAllFind_Btn    != NULL) { delete _gprjAllFind_Btn; _gprjAllFind_Btn = NULL;       }
  if(_pageAllFind_Btn    != NULL) { delete _pageAllFind_Btn; _pageAllFind_Btn = NULL;       }
  if(_allFind_Label      != NULL) { delete _allFind_Label; _allFind_Label = NULL;           }
  if(_allFind_CheckBtn   != NULL) { delete _allFind_CheckBtn; _allFind_CheckBtn = NULL;     }
  //}-----------------------------------------------------------------------------------------

  if(_replaceAll_Btn != NULL) { delete _replaceAll_Btn; _replaceAll_Btn = NULL; }

  if(_replace_Btn != NULL) { delete _replace_Btn; _replace_Btn = NULL; }

  if(_find_Btn != NULL) { delete _find_Btn; _find_Btn = NULL; }

  if(_case_Label != NULL) { delete _case_Label; _case_Label = NULL; }

  if(_case_CheckBtn != NULL) { delete _case_CheckBtn; _case_CheckBtn = NULL; }

  if(_word_Label != NULL) { delete _word_Label; _word_Label = NULL; }

  if(_word_CheckBtn != NULL) { delete _word_CheckBtn; _word_CheckBtn = NULL; }

  if(_replace_Edit != NULL) { delete _replace_Edit; _replace_Edit = NULL; }

  if(_replace_Label != NULL) { delete _replace_Label; _replace_Label = NULL; }

  if(_find_Edit != NULL) { delete _find_Edit; _find_Edit = NULL; }

  if(_find_Label != NULL) { delete _find_Label; _find_Label = NULL; }

  if(_close_bmpbtns != NULL) { delete _close_bmpbtns; _close_bmpbtns = NULL; }

  if(_bmp_ != NULL) { delete _bmp_; _bmp_ = NULL; }

}

//------------------------------------------------------------------------------

void __fastcall Tfind_DialogBox_Form::_FormCut(void)
{
  //[2006.11.07.화][생성!!!]{----------------------------------------------------
  //폼의 caption 의 모양을 보기 좋게 하기 위하여 caption 의 영역을 제외한 나머지
  //영역의 폼을 제거해 준다.(구멍을 뚫어준다.)
  //여러개의 [사각형] 모양으로 구멍을 뚫어준다.
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      HRGN    rgn_main,                              //대상 폼.
              rgn_cut_rect,                          //caption 오른쪽 영역 전부.
              rgn_cut_left_line, rgn_cut_left_dot,   //수평line, dot.
              rgn_cut_right_line, rgn_cut_right_dot; //수평line, dot.
  //}


  //[Form 초기화]
  //{
      //포인터 초기화.
      rgn_main = 0;

      //Form 의 영역 정보를 얻는다.
      GetWindowRgn(this->Handle, rgn_main);

      //일단 현재 Form 영역을 지운다.
      DeleteObject(rgn_main);
  //}

  //[영역 생성]
  //{
      //새로운 영역을 생성한다.
      rgn_main = CreateRectRgn(0, 0, this->Width, this->Height);

      //[구멍 뚫을 영역 지정]
      //{
          //caption 오른쪽 영역.
          rgn_cut_rect       = CreateRectRgn(_caption_width, 0, this->Width, 18);

          //좌측 라인.
          rgn_cut_left_line  = CreateRectRgn(0, 0, 2, 1);

          //좌측 점.
          rgn_cut_left_dot   = CreateRectRgn(0, 1, 1, 2);

          //우측 라인.
          rgn_cut_right_line = CreateRectRgn(_caption_width - 2, 0, _caption_width, 1);

          //우측 점.
          rgn_cut_right_dot  = CreateRectRgn(_caption_width - 1, 1, _caption_width, 2);

      //}

      CombineRgn(rgn_main, rgn_main, rgn_cut_rect, RGN_DIFF);
      CombineRgn(rgn_main, rgn_main, rgn_cut_left_line, RGN_DIFF);
      CombineRgn(rgn_main, rgn_main, rgn_cut_left_dot, RGN_DIFF);
      CombineRgn(rgn_main, rgn_main, rgn_cut_right_line, RGN_DIFF);
      CombineRgn(rgn_main, rgn_main, rgn_cut_right_dot, RGN_DIFF);

      SetWindowRgn(this->Handle, rgn_main, TRUE);
  //}

  //[구멍 뚫기]
  //{
      //--------------------------------
      //지정 영역에 구멍을 뚫는다.
      DeleteObject(rgn_cut_rect);
      DeleteObject(rgn_cut_left_line);
      DeleteObject(rgn_cut_left_dot);
      DeleteObject(rgn_cut_right_line);
      DeleteObject(rgn_cut_right_dot);
      //--------------------------------
  //}

  return;

}

void __fastcall Tfind_DialogBox_Form::_Border(void)
{
  //[설명!!!]{----------------------------------------------------------------
  //Form 전체의 테두리를 만든다.
  //두께는 4pixel, 동서남 3 면만 그리면 된다.
  //테두리는 직접 보이는 것이고 내용에 영향을 주지 않아야 하므로 직접 그린다.

  //[2007.03.18.일][수정!!!]
  //1 pixel 의 [통합개발환경] 전체 테두리를 마지막에 그려준다.
  //이는 윤곽을 더 뚜렷하게 하기 위한 것이다.
  //}-------------------------------------------------------------------------

  //[VAR]
  //{
      TRect            trect;
  //}

  //[테두리 만들기]
  //{
      //[좌측 테두리]{-------------------------------
      trect.Left   = 0;
      trect.Top    = 0;
      trect.Right  = d_border_width;
      trect.Bottom = _bmp_->Height;

      _bmp_->Canvas->Brush->Color = _ide_option->color_0;
      _bmp_->Canvas->FillRect(trect);
      //[우측 테두리]{-------------------------------
      trect.Left   = _bmp_->Width - d_border_width;
      trect.Top    = 0;
      trect.Right  = _bmp_->Width;
      trect.Bottom = _bmp_->Height;

      _bmp_->Canvas->Brush->Color = _ide_option->color_0;
      _bmp_->Canvas->FillRect(trect);
      //[아래 테두리]{-------------------------------
      trect.Left   = 0;
      trect.Top    = _bmp_->Height - d_border_width;
      trect.Right  = _bmp_->Width;
      trect.Bottom = _bmp_->Height;

      _bmp_->Canvas->Brush->Color = _ide_option->color_0;
      _bmp_->Canvas->FillRect(trect);
      //---------------------------------------------
  //}

  //[윤곽선 만들기]
  //{
      //[2007.03.18.일][추가!!!]
      if(d_OPTION_msgbox_outline)
      {
        //[왼쪽]
        _bmp_->Canvas->Pen->Color = IDE_COLOR_outline;
        _bmp_->Canvas->MoveTo(0, 2);
        _bmp_->Canvas->LineTo(0, this->Height);

        //[오른쪽]
        _bmp_->Canvas->Pen->Color = IDE_COLOR_outline;
        _bmp_->Canvas->MoveTo(this->Width - 1, 0);
        _bmp_->Canvas->LineTo(this->Width - 1, this->Height);

        //[아래쪽]
        _bmp_->Canvas->Pen->Color = IDE_COLOR_outline;
        _bmp_->Canvas->MoveTo(0, this->Height - 1);
        _bmp_->Canvas->LineTo(this->Width - 1, this->Height - 1);

        //[제목줄 위쪽]
        _bmp_->Canvas->Pen->Color = IDE_COLOR_outline;
        _bmp_->Canvas->MoveTo(2, 0);
        _bmp_->Canvas->LineTo(_caption_width-3, 0);

        //[오늘쪽 위쪽]
        _bmp_->Canvas->Pen->Color = IDE_COLOR_outline;
        _bmp_->Canvas->MoveTo(_caption_width -1 , _caption_height - d_border_width);
        _bmp_->Canvas->LineTo(this->Width - 1, _caption_height - d_border_width);

        //[제목줄 오른쪽]
        _bmp_->Canvas->Pen->Color = IDE_COLOR_outline;
        _bmp_->Canvas->MoveTo(_caption_width -1 , 2);
        _bmp_->Canvas->LineTo(_caption_width -1, _caption_height - d_border_width);

        //[제목줄 왼쪽위 모서리]
        _bmp_->Canvas->Pen->Color = IDE_COLOR_outline;
        _bmp_->Canvas->MoveTo(2 , 0);
        _bmp_->Canvas->LineTo(0, 2);

        //[제목줄 오른쪽위 모서리]
        _bmp_->Canvas->Pen->Color = IDE_COLOR_outline;
        _bmp_->Canvas->MoveTo(_caption_width-3 , 0);
        _bmp_->Canvas->LineTo(_caption_width -1, 2);

      }
      
  //}

  return;

}

void __fastcall Tfind_DialogBox_Form::_Shape(void)
{
  //[2007.09.26.수][생성!!!]{---
  //컨트롤의 모양을 만든다.
  //}---------------------------

  //[VAR]
  //{
      TRect  rect;
      TRect  rect_caption;

      int    w, h;

      int    width, height;

  //}

  //[제목줄 폭 구하기]
  //{
      //caption 문자열의 width 를 구한다.
      FONT_Get_StringOutAreaInfo(&_font, d_FONTSTYLE_default, _caption, &width, &height);

      //실제 사용할 caption 폭을 설정한다.
      //_font.margin_size 는 처음 기본값인 0 을 사용한다.(한번만 그려주면 된다.)
      _caption_width = width + (_font.margin_size * 2) + 2;

  //}

  //[수정]
  //{
      //[닫기] 버튼의 폭과 배치를 반영하여 폭을 늘려준다.
      _caption_width += (_close_bmpbtns->Width + 4);

  //}

  //[폼 오려내기]
  //{
      _FormCut();
      
  //}

  //[모양 그리기]
  //{
      //[전체 배경 처리]
      //{
          //[영역정보]{-------------------
          rect = _bmp_->Canvas->ClipRect;
          //}-----------------------------

          //[바탕 지우기]{---------------------------
          _bmp_->Canvas->Brush->Color = IDE_COLOR_2;
          _bmp_->Canvas->FillRect(rect);
          //}----------------------------------------

      //}

      //[caption 처리]
      //{
          //[caption 영역]{----------------------
          rect_caption = rect;
          rect_caption.Bottom = _caption_height;
          //}------------------------------------

          //[caption 바탕 지우기]{-------------------
          _bmp_->Canvas->Brush->Color = _ide_option->color_0;
          _bmp_->Canvas->FillRect(rect_caption);
          //}----------------------------------------

          //[caption 문자열]
          //{
              //----------------------------------------------------------------------------------
              _font.margin_size = 0;

              //FONT_Out_String2(_bmp_, &_font, 0, 5, IDE_COLOR_3, _ide_option->color_0, true,
              //                 _caption,
              //                 d_FONT_underline_no, true, 0, IDE_COLOR_1,
              //                 &w, &h);

              //[2007.12.15.토][수정!!!]
              //위의 함수를 [형식] 을 적용할수 있는 이 함수로 바꾼다.
              FONT_Out_StyleString2(_bmp_, &_font, 0, 5, IDE_COLOR_3, _ide_option->color_0, true,
                                    d_FONTSTYLE_default,
                                    _caption,
                                    d_FONT_underline_no, true, 0, IDE_COLOR_1,
                                    &w, &h);
              //----------------------------------------------------------------------------------
          //}

      //}

      //[닫기 단추 배치]
      //{
          _close_bmpbtns->_Top(5);
          _close_bmpbtns->_Left(_caption_width - _close_bmpbtns->Width - 5);

          //[단추 배경 지우기]
          //{
              rect.Left   = _close_bmpbtns->Left - 1;
              rect.Top    = _close_bmpbtns->Top  - 1;
              rect.Right  = _close_bmpbtns->Left + _close_bmpbtns->Width  + 1;
              rect.Bottom = _close_bmpbtns->Top  + _close_bmpbtns->Height + 1;

              _bmp_->Canvas->Brush->Color = IDE_COLOR_2;
              _bmp_->Canvas->FillRect(rect);

          //}

      //}

  //}

  //[테두리]
  //{
      _Border();
  //}

  //[view]{-------------
  //그린 것을 보여준다.
  _Draw();
  //}-------------------

  return;

}

void __fastcall Tfind_DialogBox_Form::_Draw(void)
{
  BitBlt(this->Canvas->Handle, 0, 0,
         this->Width, this->Height,
         _bmp_->Canvas->Handle, 0, 0, SRCCOPY);

  return;

}

void __fastcall Tfind_DialogBox_Form::_Caption(char  *pCaption)
{
  //[2007.12.14.금][생성!!!]{-------------------------------------------------------
  //[제목줄] 문자열을 지정된 문자열로 바꾸어 주고 전체를 다시 그려준다.
  //[제목줄] 이 달라지면 폼을 다시 오려 주어야 하므로 다시 전체를 그려 주어야 한다.
  //}-------------------------------------------------------------------------------

  //[VAR]
  //{
      int            width, height;

  //}

  //[caption 설정]
  //{
      //caption 문자열.(크게 바뀔일이 없다.)
      STR_Assign(_caption, pCaption);

      //높이 지정.
      _caption_height = 22;

      //caption 문자열의 width 를 구한다.
      FONT_Get_StringOutAreaInfo(&_font, d_FONTSTYLE_default, _caption, &width, &height);

      //실제 사용할 caption 폭을 설정한다.
      //_font.margin_size 는 처음 기본값인 0 을 사용한다.(한번만 그려주면 된다.)
      _caption_width = width + (_font.margin_size * 2) + 2;

  //}

  //[그리기]
  //{
      _Shape();

  //}

  return;

}

void __fastcall Tfind_DialogBox_Form::_Width(int  pWidth)
{
  //[2007.12.14.금][생성!!!]{-----------------------------------------------------------
  //폭을 바꾸어 주고 _bmp_ 등 관련 부분도 다 수정하고 폼도 다시 오려주고 다시 그려준다.
  //}-----------------------------------------------------------------------------------

  //[크기 조정]
  //{
      //지정 폭으로 폭을 조정한다.
      _bmp_->Width = pWidth;

      this->Width  = pWidth;

  //}

  //[그리기]
  //{
      _Shape();

  //}

  return;

}

void __fastcall Tfind_DialogBox_Form::_Height(int  pHeight)
{
  //[2007.12.14.금][생성!!!]{-------------------------------------------------------------
  //높이를 바꾸어 주고 _bmp_ 등 관련 부분도 다 수정하고 폼도 다시 오려주고 다시 그려준다.
  //}-------------------------------------------------------------------------------------

  //[크기 조정]
  //{
      //지정 폭으로 폭을 조정한다.
      _bmp_->Height = pHeight;

      this->Height  = pHeight;

  //}

  //[그리기]
  //{
      _Shape();

  //}

  return;

}

void __fastcall Tfind_DialogBox_Form::_Show(void)
{
  //[2012.05.07.월][생성!!!]{-------------------------------------------
  //[맷돌C:GUI] 동작후 [가장 앞으로 보이기] 안되는 문제 수정하기 위하여
  //보여주는 함수를 새로 만든다.
  //}-------------------------------------------------------------------

  //[보이기]
  //{
      //[2012.05.07.월][추가!!!]{------------------------------------------
      //아래 <this->BringToFront()> 추가와 같은 이유인데
      //원래 지정한 것이나 재지정한다.
      //단, 어떤 이유인지는 알수 없으나 [맷돌C:GUI] 를 돌린후 우선순위
      //문제로 [가장 앞으로 보이기] 가 제대로 복구되지 않는 경우가 있다.
      //이를 완전히 초기화 하기 위하여 [기본폼] 으로 다시 지정후
      //[가장위] 로 다시 지정하면 다시 완벽하게 복구된다.
      //실험결과 여러 상황에서도 문제 없이 잘 [가장 위로 보이기] 동작된다.
      //
      //[주의!!!]----------------------------------------------------------
      //반드시 아래 순서대로 처리해야 한다.
      //
      //1) this->FormStyle = fsNormal;
      //2) this->FormStyle = fsStayOnTop;
      //3) this->BringToFront();
      //4) this->Show();
      //}------------------------------------------------------------------

      this->FormStyle = fsNormal;
      this->FormStyle = fsStayOnTop;

      this->BringToFront();

      this->Show();

  //}

}

//------------------------------------------------------------------------------
//[동작홤수들]------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tfind_DialogBox_Form::_EVENT_CloseButton_Click(void)
{
  //[2007.09.26.수][생성!!!]{---
  //이 폼을 닫는다.
  //}---------------------------

  this->Close();

  return;

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyEnter_find_Edit(void)
{
  //[2009.05.09.토][생성!!!]{-------------------------------------------------
  //현재 [찾을문자열] 에 등록된 문자열이 [편집기] 의 [형광문자] 로 등록되도록
  //다시 그려준다.
  //
  //[2018.07.25.수][추가!!!]--------------------------------------------------
  //[키:Enter]  를 처리한 경우 바로 [검색] 을 시작한다.
  //}-------------------------------------------------------------------------

  //[2019.03.03.03.일]{-------------------------------------------------------------
  //아래 <_EVENT_Click_find_Btn()> 안의 <_FindList_Add()> 에서 처리되므로 주석처리.
  //editor_edit_Form->_EditBuf_Text();
  //}-------------------------------------------------------------------------------

  //[2018.07.25.수][추가!!!]{---
  //바로 검색 시작.
  _EVENT_Click_find_Btn();
  //}---------------------------

  //[촛점 설정]
  //{
      //[2018.07.25.수][추가!!!]{-------------------------------------------
      //계속 [키:Enter] 로 찾기 동작을 할수 있도록 [촛점] 을 여기에 맞춘다.
      //}-------------------------------------------------------------------

      _find_Edit->SetFocus();

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_Change_find_Edit(void)
{
  //[2019.03.02.토][생성]

  //[근접 단어 정렬]
  //{
      _FindList_Align();
      
  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_Left_find_Edit(void)
{
  //[2019.03.02.토][생성]

  //[입력 지정자 위치:0:감추기]
  //{
      //[근접단어정렬] 뒤에 다시 보이지 않도록 여기서 바로 종료------------v
      if(_find_Edit->_caretindex == 0) { _findAlign_List->Visible = false; return;}

  //}

  //[근접 단어 정렬]
  //{
      _FindList_Align();

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_Right_find_Edit(void)
{
  //[2019.03.02.토][생성]

  //[근접 단어 정렬]
  //{
      _FindList_Align();

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_Up_find_Edit(void)
{
  //[2019.03.02.토][생성]

  //[감추기]
  //{
      //[KEY:Up] 인 경우는 감춘다.
      _findList_List->Visible = false;
      _findList_List->_ItemMouseSelect(-1);
      _findList_List->_ItemSelect(-1);

      _findAlign_List->Visible = false;
      _findAlign_List->_ItemMouseSelect(-1);
      _findAlign_List->_ItemSelect(-1);

      _findList_BmpBtn->_Index(0);

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_Down_find_Edit(void)
{
  //[2019.03.02.토][생성]{-------------------------------------------------
  //[촛점] 을 보이는 순서대로 설정한다.
  //즉, 가장위에 보이는 것에 설정하고 종료.
  //이는 <_findFind_List> 와 <_findAlign_List> 가 동시에 나올수 있기 때문.
  //항상 <_findAlign_List> 이 위에 존재하므로 먼저 검사처리한다.
  //
  //[가선택:번호] 를 0 으로 설정해 줘야 한다.
  //}----------------------------------------------------------------------

  if(_findAlign_List->Visible == true)
  {
    _findAlign_List->SetFocus();

    _findAlign_List->_ItemMouseSelect(0);

    //한개만 처리해야 하므로 먼저 처리했다면 여기서 종료.
    return;

  }

  if(_findList_List->Visible == true)
  {
    _findList_List->SetFocus();

    _findList_List->_ItemMouseSelect(0);

  }

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_Home_find_Edit(void)
{
  //[2019.03.02.토][생성]{----------------------------------------------
  //[Key:Home] 의 경우는 [Key:Left] 의 [입력지정자위치:0] 과 동일하지만
  //일단, 기본 처리로 둔다.
  //}-------------------------------------------------------------------

  //[근접 단어 정렬]
  //{
      _FindList_Align();;
      
  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_End_find_Edit(void)
{
  //[2019.03.02.토][생성]

  //[근접 단어 정렬]
  //{
      _FindList_Align();

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_Click_word_CheckBtn(void)
{
  //[2009.05.09.토][생성!!!]{-------------------------------------------------
  //현재 [찾을문자열] 에 등록된 문자열이 [편집기] 의 [형광문자] 로 등록되도록
  //다시 그려준다.
  //}-------------------------------------------------------------------------

  editor_edit_Form->_EditBuf_Text();

  return;

}

void __fastcall Tfind_DialogBox_Form::_EVENT_Click_case_CheckBtn(void)
{
  //[2009.05.09.토][생성!!!]{-------------------------------------------------
  //현재 [찾을문자열] 에 등록된 문자열이 [편집기] 의 [형광문자] 로 등록되도록
  //다시 그려준다.
  //}-------------------------------------------------------------------------

  editor_edit_Form->_EditBuf_Text();

  return;

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_Esc_All(void)
{
  //[2012.05.20.일][생성!!!]{--------
  //<키:ESC> 가 눌리 경우 공통 처리.
  //대화상자를 닫아준다.
  //}--------------------------------

  _EVENT_CloseButton_Click();

  return;

}

//------------------------------------------------------------------------------
//[찾기관련 함수]---------------------------------------------------------------
//------------------------------------------------------------------------------

bool __fastcall Tfind_DialogBox_Form::_Find(//선택 된것 항상 보이기.
                                            bool  pSelectView,
                                            //다시 그릴 것인가.
                                            bool  pReDraw,
                                            //찾을수 없는 경우 대화상자 보여주려면 true.
                                            bool  pMsgView,
                                            //[2009.05.08.금][추가!!!]
                                            //[입력지정자] 위쪽 보기 설정.
                                            bool  pAlwaysTopMiddle,
                                            //[입력지정자] 아래쪽 보기 설정.
                                            bool  pAlwaysBottomMiddle)
{
  //[2009.05.06.수][생성!!!]{-------------------------------------------
  //[찾을 문자열] 을 현재 편집중인 문서의 [입력지정자] 위치부터 찾는다.
  //찾으면 멈춘다.
  //}-------------------------------------------------------------------

  //[VAR]
  //{
      //찾기 시작할 위치.
      int  findStartIndex;
      int  findIndex;

  //}

  //[찾을 문자열이 있나?]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(_find_Edit->_editbuf[0] == '\0') return(false);

  //}

  //[찾기 시작 위치 지정]
  //{
      //이미 찾은 단어가 선택된 상태인 경우는 이 다음위치 부터 처리해야 한다.
      if((editor_edit_Form->_select_start.caret_index >= 0) &&
         (editor_edit_Form->_select_end.caret_index >= 0) &&
         //같은 위치라면 [선택영역] 이 없는 것으로 본다.
         (editor_edit_Form->_select_start.caret_index != editor_edit_Form->_select_end.caret_index))
      {
        //이 경우는 이미 선택된 것이 있으므로 다음 위치로 이동한다.
        findStartIndex = editor_edit_Form->_select_start.caret_index + 1;

      }
      else
      {
        //새로 시작하는 경우로 보고 현재 [입력지정자] 위치를 할당한다.
        findStartIndex = editor_edit_Form->_caretindex;

      }

  //}

  //[찾기]
  //{
      //지정한 조건으로 찾는다.
      STR_Find(editor_edit_Form->_editbuf, editor_edit_Form->_filesize,
               findStartIndex, _word_CheckBtn->_checked, _case_CheckBtn->_checked,
               _find_Edit->_editbuf, &findIndex);

      if(findIndex == -1)
      {
        if(pMsgView == true)
        {
          //이 경우는 찾는 것이 없는 것이다.
          ide_msgbox_Form->_MsgBox(d_MSGBOX_info,
                                   "현재 문서에서 더이상 해당 문자열을 찾을수 없습니다.");

        }

        return(false);

      }

  //}

  //[<선택영역> 으로 지정]
  //{
      //찾을 문자열을 [선택영역] 으로 지정해준다.
      //아래 함수에서 자동으로 [선택] 한것이 보이는 위치에 있도록 처리된다.
      editor_edit_Form->History_SelectX(findIndex,
                                        findIndex + STR_Length(_find_Edit->_editbuf),
                                        pSelectView,
                                        NULL,
                                        pReDraw,
                                        pAlwaysTopMiddle,
                                        pAlwaysBottomMiddle);
                                  
  //}

  return(true);

}

bool __fastcall Tfind_DialogBox_Form::_Find_ReplaceStr(//선택 된것 항상 보이기.
                                                       bool  pSelectView,
                                                       //다시 그릴 것인가.
                                                       bool  pReDraw,
                                                       //찾을수 없는 경우 대화상자 보여주려면 true.
                                                       bool  pMsgView,
                                                       //[입력지정자] 위쪽 보기 설정.
                                                       bool  pAlwaysTopMiddle,
                                                       //[입력지정자] 아래쪽 보기 설정.
                                                       bool  pAlwaysBottomMiddle)
{
  //[2019.02.14.목][생성]{-----------------------------------------------
  //[교환 문자열] 을 현재 편집중인 문서의 [입력지정자] 위치부터 찾는다.
  //찾으면 멈춘다.
  //
  //이 함수는 [키:F4] 를 누르면 [교환:문자열] 을 찾아 주는 기능을 위한것.
  //[키:F3] 와 유사한 기능.
  //}---------------------------------------------------------------------

  //[VAR]
  //{
      //찾기 시작할 위치.
      int  findStartIndex;
      int  findIndex;

  //}

  //[찾을 문자열이 있나?]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(_replace_Edit->_editbuf[0] == '\0') return(false);

  //}

  //[찾기 시작 위치 지정]
  //{
      //이미 찾은 단어가 선택된 상태인 경우는 이 다음위치 부터 처리해야 한다.
      if((editor_edit_Form->_select_start.caret_index >= 0) &&
         (editor_edit_Form->_select_end.caret_index >= 0) &&
         //같은 위치라면 [선택영역] 이 없는 것으로 본다.
         (editor_edit_Form->_select_start.caret_index != editor_edit_Form->_select_end.caret_index))
      {
        //이 경우는 이미 선택된 것이 있으므로 다음 위치로 이동한다.
        findStartIndex = editor_edit_Form->_select_start.caret_index + 1;

      }
      else
      {
        //새로 시작하는 경우로 보고 현재 [입력지정자] 위치를 할당한다.
        findStartIndex = editor_edit_Form->_caretindex;

      }

  //}

  //[찾기]
  //{
      //지정한 조건으로 찾는다.
      STR_Find(editor_edit_Form->_editbuf, editor_edit_Form->_filesize,
               findStartIndex, _word_CheckBtn->_checked, _case_CheckBtn->_checked,
               _replace_Edit->_editbuf, &findIndex);

      if(findIndex == -1)
      {
        if(pMsgView == true)
        {
          //이 경우는 찾는 것이 없는 것이다.
          ide_msgbox_Form->_MsgBox(d_MSGBOX_info,
                                   "현재 문서에서 더이상 해당 문자열을 찾을수 없습니다.");

        }

        return(false);

      }

  //}

  //[<선택영역> 으로 지정]
  //{
      //찾을 문자열을 [선택영역] 으로 지정해준다.
      //아래 함수에서 자동으로 [선택] 한것이 보이는 위치에 있도록 처리된다.
      editor_edit_Form->History_SelectX(findIndex,
                                        findIndex + STR_Length(_replace_Edit->_editbuf),
                                        pSelectView,
                                        NULL,
                                        pReDraw,
                                        pAlwaysTopMiddle,
                                        pAlwaysBottomMiddle);
                                  
  //}

  return(true);

}

bool __fastcall Tfind_DialogBox_Form::_Find2(//찾을 문자열.
                                             char  *pStr)
{
  //[2018.05.06.일][생성!!!]{-------------------------------------------
  //[찾을 문자열] 을 현재 편집중인 문서의 [입력지정자] 위치부터 찾는다.
  //찾으면 멈춘다.
  //
  //<ide_main.c:Ide_Menu_TabToSpaceX()> 함수에서 사용.
  //
  //이 함수는 <_Find()> 함수를 간단하게 만든것.
  //}-------------------------------------------------------------------

  //[VAR]
  //{
      //찾기 시작할 위치.
      int  findStartIndex;
      int  findIndex;

  //}

  //[찾을 문자열이 있나?]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(pStr[0] == '\0') return(false);

  //}

  //[찾기 시작 위치 지정]
  //{
      //이미 찾은 단어가 선택된 상태인 경우는 이 다음위치 부터 처리해야 한다.
      if((editor_edit_Form->_select_start.caret_index >= 0) &&
         (editor_edit_Form->_select_end.caret_index >= 0) &&
         //같은 위치라면 [선택영역] 이 없는 것으로 본다.
         (editor_edit_Form->_select_start.caret_index != editor_edit_Form->_select_end.caret_index))
      {
        //이 경우는 이미 선택된 것이 있으므로 다음 위치로 이동한다.
        findStartIndex = editor_edit_Form->_select_start.caret_index + 1;

      }
      else
      {
        //새로 시작하는 경우로 보고 현재 [입력지정자] 위치를 할당한다.
        findStartIndex = editor_edit_Form->_caretindex;

      }

  //}

  //[찾기]
  //{
      //지정한 조건으로 찾는다.
      STR_Find(editor_edit_Form->_editbuf, editor_edit_Form->_filesize,
               findStartIndex, _word_CheckBtn->_checked, _case_CheckBtn->_checked,
               pStr, &findIndex);

      if(findIndex == -1)
      {
        return(false);

      }

  //}

  //[<선택영역> 으로 지정]
  //{
      //찾을 문자열을 [선택영역] 으로 지정해준다.
      //아래 함수에서 자동으로 [선택] 한것이 보이는 위치에 있도록 처리된다.
      editor_edit_Form->History_SelectX(findIndex,
                                        findIndex + STR_Length(pStr),
                                        false,
                                        NULL,
                                        false,
                                        false,
                                        true);

  //}

  return(true);

}

bool __fastcall Tfind_DialogBox_Form::_TreeFind_EditorViewDoc(void)
{
  //[2019.02.17.일][생성]{------------------------------------------------------
  //[현재 편집중인 문서] 를 대상으로 [찾을 문자열] 에 등록된 문자열을 모두 찾고
  //[Tree:전체찾기] 에 정리해 준다.
  //
  //반드시 문서 [처음부터] 찾는다.
  //
  //[참고]**********************************************************************
  //
  //이 함수는 [새문서.xxx] 인 경우도 처리 가능하다.
  //
  //[2019.02.21.목][중요수정]***************************************************
  //가) 한번은 검색, 두번째 다시 검색후 정리.
  //나) <STRHEAP> 에 [전체찾기] 지원을 위해 추가된 함수 사용.
  //}---------------------------------------------------------------------------

  //[VAR]
  //{
      class   DATABASE  *DB_;

      struct  TREE      *treeGprj, *treeFind;

      char    fileStr[1024*10];

      char    fileName[1024*10];

      char    lineStr[1024*10];

      //찾기 시작할 위치.
      int     findStartIndex;
      int     findIndex;

      //[찾은 문자열] 길이.
      int     findStrLength;
      
      //찾은 [순수:찾은항목] 개수(문서 제외).
      int     itemCount;

      //[2019.02.21.목][추가]
      int     docItemIndex;
      int     itemIndex;

      //[2019.02.23.토][추가]
      double  procDiv;
      int     proc;

      //[2019.02.23.토][추가]{-------------------------------------------------
      //[찾은항목] 에 등록되는 [문자열] 의 총 크기를 가진다.
      //[STRHEAP] 의 [저장소] 를 이 크기에 맞게 처음에 생성하고 시작할때 필요.
      //150만개 찾은 항목의 경우 [11초] => [3초] 로 처리 시간이 대폭 단축된다.
      int     totoalFindItemStrSize;
      //}----------------------------------------------------------------------

      //[2019.02.23.토][추가]
      int     lineEndIndex;

      //[2019.02.26.화][추가]
      int     lineStartIndex;

  //}

  //[기본 처리]
  //{
      DATABASE_GetPtr(&DB_);

  //}

  //[Tree 치환]
  //{
      treeFind = &(tree_tree_Form->_tree[d_TREE_find]);

  //}

  //[찾을 문자열 존재 확인]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(_find_Edit->_editbuf[0] == '\0') return(false);

  //}

  //[찾을 문자열 길이 얻기]
  //{
      findStrLength = STR_Length(_find_Edit->_editbuf);

  //}

  //[열린 문서가 있는지 확인]
  //{
      //최소한 한개의 문서는 열려 있어야 한다.
      if(editor_edit_Form->_textinfo_count == 0) return(false);

  //}
  
  //[문서 정보 얻기]
  //{ 
      //[!]{-------------------------------------------------------------
      //현재 검색하는 [문서] 정보 얻기.
      //
      //단, [설계묶음] 내부 문서인 경우는 [내부:경로이름확장자] 로 변경.
      //}----------------------------------------------------------------

      //현재 [편집기] 에 열려있는 [문서이름] 얻기.
      editor_top_Form->_Get_TitleStr(fileStr);

      //[설계묶음 내부 문서 구분처리]
      //{
          if(STR_BaseDirectory_Match(DB_->projectpath, fileStr) == true)
          {
            //[!]{-----------------------
            //[설계묶음] 안 문서인 경우.
            //}--------------------------

            //순수한 <*.gprj> 존재하는 폴더 안의 [내부경로] 만 추출한다.
            STR_GetFileName_Except_BaseDirectory(DB_->projectpath, fileStr, fileName);

          }
          else
          {
            //[!]{-----------------------
            //[기본문서/새문서] 인 경우.
            //}--------------------------
            
            STR_Assign(fileName, fileStr);

          }

      //}

      //[!]{-----------------------------------------------------------------
      //<fileStr>  : 원본 문서이름(Tree 에 등록할 문서이름).
      //<fileName> : 실제 [문서] 를 열어서 처리할때 사용할 [경로이름확장자].
      //}--------------------------------------------------------------------
        
  //}
  
  //[첫번째 검색]
  //{
      //[2019.02.21.목][추가]{--------------------------------------------------------------
      //첫번째 검색은 [개수] 정보를 얻기 위한것.
      //
      //이는 [100 만개] 이상의 항목인 경우 [Tree] 에 고속으로 등록하기 위하여 [STRHEAP] 과
      //관련된 별도 설정(목록수를 100만개 이상으로 생성)을 해야 하기 때문이다.
      //
      //[!]{--------------------------------------------------------------------------------
      //지정한 조건으로 [문서] 처음부터 [전체] 를 찾는다.
      //여기서는 단지 [찾은항목:개수] 만 얻는다.
      //
      //[2019.02.23.토][중요수정]***********************************************************
      //기존 <STR_Find()> 를 사용하는 방식에서 <STR_Find_Bound()> 로 [행단위] 로 처리하는
      //방식으로 수정(찾을 문자열에 [CRLF] 는 사용할수 없으므로 행단위 처리 가능).
      //
      //[진행막대] 와 [연동] 을 위한것으로 { [문서량 크다] && [찾은것 작다] } 의 경우에
      //<STR_Find()> 안의 [반복문] 처리로 [진행막대] 의 진행이 [멈추는] 경우가 많기 때문.
      //
      //따라서, [처리하는 전체 문서 크기:최대] 로 설정하고 [현재 까지 처리한 크기:진행]
      //으로 설정하여 [진행막대] 가 멈추지 않고 일정하게 진행하도록 하였다.
      //
      //이를 위하여 <STR_Find_Bound()> 를 새로 제작했음.
      //}-----------------------------------------------------------------------------------

      //[진행막대:설정]
      //{
          //[2019.02.22.금][추가]

          //[진행분할값:계산]
          //{
              //[!]{---------------------------------------------------
              //기본 [100] 단계로 처리하므로 이에 맞게 설정.
              //103, 166 등 Max 값이 정확하게 정수로 분할할수 없으므로
              //[실수] 를 사용하여 처리한다.
              //
              //즉, [procDiv 로 나눈 몫] 을 [진행값] 으로 적용한다.
              //}------------------------------------------------------

              if(editor_edit_Form->_filesize <= 100)
              {
                procDiv = 1;

                //예 60 이라며 [60 단계] 까지만 처리한다.
                _search_Progress->_Max(editor_edit_Form->_filesize);

                _search_Progress->_Progress(0);

                proc = 0;

              }
              else
              {
                procDiv = ((double)editor_edit_Form->_filesize)/100;

                //100 단계.
                _search_Progress->_Max(100);

                _search_Progress->_Progress(0);

                proc = 0;

              }  

          //}

          //진행막대 보이기.
          _search_Progress->Visible = true;

          //가장 위에 보이도록 설정.
          _search_Progress->BringToFront();

      //}
      
      //[전체 항목 문자열 크기 합산]
      //{
          //[2019.02.23.토][추가]{-------------------------------
          //[찾은항목] 에 등록되는 [문자열] 의 [전체 크기] 계산.
          //}----------------------------------------------------

          totoalFindItemStrSize = 0;

          totoalFindItemStrSize += STR_Length(fileName);

      //}

      //문서 처음부터 찾기.
      for(findStartIndex = 0, itemCount = 0, lineEndIndex = 0; _pageAllFind_Ing == true; )
      {
        //[2019.02.19.화][추가]{---------------------------------------------
        //[검색] 하는 [문서량] 이 많은 경우 멈춰있는 경우가 있으므로 넣는다.
        Application->ProcessMessages();
        //}------------------------------------------------------------------

        //[검사할 행 <끝:위치> 얻기]
        //{
            STR_Get_ThisLineEndIndex(editor_edit_Form->_editbuf, findStartIndex, &lineEndIndex);

            //[문서 끝 확인]
            //{
                //문서 끝이라면 종료.
                if(editor_edit_Form->_editbuf[lineEndIndex] == '\0') break;

            //}

        //}

        //[행 단위 찾기]
        //{
            //[!]{----------------------------------------------
            //<STR_Find_Bound()> 를 사용하여 [행:단위] 로 검사.
            //이는 [처리량] 과 [진행막대] 를 연동하기 위한것.
            //}-------------------------------------------------

            while(1)
            {
              STR_Find_Bound(editor_edit_Form->_editbuf,
                              //찾을 범위 정보.
                             findStartIndex, lineEndIndex,
                             //찾을 조건.
                             _word_CheckBtn->_checked, _case_CheckBtn->_checked,
                             //찾을 문자열.
                             _find_Edit->_editbuf,
                             //찾은 위치.
                             &findIndex);

              if(findIndex >= 0)
              {
                //찾은 개수 증가.
                itemCount++;

                //[다음 찾기 시작 위치 지정]
                //{
                    //현재 찾은 문자열 끝 부터 다시 시작.
                    findStartIndex = (findIndex + findStrLength);

                //}

                //[전체 항목 문자열 크기 합산]
                //{
                    //[2019.02.23.토][추가]{----------------------------------
                    //[찾은항목] 에 등록되는 [문자열] 의 [전체 크기] 를 계산.
                    //
                    //NULL 인 경우는 [길이] 정보만 반환.
                    //이 기능을 위하여 <STR_Get_ThisLineStr()> 함수 수정.
                    //}-------------------------------------------------------

                    //실제 문자열을 추출하지 않고 [문자열:길이] 정보만 얻는다(고속 처리 함수).
                    totoalFindItemStrSize += STR_Get_ThisLineStr(editor_edit_Form->_editbuf, findIndex, NULL);

                //}

              }
              else
              {
                //현재 범위에서 더이상 찾을 것이 없다면 검사 종료.
                break;

              }
            
            }
            
        //} 

        //[진행막대:설정]
        //{
            //[2019.02.23.토][추가]
            proc = ((double)findStartIndex)/procDiv;

            //[중복] 처리를 방지하기 위하여 현재 설정값과 다른 경우만 처리.
            if(_search_Progress->_progress != proc)
            {
              _search_Progress->_Progress(((double)findStartIndex)/procDiv);

            }

        //}
        
        //[검사할 행 <시작:위치> 얻기]
        //{
            //다음 검사행 시작 위치를 검색 시작 위치로 설정.
            STR_Get_NextLineStartIndex(editor_edit_Form->_editbuf, lineEndIndex, &findStartIndex);
        
        //}

      }

      //[!]{------------------------------------
      //찾은 항목수는 <itemCount> 에 들어 있다.
      //}---------------------------------------

      //[진행막대:설정]
      //{
          //[2019.02.23. 토][추가]{---
          //진행막대 감추기.
          //}-------------------------
          
          _search_Progress->Visible = false;

      //}

      //[처리 중단 요청 확인]
      //{
          //[2019.02.23.토][추가]{--------------------------------------------
          //<_pageAllFind_Ing : false> 인 경우는 [처리 중단 요청] 으로 도중에
          //중단된 것이므로 더이상 다른 처리를 하지 않고 종료시킨다.
          //}-----------------------------------------------------------------

          if(_pageAllFind_Ing == false)
          {
            ide_msgbox_Form->_MsgBox(d_MSGBOX_info,
                                     "사용자 요청으로 [항목수] 정보 추출 단계가 중단되었습니다.");

            //미완성 처리이므로 <false> 로 간주.
            goto  lbFalse;

          }  

      //}
      
  //}

  //[찾기 정보만 출력하는지 확인]
  //{
      //[2019.02.23.토][추가]{--------------------------------------------------------------------
      //[전체찾기] 결과 정보만 출력하는 경우는 [두번째 검색] 을 처리하지 않고 해당 부분으로 이동.
      //}-----------------------------------------------------------------------------------------

      if(_allFind_CheckBtn->_checked == true) goto lbFindInfoOut;

  //}

  //[Tree:STRHEAP:재생성]
  //{
      //[2019.02.21.목][추가]{----------------------------------------------------------------
      //위에서 찾은 [항목수] 에 맞게 [Tree:STRHEAP] 크기를 [재생성] 한다.
      //
      //이는 [STRHEAP] 에서 [빈곳] 을 찾지 않고 [연속/순차적으로] 계속 등록하여 등록되는
      //처리시간을 단축하기 위한것으로, [빈곳] 을 찾아 [목록:index] 를 반환하는
      //<STRHEAP_List_Add()> 함수를 제어하기 위한것.
      //
      //단, 찾은 항목이 0 인 경우는 [재생성] 하지 않는다.
      //
      //[Tree] 항목은 기본 250 개 정도로 생성하므로 [문서] 한개가 기본 등록되지만 이미 생성된
      //것으로 충분하다(찾은 [항목수] 로만 결정한다).
      //
      //[Tree] 도 [찾은개수] 만큼 무조건 [재생성] 한다.
      //[100만개] 의 경우 [Tree] 가 자주 [재생성] 되어 [처리시간 증가] 에 주 원인이 된다.
      //[100만개] 기준으로 <40초 -> 3초> 로 단축 된다.
      //
      //[2019.02.23.토][중요수정]*************************************************************
      //[100만개] 항목 이상인 경우 [찾은항목] 문자열의 총 크기가 64M 를 넘은 경우가 발생하고
      //[STRHEAP] 의 기본 재생성 크기는 [512K] 이므로 계속 [재생성=>복사] 하는 과정에서
      //엄청난 시간이 소요됨을 발견하였다.
      //
      //따라서, [첫번째 검색] 에서 <totoalFindItemStrSize> 에 [찾은항목 총 문자열 크기] 를
      //구하고, 여기서 [STRHEAP] 를 아예 다른 것 과 같이 <totoalFindItemStrSize> 만큼 더 큰
      //크기로 [재생성] 하고 시작한다(도중에 [재생성] 없이 계속 추가할수 있도록).
      //
      //[200만개] 의 찾은 항목이 존재하는 경우 처리 속도는 불과 [3초] 가 된다.
      //}-------------------------------------------------------------------------------------

      if(itemCount > 0)
      {
        //[!]{--------------------------------------------------------------------------
        //[root] 항목은 1 개 뿐이고, 기본 생성크기안에 모두 들어가므로 고려하지 않는다.
        //}-----------------------------------------------------------------------------

        //[Tree]
        //{
            //[Tree] 도 도중에 [재생성] 되지 않도록 충분한 양을 미리 재생성 한다(재생성 크기만큼 여유를 준다).
            //여유값-----------------------------------------------------v
            tree_tree_Form->_Tree_ReSizeX(treeFind, itemCount + Opt_Tree_AddSize);

        //}

        //[STRHEAP:문자열공간]
        //{
            //[!]{----------------------------------------------------------------------------------
            //[STRHEAP] 은 { [4] + [문자열+'\0'] } 로 저장되므로 [찾은 문자열 전체 문자열 길이]
            //만으로는 용량이 모자라다.
            //
            //따라서, 앞의 [항목수] 만큼의 [4바이트] 부분을 계산해 줘야 한다.
            //더불어, [문자열] 에 '\0' 까지 붙어서 저장되므로 이 [1바이트] 까지 계산에 넣어야 한다.
            //}-------------------------------------------------------------------------------------

            STRHEAP_Heap_ReSizeX(&(treeFind->_strHeap),
                                 //[재생성] 시 추가할 크기(재생성 크기만큼 여유를 준다).
                                 itemCount*(4/*[문자열크기(4)]*/ + 1/*'\0'*/) +
                                 //여유값-------------------------------v
                                 totoalFindItemStrSize + d_STRHEAP_Heap_addSize);

        //}

        //[STRHEAP:목록]
        //{
            //크기 재생성.
            STRHEAP_List_ReSizeX(&(treeFind->_strHeap),
                                 //[재생성] 시 추가할 크기(재생성 크기만큼 여유를 준다).
                                 //여유값-------------------v
                                 itemCount + d_STRHEAP_List_addSize);

            //<STRHEAP_List_Add()> 내부적으로 [빈곳] 을 찾지 않고 바로 [목록] 번호를
            //[순차적으로] 생성하도록 설정.
            //-----------------------------------------------v
            STRHEAP_Set_List_NoSearch(&(treeFind->_strHeap), true, 1);
            //[root]-----------------------------------------------^
            //으로 이미 채워진 위치 다음부터 기록되도록 처리한다.
            //단, [Tree] 초기화 후 [root] 만 기록된 것으로 간주.

        //}

      }

  //}

  //[두번째 검색]
  //{
      //[!]{---------------------------------------------------------------------
      //[개수] 정보로 이미 [Tree:STRHEAP:재생성] 한 상태이므로 여기서는 발견되는
      //순서대로 [Tree] 에 등록한다(추가할 충분한 용량을 미리 확보한 상태).
      //}------------------------------------------------------------------------

      //[진행막대:설정]
      //{
          //[2019.02.23.토][추가]

          //[진행분할값:계산]
          //{
              //[!]{---------------------------------------------------
              //기본 [100] 단계로 처리하므로 이에 맞게 설정.
              //103, 166 등 Max 값이 정확하게 정수로 분할할수 없으므로
              //[실수] 를 사용하여 처리한다.
              //
              //즉, [procDiv 로 나눈 몫] 을 [진행값] 으로 적용한다.
              //}------------------------------------------------------

              if(editor_edit_Form->_filesize <= 100)
              {
                procDiv = 1;

                //예 60 이라며 [60 단계] 까지만 처리한다.
                _search_Progress->_Max(editor_edit_Form->_filesize);

                _search_Progress->_Progress(0);

                proc = 0;

              }
              else
              {
                procDiv = ((double)editor_edit_Form->_filesize)/100;

                //100 단계.
                _search_Progress->_Max(100);

                _search_Progress->_Progress(0);

                proc = 0;

              }

          //}

          //진행막대 보이기.
          _search_Progress->Visible = true;

          //가장 위에 보이도록 설정.
          _search_Progress->BringToFront();

      //}

      //[문서 등록]
      //{
          //[!]{----------------------------------------------------------------------
          //현재 검색하는 문서를 [Tree:문서항목] 으로 등록.
          //
          //단, [설계묶음] 내부 문서인 경우는 [내무:경로이름확장자] 로 변경해서 등록.
          //}-------------------------------------------------------------------------
         
          //[항목:문서] 추가.
          if(Ide_Tree_Find_Add_Doc(fileName, false,
                                   //[2019.02.21.목][추가]
                                   &docItemIndex) != true) goto lbFalse;

          //[문서항목:마지막 항목]
          //{
              //[2019.02.21.목][추가]{------------------------------------------
              //현재 편집기에 [열려있는 문서] 만을 대상으로 처리하여 [문서] 가
              //한개 밖에 없으므로 이 문서를 미리 [문서:항목] 의 [마지막 항목]
              //으로 설정.
              //
              //[마지막 항목] 설정은 [그리기] 시에 절대적으로 필요하므로 반드시
              //설정해줘야 한다.
              //}---------------------------------------------------------------

              treeFind->items[docItemIndex].lastItem = true;

          //}

          //[kind 설정]
          //{
              //[중요]{------------------------------------------------------------------
              //[현재 문서 전체 찾기] 의 경우는 [찾은:항목] 이 <0> 이라도 [문서:항목] 은
              //유지 되므로 [하위항목] 이 있는 경우와 없는 경우를 구분해서 처리.
              //}------------------------------------------------------------------------

              if(itemCount == 0)
              {
                //항목이 없으므로 기본 항목으로 처리.
                treeFind->items[docItemIndex].kind = '.';
                
              }
              else
              {
                //하위 항목이 존재하는 것으로 처리.
                treeFind->items[docItemIndex].kind = '+';
              
              } 

          //}

      //}

      //[찾기]
      //{
          //[!]{------------------------------------------------------------------------------
          //지정한 조건으로 [문서] 처음부터 [전체] 를 찾는다.
          //처음부터 더이상 찾을수 없는 상태까지 찾으면서 [Tree:전체찾기] 에 등록한다.
          //
          //[2019.02.23.토][중요수정]*********************************************************
          //기존 <STR_Find()> 를 사용하는 방식에서 <STR_Find_Bound()> 로 [행단위] 로 처리하는
          //방식으로 수정(찾을 문자열에 [CRLF] 는 사용할수 없으므로 행단위 처리 가능).
          //
          //[진행막대] 와 [연동] 을 위한것으로 { [문서량 크다] && [찾은것 작다] } 의 경우에
          //<STR_Find()> 안의 [반복문] 처리로 [진행막대] 의 진행이 [멈추는] 경우가 많기 때문.
          //
          //따라서, [처리하는 전체 문서 크기:최대] 로 설정하고 [현재 까지 처리한 크기:진행]
          //으로 설정하여 [진행막대] 가 멈추지 않고 일정하게 진행하도록 하였다.
          //
          //이를 위하여 <STR_Find_Bound()> 를 새로 제작했음.
          //}---------------------------------------------------------------------------------

          //문서 처음부터 찾기.
          for(findStartIndex = 0, lineStartIndex = 0, lineEndIndex = 0; _pageAllFind_Ing == true; )
          {
            //[2019.02.19.화][추가]{---------------------------------------------
            //[검색] 하는 [문서양] 이 많은 경우 멈춰있는 경우가 있으므로 넣는다.
            Application->ProcessMessages();
            //}------------------------------------------------------------------

            //[검사할 행 <끝:위치> 얻기]
            //{
                STR_Get_ThisLineEndIndex(editor_edit_Form->_editbuf, findStartIndex, &lineEndIndex);
                
                //[문서 끝 확인]
                //{
                    //문서 끝이라면 종료.
                    if(editor_edit_Form->_editbuf[lineEndIndex] == '\0') break;

                //}

            //}

            //[행 단위 찾기]
            //{
                //[!]{----------------------------------------------
                //<STR_Find_Bound()> 를 사용하여 [행:단위] 로 검사.
                //이는 [처리량] 과 [진행막대] 를 연동하기 위한것.
                //}-------------------------------------------------

                while(1)
                {
                  STR_Find_Bound(editor_edit_Form->_editbuf,
                                  //찾을 범위 정보.
                                 findStartIndex, lineEndIndex,
                                 //찾을 조건.
                                 _word_CheckBtn->_checked, _case_CheckBtn->_checked,
                                 //찾을 문자열.
                                 _find_Edit->_editbuf,
                                 //찾은 시작 위치.
                                 &findIndex);

                  if(findIndex >= 0)
                  {
                    //[찾은 항목 등록 문자열]
                    //{
                        //[<찾은 문자열> 위치 <행 문자열> 얻기]
                        //{
                            STR_Get_ThisLineStr(editor_edit_Form->_editbuf,
                                                //[찾은 문자열] 위치.
                                                findIndex,
                                                lineStr);

                        //}

                        //[<Tree:찾은항목> 등록]
                        //{
                            Ide_Tree_Find_Add_Item(lineStr,
                                                   findIndex,
                                                   findIndex + findStrLength,
                                                   //[2019.02.16.화][추가]{---
                                                   lineStartIndex,
                                                   //}------------------------
                                                   false,
                                                   //[2019.02.21.목][추가]
                                                   &itemIndex);

                        //}

                    //}    

                    //[다음 찾기 시작 위치 지정]
                    //{
                        //현재 찾은 문자열 끝 부터 다시 시작.
                        findStartIndex = (findIndex + findStrLength);

                    //}

                  }
                  else
                  {
                    //현재 범위에서 더이상 찾을 것이 없다면 검사 종료.
                    break;

                  }
                
                }
                
            //} 

            //[진행막대:설정]
            //{
                //[2019.02.23.토][추가]
                proc = ((double)findStartIndex)/procDiv;

                //[중복] 처리를 방지하기 위하여 현재 설정값과 다른 경우만 처리.
                if(_search_Progress->_progress != proc)
                {
                  _search_Progress->_Progress(((double)findStartIndex)/procDiv);

                }

            //}
            
            //[검사할 행 <시작:위치> 얻기]
            //{
                //다음 검사행 시작 위치를 검색 시작 위치로 설정.
                STR_Get_NextLineStartIndex(editor_edit_Form->_editbuf, lineEndIndex, &lineStartIndex);

                //[2019.02.26.화][추가]
                findStartIndex = lineStartIndex;

            //}

          }

          //[찾은항목:마지막 항목]
          //{
              //[2019.02.21.목][추가]{-----------------------------------
              //현재 <itemIndex> 가 [찾은:항목] 의 마지막 항목이 된다.
              //
              //[마지막 항목] 설정은 [그리기] 시에 절대적으로 필요하므로
              //반드시 설정해줘야 한다.
              //}--------------------------------------------------------

              //[root:0] 이므로 0 은 제외.
              if(itemIndex > 0)
              {
                treeFind->items[itemIndex].lastItem = true;

              }

          //}

      //}

  //}

  //[처리 중단 요청 확인]
  //{
      //[2019.02.23.토][추가]{-------------------------------------
      //<_pageAllFind_Ing : false> 인 경우는 [처리 중단 요청] 으로
      //도중에 중단된 것이므로 이에 관련 처리 수행.
      //}----------------------------------------------------------

      if(_pageAllFind_Ing == false)
      {
        ide_msgbox_Form->_MsgBox(d_MSGBOX_info,
                                 "사용자 요청으로 [정보창:전체찾기] 에 결과를 출력하는 단계가 완료되지\r\n"
                                 "못했으나, 찾은 [항목수] 정보는 이미 산출된 정확한 정보입니다.");

        //[!]{----------------------------------------------------------
        //[문서 개수 정보] 는 이미 정확한 정보를 얻었다.
        //[Tree] 에 등록되던 중 중단 된 것이므로 처리 자체는 계속 진행.
        //}-------------------------------------------------------------

      }

  //}

  lbFindInfoOut:

  //[찾은 항목수 출력]
  //{
      //[!]{------------------------------------------------------------------------
      //"[+]전체찾기(항목:xxx)" 와 같이 [찾은 항목수] 를 [10진수 최소표기] 로 출력.
      //
      //[첫번째 검색] 시에 구한값을 그대로 사용.
      //}---------------------------------------------------------------------------
      
      //[출력]
      //{
          //[문자열 합성]
          //{
              //[!]{------------------------
              //"(항목:xxx)" 형식으로 출력.
              //}---------------------------

              STR_Assign(lineStr, "전체찾기(항목:");

              //[항목:개수] 출력.
              CONV_LongVal_To_Str(itemCount, 0, false, &(lineStr[STR_Length(lineStr)]));

              STR_Add(lineStr, ")");

          //}

          //[출력]
          //{
              //[2019.02.23.토][수정]{---------------------
              //<_allFind_CheckBtn> 조건에 따라 구분 처리.
              //}------------------------------------------

              if(_allFind_CheckBtn->_checked)
              {
                //[정보] 만 간단하게 [알림글] 로 표시해 준다.
                ide_msgbox_Form->_MsgBox(d_MSGBOX_default, lineStr);

              }
              else
              {
                //[root:문자열] 을 교체.
                tree_tree_Form->_Item_Txt(treeFind,
                                          //[root]----------v
                                          &(treeFind->items[0]),
                                          lineStr);
              }
              
          //}

      //}

  //}

  //[root:kind]
  //{
      //[2019.02.21.목][추가]{--------------------------------------------
      //<_Tree_Add_NodeItem()> 이 아니라 <_Tree_Add_Item()> 로 처리하므로
      //<kind> 가 자동적으로 처리되지 않으므로, 추가된 항목이 하나라도
      //존재한다면 [+] 로 변경.
      //}-----------------------------------------------------------------

      //[root] 를 제외하고 항목이 한 개라도 더 있으면 [root] 에 항목이 있는것으로 간주.
      if(treeFind->items_count > 1)
      {
        treeFind->items[0].kind = '+';

      }

  //}

  lbTrue:
  //{
      //[Tree:STRHEAP:기본설정]
      //{
          //[2019.02.21.목][추가]{-----------------------------------------
          //<STRHEAP_List_Add()> 함수 동작을 [기본 설정] 으로 돌려 놓는다.
          //}--------------------------------------------------------------

          //기본상태로 복구--------------------------------v
          STRHEAP_Set_List_NoSearch(&(treeFind->_strHeap), false, 0);

      //}

      //[진행막대:설정]
      //{
          //[2019.02.23.토][추가]{---
          //진행막대 감추기.
          //}------------------------
          
          _search_Progress->Visible = false;

      //}

      return(true);

  //}

  lbFalse:
  //{
      //[Tree:STRHEAP:기본설정]
      //{
          //[2019.02.21.목][추가]{-----------------------------------------
          //<STRHEAP_List_Add()> 함수 동작을 [기본 설정] 으로 돌려 놓는다.
          //}--------------------------------------------------------------

          //기본상태로 복구--------------------------------v
          STRHEAP_Set_List_NoSearch(&(treeFind->_strHeap), false, 0);

      //}

      //[진행막대:설정]
      //{
          //[2019.02.23.토][추가]
          //진행막대 감추기.
          _search_Progress->Visible = false;

      //}

      return(false);

  //}

}

bool __fastcall Tfind_DialogBox_Form::_TreeFind_All(void)
{
  //[2019.02.17.일][생성]{-------------------------------------------------------------
  //[현재 열려있는 설계묶음] 의 [Tree:설계문서] 에 등록돼 있는 [모든 문서] 를 대상으로
  //[찾을 문자열] 을 찾아서 [Tree:전체찾기] 에 정리해 준다.
  //
  //<*.c> 의 <#include> 까지 검사하지 않으며, 단순하게 <Tree> 에 등록돼 있는 문서만
  //대상으로 처리한다.
  //
  //[편집기] 에 열지 않고 내부적으로 문서를 열고 검색 결과를 [Tree:전체찾기] 에 등록.
  //
  //[2019.02.22.금][수정]**************************************************************
  //[첫번째 검색] 시에 [찾기:Tree] 를 사용하지 않고 정확한 [문서수/항목수] 를 얻기
  //위하여 [STRHEAP] 을 사용하는 것으로 수정.
  //
  //[진행막대] 추가.
  //}----------------------------------------------------------------------------------

  //[VAR]
  //{
      class    DATABASE  *DB_;

      struct   TREE      *treeGprj, *treeFind;

      char    *fileBuf = NULL;

      int      fileSize = 0;

      char     fileStr[1024*10];

      char     filePathNameExt[1024*10];

      char     lineStr[1024*10];

      //찾기 시작할 위치.
      int      findStartIndex, findIndex;

      //[찾은 문자열] 길이.
      int      findStrLength;

      int      nodeIndex, nodeLastItemIndex;

      int      i;

      int      itemCount;

      int      docCount = 0, itemTotalCount = 0;

      //[2019.02.21.목][추가]
      int      docItemIndex, itemIndex;

      //[2019.02.22.금][추가]
      struct   STRHEAP  strHeap;

      int      count;

      double   procDiv;
      int      proc;

      //[!]{-------------------------------------------------------------------
      //[찾은항목] 에 등록되는 [문자열] 의 총 크기를 가진다.
      //[STRHEAP] 의 [저장소] 를 이 크기에 맞게 처음에 생성하고 시작할때 필요.
      //150만개 찾은 항목의 경우 [11초] => [3초] 로 처리 시간이 대폭 단축된다. 
      int      totoalFindItemStrSize;
      //}----------------------------------------------------------------------

      //[2019.02.23.토][추가]{----------------------------
      //처리 대상 문서 전체 크기.
      //[첫번째 검색] 에서 [진행막대:최대값] 설정에 필요.
      int      totalFileSize, s;

      int      lineEndIndex;
      //}-------------------------------------------------

      //[2019.02.26.화][추가]
      int      lineStartIndex;

  //}

  //[<*.gprj> 가 존재하는가?]
  //{
      //[!]{---------------------------------------------------------
      //현재 "새설계묶음" 인 경우는 대상이 없으므로 처리하지 않는다.
      //item.name:"root" 는 itemindex:0 에 해당한다.
      //}------------------------------------------------------------

      if(STR_Match_NoCase(tree_tree_Form->_Item_Txt_StrPtr(d_TREE_project, 0), "새설계묶음") == true)
      {
        ide_msgbox_Form->_MsgBox(d_MSGBOX_info,
                                 "[새설계묶음] 상태에서는 [전체찾기] 를 수행할수 없습니다.\r\n"
                                 "[전체찾기] 는 [설계묶음] 에 등록된 [문서] 만을 대상으로 합니다."
                                );

        return(false);

      }

  //}

  //[기본 처리]
  //{
      DATABASE_GetPtr(&DB_);

  //}

  //[Tree 치환]
  //{
      //[문장] 을 간결하게 하기 위하여 [Tree] 를 [포인터] 로 받아서 사용한다.
      treeGprj = &(tree_tree_Form->_tree[d_TREE_project]);

      treeFind = &(tree_tree_Form->_tree[d_TREE_find]);

  //}

  //[STRHEAP:생성]
  //{
      //[2019.02.22.금][추가]{-----------------------------
      //[STRHEAP] 은 사용전 반드시 한 번 초기화 해야 한다.
      //}--------------------------------------------------

      STRHEAP_Init(&strHeap);

      //일단 [기본 크기] 로 생성.
      STRHEAP_Create(&strHeap, d_STRHEAP_Heap_addSize, d_STRHEAP_List_addSize);

  //}

  //[찾을 문자열 존재 확인]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(_find_Edit->_editbuf[0] == '\0') return(false);

  //}

  //[찾을 문자열 길이 얻기]
  //{
      findStrLength = STR_Length(_find_Edit->_editbuf);

  //}

  //[<설계문서> 옹이 정보 얻기]
  //{
      tree_tree_Form->_Tree_Get_Node_LastItemIndex2(treeGprj, "c", &nodeIndex, NULL, &nodeLastItemIndex);

  //}

  //[첫번째 검색]
  //{
      //[2019.02.21.목][추가]{--------------------------------------------------------------
      //첫번째 검색은 [개수] 정보를 얻기 위한것.
      //
      //이는 [100 만개] 이상의 항목인 경우 [Tree] 에 고속으로 등록하기 위하여 [STRHEAP] 과
      //관련된 별도 설정(목록수를 100만개 이상으로 생성)을 해야 하기 때문이다.
      //
      //[!]{--------------------------------------------------------------------------------
      //지정한 조건으로 [문서] 처음부터 [전체] 를 찾는다.
      //여기서는 단지 [문서항목:개수] 와 [찾은항목:개수] 만 얻는다.
      //
      //[2019.02.22.금][수정]---------------------------------------------------------------
      //[찾기:Tree] 를 사용하지 않고 [STRHEAP] 을 사용해서 처리.
      //
      //[전체 찾은 항목수] 는 <itemTotalCount> 에 정리된다.
      //
      //이 방법은 단지 [찾은 유효 문서수] 를 [Tree] 에 추가하지 않고 구하는데 목적이 있다.
      //
      //{ [문서]/[찾은개수] } 를 한개 항목으로 처리.
      //
      //[0] : [문서0]
      //[1] : [""]     //항목이 없는 경우는 "" 로 [비었음] 을 표시.
      //
      //[2] : [문서1]
      //[3] : ["v"]    //찾은 개수가 있는 경우는 "v" 로 [확인] 표시.
      //
      // ...
      //
      //등록된 [문서] 에 하위항목이 있는지 비었는지만 확인하면 된다.
      //
      //1) 일단 문서 처리시 위와 같이 등록.
      //   단, [중복문서] 는 위의 정보를 가지고 재검색 하지 않는다.
      //
      //2) 1) 의 결과를 사용 [""] 인 항목은 모두 제거(2 개다).
      //   [STRHEAP] 에서는 [목록:-1] 이 된다.
      //
      //3) 최종적으로 [개수:"v"] 항목의 개수가 [유효 문서 개수] 가 된다.
      //
      //이런 새 방식의 적용을 위하여 <STRHEAP_Str_Search()>, <STRHEAP_Get_Count()> 를
      //새로 만들었다.
      //}-----------------------------------------------------------------------------------

      //[검색 대상 전체 문서 크기 얻기]
      //{
          //[2019.02.23.토][추가]{------------------------------------------
          //[설계묶음:설계문서] 에 등록된 모든 문서의 [총 크기] 를 얻는다.
          //내부적으로 [문서:중복] 여부까지 모두 검사해서 처리된 정확한 값.
          //
          //이 지원을 위하여 <Ide_Project_Get_TotalFileSize()> 새로 제작.
          //}---------------------------------------------------------------
          
          Ide_Project_Get_TotalFileSize(&totalFileSize, NULL);

      //}

      //[진행막대:설정]
      //{
          //[2019.02.22.금][추가]

          //[진행분할값:계산]
          //{
              //[!]{---------------------------------------------------
              //기본 [100] 단계로 처리하므로 이에 맞게 설정.
              //103, 166 등 Max 값이 정확하게 정수로 분할할수 없으므로
              //[실수] 를 사용하여 처리한다.
              //
              //즉, [procDiv 로 나눈 몫] 을 [진행값] 으로 적용한다.
              //}------------------------------------------------------

              if(totalFileSize <= 100)
              {
                procDiv = 1;

                //예 60 이라며 [60 단계] 까지만 처리한다.
                _search_Progress->_Max(totalFileSize);

                _search_Progress->_Progress(0);

                proc = 0;

              }
              else
              {
                procDiv = ((double)totalFileSize)/100;

                //100 단계.
                _search_Progress->_Max(100);

                _search_Progress->_Progress(0);

                proc = 0;

              }  

          //}

          //진행막대 보이기.
          _search_Progress->Visible = true;

          //가장 위에 보이도록 설정.
          _search_Progress->BringToFront();

      //}

      //[문서 검색 처리]
      //{
          //[설계문서] 에 등록된 [모든 문서] 를 대상으로 처리.
          for(i = nodeIndex + 1, docCount = 0, itemTotalCount = 0, totoalFindItemStrSize = 0, s = 0;
              (i <= nodeLastItemIndex) && (_gprjAllFind_Ing == true);
              i++)
          {
            //[2019.02.23.토][추가]{---------------------------------------------
            //[검색] 하는 [문서량] 이 많은 경우 멈춰있는 경우가 있으므로 넣는다.
            Application->ProcessMessages();
            //}------------------------------------------------------------------

            //[문서이름 얻기]
            //{
                STR_Assign(fileStr, tree_tree_Form->_Item_Txt_StrPtr3(treeGprj, i));

            //}

            //[<전체:경로이름확장자> 로 합성]
            //{
                STR_Add_AB(filePathNameExt, DB_->projectpath, fileStr);

            //}
            
            //[!]{-----------------------------------------------------------------
            //<fileStr>  : 원본 문서이름(Tree 에 등록할 문서이름).
            //<fileName> : 실제 [문서] 를 열어서 처리할때 사용할 [경로이름확장자].
            //}--------------------------------------------------------------------

            //[문서 등록]
            //{
                //[!]{------------------------------------------------------
                //단지 [중복검사] 를 위해서 등록하는 것으로 큰 의미는 없다.
                //}---------------------------------------------------------

                //[중복] 되는 것이 있다면 [등록] 하지 않고 계속 검사.
                if(STRHEAP_Str_Search(&strHeap, false, fileStr) >= 0) continue;

                //[문서] 등록.
                STRHEAP_Str_Add(&strHeap, fileStr);

                //[전체 항목 문자열 크기 합산]
                //{
                    //[2019.02.22.금][추가]{-----------------------------
                    //[찾은항목] 에 등록되는 [문자열] 의 총 크기를 계산.
                    //}--------------------------------------------------

                    totoalFindItemStrSize += STR_Length(fileStr);

                //}

            //}

            //[문서 열기]
            //{
                //문서 존재여부는 이 함수 내부적으로 검사된다.
                if(FILE_Open((AnsiString)filePathNameExt, (unsigned char **)(&fileBuf), &fileSize) != true) goto lbFalse;

            //}

            //[찾기]
            //{
                //[!]{--------------------------------------------------------------------------------
                //지정한 조건으로 [문서] 처음부터 [전체] 를 찾는다(개수 정보를 위한것).
                //
                //[2019.02.23.토][중요수정]***********************************************************
                //기존 <STR_Find()> 를 사용하는 방식에서 <STR_Find_Bound()> 로 [행단위] 로 처리하는
                //방식으로 수정(찾을 문자열에 [CRLF] 는 사용할수 없으므로 행단위 처리 가능).
                //
                //[진행막대] 와 [연동] 을 위한것으로 { [문서량 크다] && [찾은것 작다] } 의 경우에
                //<STR_Find()> 안의 [반복문] 처리로 [진행막대] 의 진행이 [멈추는] 경우가 많기 때문.
                //
                //따라서, [처리하는 전체 문서 크기:최대] 로 설정하고 [현재 까지 처리한 크기:진행]
                //으로 설정하여 [진행막대] 가 멈추지 않고 일정하게 진행하도록 하였다.
                //
                //이를 위하여 <STR_Find_Bound()> 를 새로 제작했음.
                //}----------------------------------------------------------------------------------

                //[찾은 항목 위치 초기화]
                //{
                    itemIndex = -1;

                //}

                //문서 처음부터 찾기.
                for(findStartIndex = 0, itemCount = 0, lineEndIndex = 0; _gprjAllFind_Ing == true; )
                {
                  //[2019.02.19.화][추가]{---------------------------------------------
                  //[검색] 하는 [문서량] 이 많은 경우 멈춰있는 경우가 있으므로 넣는다.
                  Application->ProcessMessages();
                  //}------------------------------------------------------------------
                  
                  //[검사할 행 <끝:위치> 얻기]
                  //{
                      STR_Get_ThisLineEndIndex(fileBuf, findStartIndex, &lineEndIndex);
                      
                      //[문서 끝 확인]
                      //{
                          //문서 끝이라면 종료.
                          if(fileBuf[lineEndIndex] == '\0') break;

                      //}

                  //}

                  //[행 단위 찾기]
                  //{
                      //[!]{----------------------------------------------
                      //<STR_Find_Bound()> 를 사용하여 [행:단위] 로 검사.
                      //이는 [처리량] 과 [진행막대] 를 연동하기 위한것.
                      //}-------------------------------------------------

                      while(1)
                      {
                        STR_Find_Bound(fileBuf,
                                        //찾을 범위 정보.
                                       findStartIndex, lineEndIndex,
                                       //찾을 조건.
                                       _word_CheckBtn->_checked, _case_CheckBtn->_checked,
                                       //찾을 문자열.
                                       _find_Edit->_editbuf,
                                       //찾은 시작 위치.
                                       &findIndex);

                        if(findIndex >= 0)
                        {
                          //찾은 개수 증가.
                          itemCount++;

                          //[다음 찾기 시작 위치 지정]
                          //{
                              //현재 찾은 문자열 끝 부터 다시 시작.
                              findStartIndex = (findIndex + findStrLength);

                          //}

                          //[전체 항목 문자열 크기 합산]
                          //{
                              //[2019.02.22.금][추가]{----------------------------------
                              //[찾은항목] 에 등록되는 [문자열] 의 [전체 크기] 를 계산.
                              //
                              //NULL 인 경우는 [길이] 정보만 반환.
                              //이 기능을 위하여 <STR_Get_ThisLineStr()> 함수 수정.
                              //}-------------------------------------------------------

                              //실제 문자열을 추출하지 않고 [문자열:길이] 정보만 얻는다(고속 처리 함수).
                              totoalFindItemStrSize += STR_Get_ThisLineStr(fileBuf, findIndex, NULL);

                          //}

                        }
                        else
                        {
                          //현재 범위에서 더이상 찾을 것이 없다면 검사 종료.
                          break;

                        }
                      
                      }
                      
                  //} 

                  //[진행막대:설정]
                  //{
                      //[2019.02.23.토][추가]
                      proc = ((double)(s + findStartIndex))/procDiv;

                      //[중복] 처리를 방지하기 위하여 현재 설정값과 다른 경우만 처리.
                      if(_search_Progress->_progress != proc)
                      {
                        _search_Progress->_Progress(((double)(s + findStartIndex))/procDiv);

                      }

                  //}
                  
                  //[검사할 행 <시작:위치> 얻기]
                  //{
                      //다음 검사행 시작 위치를 검색 시작 위치로 설정.
                      STR_Get_NextLineStartIndex(fileBuf, lineEndIndex, &findStartIndex);
                  
                  //}
                  
                }

                //[전체 찾은 항목수 수정]
                //{
                    //전체 개수 증가.
                    itemTotalCount += itemCount;

                //}

                //[검색량 수정]
                //{
                    //[진행 막대] 와 연동 처리를 위한것.
                    s += fileSize;

                //}    

            //}

            //[공간 삭제]
            //{
                //[주의!!!]{-------------------------------------------------------
                //[삭제] 후 반드시 NULL 로 초기화.
                //위의 <FILE_Open()> 함수는 NULL 이 아닌 경우 내부적으로 [삭제] 를
                //하기 때문에 오류가 발생할수 있다.
                //}----------------------------------------------------------------

                if(fileBuf != NULL) { delete [] fileBuf; fileBuf = NULL; }

            //}

            //[찾은개수 등록]
            //{
                //[!]{----------------------------------------------------
                //현재 [문서] 에서 [찾은 개수] 를 등록.
                //
                //[개수] 가 있다면 "v", 0 이라면 "" 로 문자열로 구분한다.
                //}-------------------------------------------------------

                if(itemCount == 0)
                {
                  STRHEAP_Str_Add(&strHeap, "");

                }
                else
                {
                  STRHEAP_Str_Add(&strHeap, "v");

                }

            //}

          }

      //}

      //[진행막대:설정]
      //{
          //[2019.02.23. 토][추가]{---
          //진행막대 감추기.
          //}-------------------------
          
          _search_Progress->Visible = false;

      //}

      //[처리 중단 요청 확인]
      //{
          //[2019.02.23.토][추가]{--------------------------------------------
          //<_gprjAllFind_Ing : false> 인 경우는 [처리 중단 요청] 으로 도중에
          //중단된 것이므로 더이상 다른 처리를 하지 않고 종료시킨다.
          //}-----------------------------------------------------------------

          if(_gprjAllFind_Ing == false)
          {
            ide_msgbox_Form->_MsgBox(d_MSGBOX_info,
                                     "사용자 요청으로 [문서수/항목수] 정보 추출 단계가 중단되었습니다.");

            //미완성 처리이므로 <false> 로 간주.
            goto  lbFalse;

          }  

      //}

      //[실제 <문서/찾은항목> 개수 얻기]
      //{
          //[2019.02.22.금][추가]{----------------------------------------------
          //[STRHEAP] 에 이미 정보가 저장돼 있으므로 이 정보를 사용하여 구한다.
          //
          //[찾은 전체 항목수] 는 <itemTotalCount> 의 값을 그대로 사용.
          //
          //여기서는 [유효:문서수] 만 얻으면 된다.
          //}-------------------------------------------------------------------

          //현재 사용중인 개수를 얻는다.
          count = STRHEAP_Get_Count(&strHeap);

          //[문서/개수] 로 2개가 짝을 지워 사용되고 [개수] 는 두번째 항목이다.
          for(i = 1, docCount = 0; i < count; i += 2)
          {
            //[!]{-----------------------------------------------------
            //[개수] 항목만 대상으로 검사하면된다.
            //여기서는 "v" 인 항목의 개수가 구하는 [문서개수] 가 된다.
            //}--------------------------------------------------------
            
            if(STRHEAP_Str_Ptr(&strHeap, i)[0] == 'v') docCount++;

          }

          //[!]{--------------------------------------------------
          //여기까지 두개 정보 완벽 정리.
          //
          //<docCount>       : 찾은 항목을 가진 [유효 문서] 개수.
          //<itemTotalCount> : 찾은 항목 총 개수.
          //}-----------------------------------------------------

      //}

  //}

  //[찾기 정보만 출력하는지 확인]
  //{
      //[2019.02.22.금][추가]{--------------------------------------------------------------------
      //[전체찾기] 결과 정보만 출력하는 경우는 [두번째 검색] 을 처리하지 않고 해당 부분으로 이동.
      //}-----------------------------------------------------------------------------------------

      if(_allFind_CheckBtn->_checked == true) goto lbFindInfoOut;

  //}

  //[Tree:STRHEAP:재생성]
  //{
      //[2019.02.21.목][추가]{----------------------------------------------------------------
      //위에서 찾은 [항목수] 에 맞게 [Tree:STRHEAP] 크기를 [재생성] 한다.
      //
      //이는 [STRHEAP] 에서 [빈곳] 을 찾지 않고 [연속/순차적으로] 계속 등록하여 등록되는
      //처리시간을 단축하기 위한것으로, [빈곳] 을 찾아 [목록:index] 를 반환하는
      //<STRHEAP_List_Add()> 함수를 제어하기 위한것.
      //
      //단, 찾은 항목이 0 인 경우는 [재생성] 하지 않는다.
      //
      //[Tree] 항목은 기본 250 개 정도로 생성하므로 [문서] 한개가 기본 등록되지만 이미 생성된
      //것으로 충분하다(찾은 항목수 로만 결정한다).
      //
      //[Tree] 도 [찾은개수] 만큼 무조건 [재생성] 한다.
      //[100만개] 의 경우 [Tree] 가 자주 [재생성] 되어 처리시간 증가에 주 원인이 된다.
      //[100만개] 기준으로 <40초 -> 3초> 로 단축 된다.
      //
      //[2019.02.22.금][중요수정]*************************************************************
      //[100만개] 항목 이상인 경우 [찾은항목] 문자열의 총 크기가 64M 를 넘은 경우가 발생하고
      //[STRHEAP] 의 기본 재생성 크기는 [512K] 이므로 계속 [재생성=>복사] 하는 과정에서
      //엄청난 시간이 소요됨을 발견하였다.
      //
      //따라서, [첫번째 검색] 에서 <totoalFindItemStrSize> 에 [찾은항목 총 문자열 크기] 를
      //구하고, 여기서 [STRHEAP] 를 아예 다른 것 과 같이 <totoalFindItemStrSize> 만큼 더 큰
      //크기로 [재생성] 하고 시작한다(도중에 [재생성] 없이 계속 추가할수 있도록).
      //
      //[200만개] 의 찾은 항목이 존재하는 경우 처리 속도는 불과 [3초] 가 된다.
      //}-------------------------------------------------------------------------------------

      if((docCount + itemTotalCount) > 0)
      {
        //[!]{--------------------------------------------------------------------------
        //[root] 항목은 1 개 뿐이고, 기본 생성크기안에 모두 들어가므로 고려하지 않는다.
        //}-----------------------------------------------------------------------------

        //[Tree]
        //{
            //[Tree] 도 도중에 [재생성] 되지 않도록 충분한 양을 미리 재생성한다(재생성 크기만큼 여유를 준다).
            //여유값-----------------------------------------------------------------------v
            tree_tree_Form->_Tree_ReSizeX(treeFind, (docCount + itemTotalCount) + Opt_Tree_AddSize);

        //}

        //[STRHEAP:문자열공간]
        //{
            //[2019.02.22.금][추가]{----------------------------------------------------------------
            //[STRHEAP] 은 { [4] + [문자열+'\0'] } 로 저장되므로 [찾은 문자열 전체 문자열 길이]
            //만으로는 용량이 모자라다.
            //
            //따라서, 앞의 항목수 만큼의 [4바이트] 부분을 계산해 줘야 한다.
            //더불어, [문자열] 에 '\0' 까지 붙어서 저장되므로 이 [1바이트] 까지 계산에 넣어야 한다.
            //}-------------------------------------------------------------------------------------

            STRHEAP_Heap_ReSizeX(&(treeFind->_strHeap),
                                 //[재생성] 시 추가할 크기(재생성 크기만큼 여유를 준다).
                                 //'\0'---------------------------v
                                 //[문자열크기(4)]------------v
                                 (docCount + itemTotalCount)*(4 + 1) +
                                 //여유값-------------------------------v
                                 totoalFindItemStrSize + d_STRHEAP_Heap_addSize);

        //}

        //[STRHEAP:목록]
        //{
            //크기 재생성.
            STRHEAP_List_ReSizeX(&(treeFind->_strHeap),
                                 //[재생성] 시 추가할 크기(재생성 크기만큼 여유를 준다).
                                 //여유값-------------------------------------v
                                 (docCount + itemTotalCount) + d_STRHEAP_List_addSize);

            //<STRHEAP_List_Add()> 내부적으로 [빈곳] 을 찾지 않고 바로 [목록] 번호를
            //[순차적으로] 생성하도록 설정.
            //-----------------------------------------------v
            STRHEAP_Set_List_NoSearch(&(treeFind->_strHeap), true, 1);
            //[root]-----------------------------------------------^
            //으로 이미 채워진 위치 다음부터 기록되도록 처리한다.
            //단, [Tree] 초기화 후 [root] 만 기록된 것으로 간주.

        //}

      }

  //}

  //[두번째 검색]
  //{
      //[진행막대:설정]
      //{
          //[2019.02.22.금][추가]

          //[진행분할값:계산]
          //{
              //[!]{---------------------------------------------------
              //기본 [100] 단계로 처리하므로 이에 맞게 설정.
              //103, 166 등 Max 값이 정확하게 정수로 분할할수 없으므로
              //[실수] 를 사용하여 처리한다.
              //
              //즉, [procDiv 로 나눈 몫] 을 [진행값] 으로 적용한다.
              //}------------------------------------------------------

              if(totalFileSize <= 100)
              {
                procDiv = 1;

                //예 60 이라며 [60 단계] 까지만 처리한다.
                _search_Progress->_Max(totalFileSize);

                _search_Progress->_Progress(0);

                proc = 0;

              }
              else
              {
                procDiv = ((double)totalFileSize)/100;

                //100 단계.
                _search_Progress->_Max(100);

                _search_Progress->_Progress(0);

                proc = 0;

              }  

          //}

          //진행막대 보이기.
          _search_Progress->Visible = true;

          //가장 위에 보이도록 설정.
          _search_Progress->BringToFront();

      //}

      //[문서 검색 처리]
      //{
          //[설계문서] 에 등록된 [모든 문서] 를 대상으로 처리.
          for(i = nodeIndex + 1, s = 0; (i <= nodeLastItemIndex) && (_gprjAllFind_Ing == true); i++)
          {
            //[2019.02.23.토][추가]{---------------------------------------------
            //[검색] 하는 [문서량] 이 많은 경우 멈춰있는 경우가 있으므로 넣는다.
            Application->ProcessMessages();
            //}------------------------------------------------------------------

            //[문서이름 얻기]
            //{
                STR_Assign(fileStr, tree_tree_Form->_Item_Txt_StrPtr3(treeGprj, i));

            //}

            //[<전체:경로이름확장자> 로 합성]
            //{
                STR_Add_AB(filePathNameExt, DB_->projectpath, fileStr);

            //}

            //[문서 등록]
            //{
                //[!]{-----------------------------------------------------------
                //현재 처리 대상 문서를 [Tree:문서항목] 으로 등록.
                //
                //문서 등록시 [중복(이미 처리한것)] 인 경우는 여기서 걸러지므로
                //아래 <FILE_Open()> 에서 동적생성되는 것을 미리 막을수 있다.
                //
                //<*.c> 는 [중복] 되지 않지만, 이 안에 포함된 <*.h> 는 서로 다른
                //<*.c> 문서에서 사용될수 있으므로 [중복] 될수 있다.
                //
                //<fileStr> 이 [Tree:설계문서] 항목 그대로 이므로 이것을 추가.
                //[내부:겅로이름확장자] 로 등록한다.
                //}--------------------------------------------------------------

                //[항목:문서] 추가.
                //이미 처리한 문서의 경우는 건너뛰고 계속 진행.
                if(Ide_Tree_Find_Add_Doc(fileStr, false, &docItemIndex) != true) continue;

                //[참고][2019.02.21.목]{--------------------------------------------------
                //<Ide_Tree_Find_Add_Doc()> 함수는 [중복] 문서의 경우는 <docItemIndex> 를
                //처리하기 전에 종료하므로 <docItemIndex> 의 기존 값은 변경되지 않는다.
                //
                //결과적으로 가장 마지막에 처리한 [문서] 는 <docItemIndex> 가 된다.
                //}-----------------------------------------------------------------------

                //[kind 설정]
                //{
                    //[중요]{--------------------------------------------------------------
                    //[문서] 는 기본적으로 [하위항목] 이 있는 것으로 간주하고 [+] 로 설정.
                    //[하위항목] 이 없는 경우는 자동적으로 [삭제] 되므로 설정과 무관.
                    //}--------------------------------------------------------------------

                    treeFind->items[docItemIndex].kind = '+';

                //}

            //}

            //[문서 열기]
            //{
                //문서 존재여부는 이 함수 내부적으로 검사된다.
                if(FILE_Open((AnsiString)filePathNameExt, (unsigned char **)(&fileBuf), &fileSize) != true) goto lbFalse;

            //}

            //[찾기]
            //{
                //[!]{------------------------------------------------------------------------------
                //지정한 조건으로 [문서] 처음부터 [전체] 를 대상으로 찾는다.
                //처음부터 더이상 찾을수 없는 상태까지 찾으면서 [Tree:전체찾기] 에 등록한다.
                //
                //[2019.02.23.토][중요수정]*********************************************************
                //기존 <STR_Find()> 를 사용하는 방식에서 <STR_Find_Bound()> 로 [행단위] 로 처리하는
                //방식으로 수정(찾을 문자열에 [CRLF] 는 사용할수 없으므로 행단위 처리 가능).
                //
                //[진행막대] 와 [연동] 을 위한것으로 { [문서량 크다] && [찾은것 작다] } 의 경우에
                //<STR_Find()> 안의 [반복문] 처리로 [진행막대] 의 진행이 [멈추는] 경우가 많기 때문.
                //
                //따라서, [처리하는 전체 문서 크기:최대] 로 설정하고 [현재 까지 처리한 크기:진행]
                //으로 설정하여 [진행막대] 가 멈추지 않고 일정하게 진행하도록 하였다.
                //
                //이를 위하여 <STR_Find_Bound()> 를 새로 제작했음.
                //}---------------------------------------------------------------------------------

                //[찾은 항목 위치 초기화]
                //{
                    //[2019.02.21.목][추가]{--------------------------------------
                    //{ [문서] -> [항목] -> [문서] ... } 순으로 등록되는데
                    //[문서] 안에 [찾은:항목] 이 하나도 없는 경우 <itemIndex> 에
                    //이전 [문서] 의 [마지막:항목] 이 존재하게 된다.
                    //
                    //이 경우 [마지막:항목] 설정시 이전 [문서] 의 [마지막 항목]
                    //위치를 [마지막:항목] 으로 중복 지정하게 된다.
                    //
                    //물론, 전혀 상관은 없으나 의미상 [중복] 되므로 이를 걸러내기
                    //위하여 새로운 [문서] 가 시작되는 경우 <-1> 로 초기화 한다.
                    //
                    //즉, <-1> 인 경우는 현재 [문서] 에 [찾은:항목] 은 0 이 된다.
                    //}-----------------------------------------------------------

                    itemIndex = -1;

                //}

                //문서 처음부터 찾기.
                for(findStartIndex = 0, lineStartIndex = 0, lineEndIndex = 0; _gprjAllFind_Ing == true; )
                {
                  //[2019.02.19.화][추가]{---------------------------------------------
                  //[검색] 하는 [문서량] 이 많은 경우 멈춰있는 경우가 있으므로 넣는다.
                  Application->ProcessMessages();
                  //}------------------------------------------------------------------
                  
                  //[검사할 행 <끝:위치> 얻기]
                  //{
                      STR_Get_ThisLineEndIndex(fileBuf, findStartIndex, &lineEndIndex);
                      
                      //[문서 끝 확인]
                      //{
                          //문서 끝이라면 종료.
                          if(fileBuf[lineEndIndex] == '\0') break;

                      //}

                  //}

                  //[행 단위 찾기]
                  //{
                      //[!]{----------------------------------------------
                      //<STR_Find_Bound()> 를 사용하여 [행:단위] 로 검사.
                      //이는 [처리량] 과 [진행막대] 를 연동하기 위한것.
                      //}-------------------------------------------------

                      while(1)
                      {
                        STR_Find_Bound(fileBuf,
                                        //찾을 범위 정보.
                                       findStartIndex, lineEndIndex,
                                       //찾을 조건.
                                       _word_CheckBtn->_checked, _case_CheckBtn->_checked,
                                       //찾을 문자열.
                                       _find_Edit->_editbuf,
                                       //찾은 시작 위치.
                                       &findIndex);

                        if(findIndex >= 0)
                        {
                          //[찾은 항목 등록 문자열]
                          //{
                              //[<찾은 문자열> 위치 <행 문자열> 얻기]
                              //{
                                  STR_Get_ThisLineStr(fileBuf,
                                                  //[찾은 문자열] 위치.
                                                  findIndex,
                                                  lineStr);

                              //}

                              //[<Tree:찾은항목> 등록]
                              //{
                                  //[주의!!!]{------------------------------------------------------
                                  //이 함수는 [옹이] 를 찾지 않고 그냥 [Tree] 의 마지막에 추가한다.
                                  //}---------------------------------------------------------------

                                  Ide_Tree_Find_Add_Item(lineStr,
                                                         findIndex,
                                                         findIndex + findStrLength,
                                                         //[2019.02.26.화][추가]{---
                                                         lineStartIndex,
                                                         //}------------------------
                                                         false,
                                                         //[2019.02.21.목][추가]
                                                         &itemIndex);

                              //}

                          //}    

                          //[다음 찾기 시작 위치 지정]
                          //{
                              //현재 찾은 문자열 끝 부터 다시 시작.
                              findStartIndex = (findIndex + findStrLength);

                          //}

                        }
                        else
                        {
                          //현재 범위에서 더이상 찾을 것이 없다면 검사 종료.
                          break;

                        }
                      
                      }
                      
                  //} 

                  //[진행막대:설정]
                  //{
                      //[2019.02.23.토][추가]
                      proc = ((double)(s + findStartIndex))/procDiv;

                      //[중복] 처리를 방지하기 위하여 현재 설정값과 다른 경우만 처리.
                      if(_search_Progress->_progress != proc)
                      {
                        _search_Progress->_Progress(((double)(s + findStartIndex))/procDiv);

                      }

                  //}
                  
                  //[검사할 행 <시작:위치> 얻기]
                  //{
                      //다음 검사행 시작 위치를 검색 시작 위치로 설정.
                      STR_Get_NextLineStartIndex(fileBuf, lineEndIndex, &lineStartIndex);

                      //[2019.02.26.화][추가]
                      findStartIndex = lineStartIndex;

                  //}
                  
                }

                //[검색량 수정]
                //{
                    //[진행 막대] 와 [연동] 을 위한것.
                    s += fileSize;

                //} 

                //[찾은항목:마지막 항목]
                //{
                    //[2019.02.21.목][추가]{------------------------------------------------------
                    //현재 <itemIndex> 가 현재 [문서]에서 [찾은:항목] 의 마지막 항목이 된다.
                    //
                    //각 [문서] 마다 [찾은:항목] 의 [마지막 항목] 은 반드시 기록해야 한다.
                    //
                    //[마지막 항목] 설정은 [그리기] 시에 절대적으로 필요하므로 반드시 설정해준다.
                    //
                    //검색 시작시 <itemIndex = -1> 로 초기화 했으므로 계속 <-1> 인 경우는
                    //현재 [문서] 에는 [찾은:항목] 이 0 인 것이다.
                    //}---------------------------------------------------------------------------

                    //[root:0] 이므로 0 은 제외.
                    if(itemIndex > 0)
                    {
                      treeFind->items[itemIndex].lastItem = true;

                    }

                //}

            //}

            //[공간 삭제]
            //{
                //[주의!!!]{-------------------------------------------------------
                //[삭제] 후 반드시 NULL 로 초기화.
                //위의 <FILE_Open()> 함수는 NULL 이 아닌 경우 내부적으로 [삭제] 를
                //하기 때문에 오류가 발생할수 있다.
                //}----------------------------------------------------------------
                
                if(fileBuf != NULL) { delete [] fileBuf; fileBuf = NULL; }

            //}

          }

          //[문서항목:마지막 항목]
          //{
              //[2019.02.21.목][추가]{------------------------------------------
              //[마지막 항목] 설정은 [그리기] 시에 절대적으로 필요하므로 반드시
              //설정해줘야 한다.
              //}---------------------------------------------------------------
              
              //[root:0] 이므로 0 은 제외.
              if(docItemIndex > 0)
              {      
                treeFind->items[docItemIndex].lastItem = true;

              } 

          //}

      //}
      
  //}

  //[처리 중단 요청 확인]
  //{
      //[2019.02.23.토][추가]{--------------------------------------------
      //<_gprjAllFind_Ing : false> 인 경우는 [처리 중단 요청] 으로 도중에
      //중단된 것이므로 이에 관련 처리 수행.
      //}-----------------------------------------------------------------

      if(_gprjAllFind_Ing == false)
      {
        ide_msgbox_Form->_MsgBox(d_MSGBOX_info,
                                 "사용자 요청으로 [정보창:전체찾기] 에 결과를 출력하는 단계가 완료되지\r\n"
                                 "못했으나, 찾은 [문서수/항목수] 정보는 이미 산출된 정확한 정보입니다.");

        //[!]{----------------------------------------------------------
        //[문서 개수 정보] 는 이미 정확한 정보를 얻었다.
        //[Tree] 에 등록되던 중 중단 된 것이므로 처리 자체는 계속 진행.
        //}-------------------------------------------------------------

      }

  //}

  //[찾은 결과가 없는 문서 삭제]
  //{
      //[!]{---------------------------------------------------------------------
      //[Tree:전체찾기] 에서 [찾은:항목] 이 하나도 없는 [문서:항목] 은 삭제한다.
      //}------------------------------------------------------------------------

      //[<전체찾기> 옹이 정보 얻기]
      //{
          //여기서는 [직계가지:마지막 위치] 가 필요하다--------------------------------v
          tree_tree_Form->_Tree_Get_Node_LastItemIndex2(treeFind, "root", &nodeIndex, &nodeLastItemIndex, NULL);

      //}

      for(i = nodeIndex + 1; i <= nodeLastItemIndex; )
      {
        //[문서:항목] 은 모두 <root> 의 [직계가지] 에 해당하므로 이 [직계가지] 만 대상으로 처리.
        if((treeFind->items[0].level + 1) == treeFind->items[i].level)
        {
          //[하위 항목] 개수 얻기.
          tree_tree_Form->_Tree_Get_Node_ItemCount2(treeFind, i, &itemCount);

          //항목이 존재하지 않는 것은 삭제한다.
          if(itemCount == 0)
          {
            //현재 항목 삭제.
            tree_tree_Form->_Tree_Delete_Item(treeFind, i);

            //항목이 하나 삭제됐으므로 끝 항목 위치를 이전으로 수정.
            nodeLastItemIndex--;

            //현재 항목이 삭제됐으므로 현재 위치 부터 다시 검사.

          }
          else
          {
            i++;

          }

        }
        else
        {
          i++;

        }

      }

  //}

  lbFindInfoOut:

  //[찾은 (문서수/항목수) 출력]
  //{
      //[!]{--------------------------------------------------------------------------------------
      //"[+]전체찾기(문서:xxx/항목:xxx)" 와 같이 [찾은 문서/항목수] 를 [10진수 최소표기] 로 출력.
      //
      //[2019.02.22.금][수정]*********************************************************************
      //[첫번째 검색] 에서 구한값이 정확한 값이므로 그대로 사용.
      //}-----------------------------------------------------------------------------------------

      //[출력]
      //{
          //[문자열 합성]
          //{
              //[!]{---------------------------------
              //"(문서:xxx/항목:xxx)" 형식으로 출력.
              //}------------------------------------

              STR_Assign(lineStr, "전체찾기(문서:");

              //[문서:개수] 출력.
              CONV_LongVal_To_Str(docCount, 0, false, &(lineStr[STR_Length(lineStr)]));

              STR_Add(lineStr, "/항목:");

              //[항목:개수] 출력.
              CONV_LongVal_To_Str(itemTotalCount, 0, false, &(lineStr[STR_Length(lineStr)]));

              STR_Add(lineStr, ")");

          //}

          //[출력]
          //{
              //[2019.02.22.금][수정]{---------------------
              //<_allFind_CheckBtn> 조건에 따라 구분 처리.
              //}------------------------------------------

              if(_allFind_CheckBtn->_checked)
              {
                //[정보] 만 간단하게 [알림글] 로 표시해 준다.
                ide_msgbox_Form->_MsgBox(d_MSGBOX_default, lineStr);

              }
              else
              {
                //[root:문자열] 을 교체.
                tree_tree_Form->_Item_Txt(treeFind,
                                          //[root]----------v
                                          &(treeFind->items[0]),
                                          lineStr);
                                          
              }
              
          //}

      //}

  //}

  //[root:kind]
  //{
      //[2019.02.21.목][추가]{----------------------------------------------
      //<_Tree_Add_NodeItem()> 이 아니라 <_Tree_Add_Item()> 으로 처리하므로
      //<kind> 가 자동적으로 처리되지 않으므로, 추가된 항목이 하나라도
      //존재한다면 [+] 로 변경.
      //}-------------------------------------------------------------------

      //[root] 를 제외하고 항목이 한 개라도 더 있으면 [root] 에 항목이 있는것으로 간주.
      if(treeFind->items_count > 1)
      {
        treeFind->items[0].kind = '+';

      }

  //}

  lbTrue:
  //{
      //[Tree:STRHEAP:기본설정]
      //{
          //[2019.02.21.목][추가]{-----------------------------------------
          //<STRHEAP_List_Add()> 함수 동작을 [기본 설정] 으로 돌려 놓는다.
          //}--------------------------------------------------------------

          //기본상태로 복구--------------------------------v
          STRHEAP_Set_List_NoSearch(&(treeFind->_strHeap), false, 0);

      //}

      //[진행막대:설정]
      //{
          //[2019.02.22.금][추가]{---
          //진행막대 감추기.
          //}------------------------
          
          _search_Progress->Visible = false;

      //}

      //[STRHEAP:삭제]
      //{
          //[2019.02.22.금][추가]
          STRHEAP_Delete(&strHeap);

      //}

      return(true);

  //}

  lbFalse:
  //{
      //[Tree:STRHEAP:기본설정]
      //{
          //[2019.02.21.목][추가]{--------------------------------------
          //<STRHEAP_List_Add()> 함수 동작을 기본 설정으로 돌려 놓는다.
          //}-----------------------------------------------------------

          //기본상태로 복구--------------------------------v
          STRHEAP_Set_List_NoSearch(&(treeFind->_strHeap), false, 0);

      //}

      //[진행막대:설정]
      //{
          //[2019.02.22.금][추가]{---
          //진행막대 감추기.
          //}------------------------
          
          _search_Progress->Visible = false;
          
      //}

      //[STRHEAP:삭제]
      //{
          //[2019.02.22.금][추가]
          STRHEAP_Delete(&strHeap);

      //}

      return(false);

  //}

}

//------------------------------------------------------------------------------
//[찾은 목록 관련]--------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tfind_DialogBox_Form::_FindList_Add(//[2019.03.03.일][추가]
                                                    //[형광문자] 반영을 즉시 하는 경우는 <true>. 
                                                    bool  pEditorReDraw)
{
  //[2019.02.27.수][생성]{---------------------------
  //현재 [찾을 문자열] 을 [찾은목록] 에 등록한다.
  //
  //1) 중복 검사.
  //
  //2) 중복 없으면 바로 등록 하고,
  //   중복 되는 경우는 [기존것 삭제] => [새로 추가]
  //
  //방식으로 처리.
  //이는 최근것이 목록의 위에 보이게 하기 위한것.
  //
  //[2019.02.28.목][추가]----------------------------
  //[중복] 처리 추가.
  //
  //[2019.03.03.일][추가]----------------------------
  //[등록] 시에 [찾은목록] 이 펼쳐져 있다면 감춘다.
  //
  //[형광문자] 즉시 반영부분 추가.
  //}------------------------------------------------

  //[VAR]
  //{
      char  *findStr;

      int    findStrSize;

      char  *listStr;

      char   str[1024*10];

      int    strSize;

      int    startIndex;

      int    i;

  //}

  //[찾을 문자열 존재 확인]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(_find_Edit->_editbuf[0] == '\0') goto lbEnd;

  //}

  //[문자열 치환]
  //{
      //기술을 간단하게 하기 위한것.
      findStr = _find_Edit->_editbuf;

      listStr = _findList_List->_itemStr;

  //}

  //[기본정보 얻기]
  //{
      //길이 비교를 먼저하기 위함.
      findStrSize = STR_Length(findStr);

  //}

  //[중복 검사/처리]
  //{
      //[!]{-------------------------------------------------------------------
      //1) 길이 비교를 먼저 해서 길이가 다르면 굳이 [일치검사] 를 하지 않는다.
      //
      //2) 길이가 같다면 [일치검사] 를 처리한다.
      //
      //이 방법은 행 문자열을 추출하는 <STR_Get_ThisLineStr()> 함수가 동시에
      //[길이] 정보를 반환하기 떄문에 가능.
      //별도로 [길이] 정보를 구해야 하는 경우는 2) 만 처리하는 것이 효율적.
      //}----------------------------------------------------------------------

      for(i = 0, startIndex = 0; i <= _findList_List->_itemCount; i++)
      {
        //[행문자열 추출]
        //{
            strSize = STR_Get_ThisLineStr(listStr, startIndex, str);

        //}

        //[길이비교]
        //{
            //[길이] 부터가 다른 경우는 [일치검사] 를 할 필요도 없는 것.
            if(strSize != findStrSize) goto lbGetNextLineStartIndex;

        //}

        //[일치 검사]
        //{
            //[!]{--------------------------------------------------------------
            //항상 [대/소] 문자 구분으로 처리한다.
            //이는 [검색:조건] 에서 [대/소:구분] 을 사용할수 있으므로 [목록] 의
            //문자열은 항상 [대/소] 문자를 다른 것으로 보아야 한다.
            //}-----------------------------------------------------------------

            if(STR_Match(str, findStr) == true)
            {
              //[!]{---------------------------------------------------------------
              //[일치] 하는 경우.
              //
              //1) [일치:항목] 이 [0:번] 인 경우는 그대로 두고 [추가] 하지 않는다.
              //   이 위치에서 바로 종료.
              //
              //2) [일치:항목] 이 [0:번] 이 아니라면 이 항목을 삭제한다.
              //   추가하는 것은 아래 [찾은목록:등록] 부분에서 처리.
              //
              //}------------------------------------------------------------------

              if(i == 0)
              {
                //[!]{----------------------------------------------------------------
                //같은 항목이 추가할 위치 [0:번] 에 위치하므로 [삭제=>추가] 하지 않고
                //여기서 그냥 종료(기존것 그대로 유지).
                //}-------------------------------------------------------------------
                
                goto lbEnd;

              }
              else
              {
                //[!]{-----------------------------------------------------------------------
                //[증복] 된 경우 [기존것 삭제] => [현재 것 <0:번> 에 추가] 순으로 처리하므로
                //[중복된 항목] 을 삭제한다.
                //}--------------------------------------------------------------------------

                _findList_List->_ItemDelete(i);

                //아래 [찾은목록:등록] 처리를 위하여 종료.
                break;

              }

            }

        //}

        lbGetNextLineStartIndex:

        //[검사할 행 <시작:위치> 얻기]
        //{
            //다음 검사행 시작 위치를 검색 시작 위치로 설정.
            STR_Get_NextLineStartIndex(listStr, startIndex + strSize, &startIndex);
        
        //}

      }

      //[!]{---------------------------------------------------------------
      //여기까지 온 경우는 [일치] 하는 것이 없거나, 일치항목을 [삭제] 하고
      //[등록] 해야 하는 경우(즉, [등록] 을 해야 하는 경우에 해당).
      //}------------------------------------------------------------------

  //}

  //[찾은목록:등록]
  //{
      //[2019.02.27.수][추가]{---------------------------------
      //항상 추가는 가장 위 <0 번> 에 끼워 넣기 방식으로 추가.
      //}------------------------------------------------------
      
      _findList_List->_ItemInsert(0, _find_Edit->_editbuf);

      //[수직 줄이동자 설정]
      //{
          //[!]{----------------------------------------------------------
          //보이는 항목수(7개) 보다 작은 경우는 감추고, 큰 경우는 보인다.
          //}-------------------------------------------------------------

          if(_findList_List->_ItemCount() <= (7 - 2)) { _findList_List->_ScrollVisible(false); }
          else                                        { _findList_List->_ScrollVisible(true);  }

      //}

      //[선택 지정]
      //{
          //항상 <0 번> 위치에 끼워 넣으므로 <0 번> 을 선택.
          _findList_List->_ItemSelect(0);

      //}

  //}

  lbEnd:

  //[찾은목록:감추기]
  //{
      //[2019.03.03.일][추가]{---------
      //[등록] 후에는 반드시 [감추기].
      //}------------------------------
      
      _findList_List->Visible = false;
      _findList_List->_ItemMouseSelect(-1);
      _findList_List->_ItemSelect(-1);

      _findAlign_List->Visible = false;
      _findAlign_List->_ItemMouseSelect(-1);
      _findAlign_List->_ItemSelect(-1);

      _findList_BmpBtn->_Index(0);

  //}

  //[편집기 다시 그리기]
  //{
      //[2019.03.03.일][추가]{-----------------------------------------------------
      //[찾을 문자열] 을 [등록] 시 [형광문자] 를 즉시 반영하기 위하여 다시 그린다.
      //이 <_FindList_Add()> 는 [찾기] 부분에서 모두 사용되므로 이 함수 끝에서
      //한번 처리하는 것이 효과적.
      //[전체찾기] 시에도 모두 반영된다.
      //}--------------------------------------------------------------------------

      if(pEditorReDraw == true)
      {
        editor_edit_Form->_EditBuf_Text();

      }

  //}

}

bool __fastcall Tfind_DialogBox_Form::_FindList_Align(void)
{
  //[2019.03.02.수][생성]{--------------------------------------------------------
  //현재 [입력지정자] 가 위치한 지점까지의 [문자열] 을 추출하고, [문자열] 과
  //앞부분에서 부터 [일치] 하는 부분이 있는 모든 항목만 남기고 나머지는 삭제한다.
  //
  //단, [대/소:false] 로 비교한다(참고 기능에 가까우므로).
  //
  //[방법]************************************************************************
  //
  //1) <_fineList_List> 의 [전체 항목] 을 저장할수 있는 [새저장소] 생성.
  //
  //2) <_findList_List> 의 항목을 대상으로 [근접단어 정렬] 대상 항목 문자열을
  //   [새저장소] 로 복사. 해당하지 않는 것은 복사하지 않는 방법으로 처리.
  //
  //3) 최종적으로 [새저장소] 의 정렬된 문자열을 <_findAlign_List> 에 할당.
  //
  //단, [근접 단어 정렬] 은 [문자/단어] 입력등 <_find_Edit> 의 수정이 있는 경우나
  //[입력지정자 위치 변경] 시에 실시간으로 계속 이루어 진다.
  //
  //[2019.03.03.일][추가]---------------------------------------------------------
  //[근접단어정렬] 결과가 없다면 <_findAlign_List> 를 보이지 않고 감춘다.
  //}-----------------------------------------------------------------------------

  //[VAR]
  //{
      //[동적생성] 한다.
      char  *alignStr_ = NULL;

      int    alignStrSize = 0;

      char   editStr_[1024*10];

      char   lineStr_[1024*10];

      int    strSize;

      int    startIndex;

      int    i;

  //}

  //[찾을 문자열 존재 확인]
  //{
      //찾을 문자열이 있는 경우만 처리한다.
      if(_find_Edit->_editbuf[0] == '\0') goto lbFalse;

  //}

  //[현재 입력 지정자 까지 문자열 추출]
  //{
      STR_SubString(_find_Edit->_editbuf, 0, _find_Edit->_caretindex, editStr_);

      //추출된 문자열이 없다면 바로 종료.
      if(editStr_[0] == '\0') goto lbFalse;

  //}

  //[저장소 생성]
  //{
      //[!]{------------------------------------------------------------------------
      //[근접단어정렬] 결과를 합성할 저장소를 생성.
      //<_findList_List->_itemStr> 의 크기로 생성한다.
      //
      //실제는 [근접단어정렬] 에 해당하는 문자열만 복사되므로 공간은 많이 남게된다.
      //}---------------------------------------------------------------------------

      //맨 끝에 '\0' 이 추가될수 있도록 +1 해준다.
      //alignStr_ = new char [STR_Length(_findList_List->_itemStr) + 1];
      //[동적생성단위적용][2021.01.24.일][수정]
      alignStr_ = new char [UnitX(1024, STR_Length(_findList_List->_itemStr) + 1)];

      //초기화.
      alignStr_[0] = '\0';

      alignStrSize = 0;

  //}

  //[정렬]
  //{
      for(i = 0, startIndex = 0, alignStrSize = 0; i < _findList_List->_itemCount; i++)
      {
        //[행문자열 추출]
        //{
            strSize = STR_Get_ThisLineStr(_findList_List->_itemStr, startIndex, lineStr_);

        //}

        //[일치검사/항목삭제]
        //{
            //[!]{--------------------------------------------------------------
            //[대/소] 문자는 구분하지 않고 <editStr> 을 앞에서 부터 일부라도
            //가진 항목은 [새저장소] 에 복사하고 나머지는 버리는 방식으로 합성.
            //}-----------------------------------------------------------------

            if(Str_Match_Part_NoCase(lineStr_, editStr_) == true)
            {
              //부분이라도 일치하는 문자열인 경우는 [새저장소] 에 복사.
              alignStrSize += STR_Assign(&(alignStr_[alignStrSize]), lineStr_);

              //[1행:1항목] 이므로 [행] 으로 만들어 준다.
              alignStrSize += STR_Assign(&(alignStr_[alignStrSize]), "\r\n");

            }

        //}

        //[검사할 행 <시작:위치> 얻기]
        //{
            //다음 검사행 시작 위치를 검색 시작 위치로 설정.
            STR_Get_NextLineStartIndex(_findList_List->_itemStr, startIndex + strSize, &startIndex);
        
        //}

      }

      //[마지막 CRLF 제거]
      //{
          //<GList> 는 [마지막 항목] 에 "\r\n" 을 붙이면 안되므로 여기서 마지막 "\r\n" 은 제거.
          if(alignStrSize >= 2)
          {
            //마지막 CRLF 의 CR 위치에 '\0' 을 넣어서 문자열 완성.
            alignStr_[alignStrSize - 2] = '\0';

          }

      //}

  //}

  //[전체항목 설정]
  //{
      //[!]{--------------------------------------------------
      //최종적으로 <_findAlign_List> 의 [전체항목] 으로 설정.
      //}-----------------------------------------------------

      _findAlign_List->_ItemStr(alignStr_);

  //}

  //[저장소 삭제]
  //{
      //동적 생성한 저장소 삭제.
      if(alignStr_ != NULL) { delete [] alignStr_; alignStr_ = NULL; }

  //}

  //[결과가 존재하는지 확인]
  //{
      //[2019.03.03.일][추가]{------------------------------------------
      //[근접단어정렬] 결과가 존재하지 않는다면 <return:false> 로 간주.
      //}---------------------------------------------------------------

      if(_findAlign_List->_itemCount == 0) goto lbFalse;

  //}

  lbTrue:
  //{
      //[_findAlign_List]
      //{
          //[수직 줄이동자 설정]
          //{
              //[!]{----------------------------------------------------------
              //보이는 항목수(7개) 보다 작은 경우는 감추고, 큰 경우는 보인다.
              //}-------------------------------------------------------------

              if(_findAlign_List->_ItemCount() <= (7 - 2)) { _findAlign_List->_ScrollVisible(false); }
              else                                         { _findAlign_List->_ScrollVisible(true);  }

          //}

          //처음 보일때는 [가선택] 된것이 없도록 설정.
          //깜박임 방지를 위하여 보이기 전에 먼저 처리.
          _findAlign_List->_ItemMouseSelect(-1);
          _findAlign_List->_ItemSelect(-1);

          _findAlign_List->Visible = true;

          _findAlign_List->BringToFront();

      //}

      //[<_findList_List> 동반 처리]
      //{
          //[수직 줄이동자 설정]
          //{
              //[!]{----------------------------------------------------------
              //보이는 항목수(7개) 보다 작은 경우는 감추고, 큰 경우는 보인다.
              //}-------------------------------------------------------------

              if(_findList_List->_ItemCount() <= (7 - 2)) { _findList_List->_ScrollVisible(false); }
              else                                        { _findList_List->_ScrollVisible(true);  }

          //}
          
          //처음 보일때는 [가선택] 된것이 없도록 설정.
          //깜박임 방지를 위하여 보이기 전에 먼저 처리.
          _findList_List->_ItemMouseSelect(-1);
          _findList_List->_ItemSelect(-1);

          _findList_List->Visible = true;

          _findList_BmpBtn->_Index(1);

      //}

      return(true);

  //}

  lbFalse:
  //{
      //[2019.03.03.일][추가]{-------------------------------------
      //[근접단어정렬] 을 감춘다.
      //단, 위에서 <_findAlign_List/_findAlign_List> 가 연동되므로
      //감출때로 같이 사라지도록 설정.
      //}----------------------------------------------------------

      _findList_List->Visible = false;
      _findList_List->_ItemMouseSelect(-1);
      _findList_List->_ItemSelect(-1);

      _findAlign_List->Visible = false;
      _findAlign_List->_ItemMouseSelect(-1);
      _findAlign_List->_ItemSelect(-1);

      _findList_BmpBtn->_Index(0);

      return(false);

  //}

}

//------------------------------------------------------------------------------
//[제어 함수]-------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tfind_DialogBox_Form::_ExFindStrAdd(//[찾기} 에 등록할 문자열.
                                                    char  *pStr,
                                                    //[단어] 구분 여부.
                                                    bool   pOptWord,
                                                    //[대소문자] 구분 여부.
                                                    bool   pOptCase,
                                                    //[편집기] 를 다시 그릴 것인가?
                                                    bool   pReDraw)
{
  //[2012.02.28.화][생성!!!]{-------------------------------------------------
  //[찾기] 란에 [찾을 문자열] 을 등록하고, 조건을 설정한다.
  //이는 <bookMark_DialogBox.cpp> 를 처리하면서 [책갈피] 로 찾는 단어를
  //[색동문자] 로 지정하기 위하여 [찾기 대화상자] 에 등록할 필요가 있기 때문.
  //즉, 외부의 특수한 요청을 처리하기 위하여 만든다.
  //}-------------------------------------------------------------------------

  //[찾을 문자열 등록]
  //{
      //찾을 문자열이 없다면 더이상 처리하지 않는다.

      if(pStr[0] == '\0') return;

      _find_Edit->_EDIT_TextOut(pStr);

  //}

  //[조건 설정]
  //{
      _word_CheckBtn->_Checked(pOptWord);
      _case_CheckBtn->_Checked(pOptCase);

  //}

  //[편집기 다시 그리나?]
  //{
      //[!]{-------------------------------------------------------------
      //[색동문자] 를 즉시 반영하기 위하여 [편집기] 를 다시 그릴 것인가?
      //}----------------------------------------------------------------

      if(pReDraw == true) { editor_edit_Form->_EditBuf_Text(); }

  //}

}

//------------------------------------------------------------------------------
//[동작 함수]-------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tfind_DialogBox_Form::_EVENT_Click_pageAllFind_Btn(void)
{
  //[2019.02.16.토][생성]{----------------------------------------
  //[찾을 문자열] 을 현재 편집중인 문서 전체를 대상으로 모두 찾아
  //[정보창:전체찾기] 에 정리해 준다.
  //
  //[2019.02.23.토][중요수정]-------------------------------------
  //}-------------------------------------------------------------

  //[처리 중단 요청 확인]
  //{
      //[20190.02.23.토][추가]{------------------------------------------
      //현재 [버튼:"중단"] 이라면 현재 처리 중이므로 [중단] 시킨다.
      //}----------------------------------------------------------------

      if(STR_Match(_pageAllFind_Btn->_caption, "중단") == true)
      {
        //<_TreeFind_EditorViewDoc()> 의 내부 [반복문] 을 종료시킨다.
        //나머지는 자동 처리.
        _pageAllFind_Ing = false;

        //<_TreeFind_EditorViewDoc()> 의 내부 [반복문] 종료에 목적이 있으므로
        //다른 처리는 하지 않고 종료,
        return;

      }

  //}

  //[찾은목록:등록]
  //{
      //[2019.02.27.수][추가]{---------------------------------
      //항상 추가는 가장 위 <0 번> 에 끼워 넣기 방식으로 추가.
      //}------------------------------------------------------

      //[2019.03.03.일][추가]
      //[형광문자] 즉시 반영.
      //------------v
      _FindList_Add(true);

  //}

  //[버튼:문자열 교체]
  //{
      //[2019.02.23.토][추가]{----------
      //"중단" 으로 문자열을 교체.
      //}-------------------------------

      _pageAllFind_Btn->_Caption("중단");

      //<_TreeFind_EditorViewDoc()> 내부 [반복문] 활성화.
      _pageAllFind_Ing = true;

  //}

  //[초기화]
  //{
      //[!]{------------------------------------------------------------------
      //[Tree] 초기화.
      //내용을 채우고 다시 그리므로 여기서는 다시그리지 않는다(깜박임 방지).
      //
      //[참고][2019.02.21.목]*************************************************
      //<_Tree_All_Init()> 에서는 내부적으로 <_Tree_Delete()/_Tree_Create()>
      //로 처리되고, [Tree] 와 연동되는 <STRHEAP> 도 전부 [삭제/재생성] 된다.
      //즉, 완전히 [초기화] 상태가 된다.
      //}---------------------------------------------------------------------

      //[다시 그리기] 금지-----------------------v
      ide_tree_Form->_Tree_All_Init(d_Tree_Find, false);

  //}

  //[찾기/등록]
  //{
      _TreeFind_EditorViewDoc();

  //}

  //[모두 펼치기]
  //{
      //[2019.02.17.일][수정]{-----------------------------------
      //[한개문서] 만 존재하고, 이 문서의 검색 내용만 표시하므로
      //모두 펼쳐준다.
      //}--------------------------------------------------------

      tree_tree_Form->_Tree_ExpandAll(d_TREE_find, false);

      //이 함수 마지막 부분 <_TabIndex()> 에서 다시 그리기 되므로 여기서 하지 않는다.

  //}

  //[줄이동]
  //{
      //[2019.02.17.일][추가]{------------------------------------------
      //이전 줄이동 위치가 0 이 아닌 경우일수 있으므로 0 으로 조정한다.
      //새로운 정보가 시작되는 것이므로.
      //}---------------------------------------------------------------

      ide_tree_Form->_scroll_v_Form->_position = 0;

      //깜박임 방지를 위하여 다시 그리지 않는다.
      //아래 <_TabIndex()> 에서 다시그려지게 된다.
      //------------------------------------------------------------------v
      tree_tree_Form->_V_Scroll(ide_tree_Form->_scroll_v_Form->_position, false);

  //}

  //[<전체찾기:Tree> 로 전환]
  //{
      //여기서 최종적으로 [한번] 다시 그려지게 된다.
      ide_tree_Form->_tabs_Form->_TabIndex(d_TREE_find);

  //}

  //[버튼:문자열 교체]
  //{
      //[2019.02.23.토][추가]{---------
      //"현재 문서 전체 찾기" 로 복원.
      //}------------------------------

      _pageAllFind_Btn->_Caption("현재 문서 전체 찾기");

      //<_TreeFind_EditorViewDoc()> 내부 [반복문] 비활성화.
      _pageAllFind_Ing = false;

  //}
  
}

void __fastcall Tfind_DialogBox_Form::_EVENT_Click_gprjAllFind_Btn(void)
{
  //[2019.02.16.토][생성]{-------------------------------------------------
  //[찾을 문자열] 을 [설계묶음:Tree] 에 등록된 모든 문서를  대상으로
  //모두 찾아 [정보창:전체찾기] 에 정리해 준다.
  //[Tree] 에 등록된 문서만 대상으로 하고 <*.c> 안에 <#include> 로
  //포함시킨 문서까지 검사하지 않는다.
  //
  //이 문서는 [빌드] 후 자동으로 [Tree] 에 등록되므로 이 때 다시 검사한다.
  //
  //[2019.02.23.토][중요수정]----------------------------------------------
  //}----------------------------------------------------------------------

  //[처리 중단 요청 확인]
  //{
      //[20190.02.23.토][추가]{------------------------------------------
      //현재 [버튼:"중단"] 이라면 현재 처리 중이므로 [중단] 시킨다.
      //}----------------------------------------------------------------

      if(STR_Match(_gprjAllFind_Btn->_caption, "중단") == true)
      {
        //<_TreeFind_All()> 의 내부 [반복문] 을 종료시킨다.
        //나머지는 자동 처리.
        _gprjAllFind_Ing = false;

        //<_TreeFind_All()> 의 내부 [반복문] 종료에 목적이 있으므로
        //다른 처리는 하지 않고 종료,
        return;

      }

  //}

  //[찾은목록:등록]
  //{
      //[2019.02.27.수][추가]{---------------------------------
      //항상 추가는 가장 위 <0 번> 에 끼워 넣기 방식으로 추가.
      //}------------------------------------------------------

       //[2019.03.03.일][추가]
      //[형광문자] 즉시 반영.
      //------------v
      _FindList_Add(true);

  //}

  //[버튼:문자열 교체]
  //{
      //[2019.02.23.토][추가]{----------
      //"중단" 으로 문자열을 교체.
      //}-------------------------------

      _gprjAllFind_Btn->_Caption("중단");

      //<_TreeFind_All()> 내부 [반복문] 활성화.
      _gprjAllFind_Ing = true;

  //}

  //[초기화]
  //{
      //[!]{------------------------------------------------------------------
      //[Tree] 초기화.
      //내용을 채우고 다시 그리므로 여기서는 다시그리지 않는다(깜박임 방지).
      //
      //[참고][2019.02.21.목]*************************************************
      //<_Tree_All_Init()> 에서는 내부적으로 <_Tree_Delete()/_Tree_Create()>
      //로 처리되고, [Tree] 와 연동되는 <STRHEAP> 도 전부 [삭제/재생성] 된다.
      //즉, 완전히 [초기화] 상태가 된다.
      //}---------------------------------------------------------------------

      //[다시 그리기] 금지-----------------------v
      ide_tree_Form->_Tree_All_Init(d_Tree_Find, false);

  //}

  //[검색/등록]
  //{
      _TreeFind_All();

  //}

  //[문서 항목 펼치기]
  //{
      //[!]{---------------------------------------------------------------
      //[문서:목록] 은 모두 펼쳐 주어야 한다.
      //
      //[문서:목록] 은 <root> 의 직계이므로 <root> 만 펼치면 된다.
      //단, 하위 항목이 존재하는 경우만 처리.
      //
      //[방법]-------------------------------------------------------------
      //
      //<root> 의 [항목종류:'-'] 로 [폍침] 으로 설정한뒤 다시 그리면 된다.
      //
      //}------------------------------------------------------------------

      if(tree_tree_Form->_tree[d_TREE_find].items_count > 1)
      {
        //<root> 의 [항목종류:'-'] 로 [폍침] 으로 설정.
        tree_tree_Form->_tree[d_TREE_find].items[0].kind = '-';

      }

      //이 함수 마지막 부분 <_TabIndex()> 에서 다시 그리기 되므로 여기서 하지 않는다.

  //}

  //[줄이동]
  //{
      //[2019.02.17.일][추가]{------------------------------------------
      //이전 줄이동 위치가 0 이 아닌 경우일수 있으므로 0 으로 조정한다.
      //새로운 정보가 시작되는 것이므로.
      //}---------------------------------------------------------------

      ide_tree_Form->_scroll_v_Form->_position = 0;

      //깜박임 방지를 위하여 다시 그리지 않는다.
      //아래 <_TabIndex()> 에서 다시그려지게 된다.
      //------------------------------------------------------------------v
      tree_tree_Form->_V_Scroll(ide_tree_Form->_scroll_v_Form->_position, false);

  //}

  //[<전체찾기:Tree> 로 전환]
  //{
      //여기서 최종적으로 [한번] 다시 그려지게 된다.
      ide_tree_Form->_tabs_Form->_TabIndex(d_TREE_find);

  //}

  //[버튼:문자열 교체]
  //{
      //[2019.02.23.토][추가]{---
      //"전체 처리" 로 복원.
      //}------------------------

      _gprjAllFind_Btn->_Caption("전체 찾기");

      //<_TreeFind_All()> 내부 [반복문] 비활성화.
      _gprjAllFind_Ing = false;

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_Click_find_Btn(void)
{
  //[2009.05.06.수][생성!!!]{-------------------------------------------
  //[찾을 문자열] 을 현재 편집중인 문서의 [입력지정자] 위치부터 찾는다.
  //찾으면 멈춘다.
  //
  //[2019.02.27.수][추가]-----------------------------------------------
  //}-------------------------------------------------------------------

  //[찾은목록:등록]
  //{
      //[2019.02.27.수][추가]{---------------------------------
      //항상 추가는 가장 위 <0 번> 에 끼워 넣기 방식으로 추가.
      //}------------------------------------------------------

       //[2019.03.03.일][추가]
      //[형광문자] 즉시 반영.
      //------------v
      _FindList_Add(true);

  //}

  _Find(true, true, true,
        //[2009.05.08.금][추가!!!]
        //하나씩 찾는 경우는 무조건 위나 중간에 위치하게 만든다.
        false, true);

  //editor_edit_Form->_Caret_ViewAlways_Middle(true, true);

  return;

}

void __fastcall Tfind_DialogBox_Form::_EVENT_Click_replace_Btn(void)
{
  //[2009.05.06.수][생성!!!]{-------------------------------------------
  //현재 편집중인 문서의 [입력지정자] 위치부터 검사하여 [찾을문자열] 을
  //[교환문자열] 로 하나씩 찾은후 교환한다.
  //
  //[2019.02.27.수][추가]-----------------------------------------------
  //}-------------------------------------------------------------------

  //[찾은목록:등록]
  //{
      //[2019.02.27.수][추가]{---------------------------------
      //항상 추가는 가장 위 <0 번> 에 끼워 넣기 방식으로 추가.
      //}------------------------------------------------------

      //[2019.03.03.일][추가]
      //[형광문자] 는 아래 <editor_edit_Form->_EDIT_Paste()> 부분에서
      //반영 되지만 <_Find()> 에서 찾은 결과가 있는 경우만 처리되므로
      //여기서 먼저 반영해 준다.
      //------------v
      _FindList_Add(true);

  //}

  //[찾기]
  //{
      //먼저 현재 문자열을 조건에 맞게 찾는다.
      //선택영역은 보이지 않게 한다. 어차피 아래 함수에서 다시 그려지므로.
      if(_Find(false, false, true,
               //하나씩 교체 경우는 무조건 위나 중간에 위치하게 만든다.
               false, true) != true) return;

  //}

  //[교체]
  //{
      //이미 [선택영역] 으로 지정된 상태이므로 이 상태에서 [붙여넣기] 하면 된다.
      editor_edit_Form->_EDIT_Paste(_replace_Edit->_editbuf, true);

  //}

  //[문서수정]{---------------------------------
  //[2009.06.03.수][추가!!!]
  //문서가 수정됐음을 기록한다.
  editor_edit_Form->_EDIT_Changed(false, true);
  //}-------------------------------------------

}

void __fastcall Tfind_DialogBox_Form::_EVENT_Click_replaceAll_Btn(void)
{
  //[2009.05.06.수][생성!!!]{_-----------------------------------------------
  //현재 위치에서 문서의 끝까지 모두 [교체] 한다.
  //단, 문서 용량이 너무 많은 경우는 거의 멈춘것 같이 될수 있으므로 사용자가
  //도중에 중단 시킬수 있도록 처리한다.
  //
  //[2012.01.27.금][중요수정!!!]---------------------------------------------
  //[모두교체] 시 [입력지정자] 가 보이지 않도록 수정.
  //이는 문서양이 많은경우 [입력지정자] 가 이리저리 산만하게 움직이는것을
  //막아 깨끗한 동작을 보이게 하기 위한 것이다.
  //간단한 기능이지만 훨씬 더 보기 좋다.
  //<gui_caret->_Position()> 함수와 관련이 있다.
  //
  //[2019.02.24.일][중요수정]------------------------------------------------
  //[전체찾기] 버튼 추가로 [전체찾기] 를 누르다가 잘못 누르는 경우가 빈번
  //하므로, [확인/취소] 기능을 추가한다.
  //
  //[2019.02.27.수][추가]----------------------------------------------------
  //}------------------------------------------------------------------------

  if(STR_Match(_replaceAll_Btn->_caption, "모두 교환") == true)
  {
    //[확인/취소]
    //{
        //[2019.02.24.일][추가]
        if(ide_msgbox_Form->_MsgBox_Ok_Cancle
                            (d_MSGBOX_info,
                            "[모두 교환] 하시겠습니까?"
                            ) != true) return;

    //}

    //[찾은목록:등록]
    //{
        //[2019.02.27.수][추가]{---------------------------------
        //항상 추가는 가장 위 <0 번> 에 끼워 넣기 방식으로 추가.
        //}------------------------------------------------------

        //[2019.03.03.일][추가]
        //[형광문자] 는 이 함수 끝 부분에서 한번 처리하므로 여기서는 [편집기:다시그리기] 하지 않는다.
        //------------v
        _FindList_Add(false);

    //}

    //버튼의 문자열을 교체한다.
    _replaceAll_Btn->_Caption("중지");

    loop = true;


    //[_EditBuf_Text() 기능 제어]{--------------------
    //_EditBuf_Text() 함수가 동작되지 못하게 한다.
    editor_edit_Form->_editBuf_Text_No_Select = true;
    //}-----------------------------------------------


    //[입력지정자:스텔스 설정]
    //{
        //[2012.01.27.금][추가!!!]{---------------------------------------------
        //<_Find()> 함수에서 <History_SelectX()> 를 사용하고
        //<History_SelectX()> 함수안에서 <_EDIT_CaretPos()> 를 사용하는데
        //이 <_EDIT_CaretPos()> 에서 <gui_caret->_Position()> 함수를 사용하므로
        //처리시 [입력지정자] 가 자동으로 보이지 않도록 [스텔스] 로 설정한다.
        //
        //[편집기] 자체는 모든 처리를 완료후 한번만 그려주지만, [입력지정자] 는
        //계속 보여지므로 이를 방지하기 위한것.
        //}---------------------------------------------------------------------

        editor_edit_Form->_caret->_Stealth(true);

    //}


    while(loop)
    {
      Application->ProcessMessages();

      //[찾기]
      //{
          //먼저 현재 문자열을 조건에 맞게 찾는다.
          //더이상 찾는 것이 없다는 것은 문서의 끝이라는 것도 되므로 여기서
          //[반복문] 을 종료한다.
          //<return> 을 사용하면 마지막에 [다시그리기] 를 할수 없으므로 주의한다.
          if(_Find(false, false, false,
                   //연속 교체의 경우는 계속 [줄이동] 되는 것을 막기 위하여
                   //위/중간에 항상 위치하도록 설정한다.
                   false, true) != true) break;

      //}

      //[교체]
      //{
          //이미 [선택영역] 으로 지정된 상태이므로 이상태에서 붙여넣기하면 된다.
          editor_edit_Form->_EDIT_Paste(_replace_Edit->_editbuf, false);

      //}

    }


    //[입력지정자:스텔스 해제]
    //{
        //[2012.01.27.금][추가!!!]
        editor_edit_Form->_caret->_Stealth(false);

    //}


    //[_EditBuf_Text() 기능 제어]{---------------------
    //_EditBuf_Text() 함수의 동작을 허용한다.
    editor_edit_Form->_editBuf_Text_No_Select = false;
    //}------------------------------------------------

    //[문서수정]{---------------------------------
    //[2009.06.03.수][추가!!!]
    //문서가 수정됬음을 기록한다.
    editor_edit_Form->_EDIT_Changed(false, true);
    //}-------------------------------------------

    //[묶음주석 정보 얻기]
    //{
        //[2009.06.03.수][추가!!!]{-------
        //이 경우는 무조건 한번 처리한다.
        //}-------------------------------

        //[묶음주석] 정보 수집.
        editor_edit_Form->_CommentBlock_Info(false);

        //[다시 그리기]{----------------------------------------------------
        //[붙이기] 로 바꾸게 되므로 너무 많은 시간을 소비하게 되어 마지막에
        //딱, 한번만 다시 그려준다.
        editor_edit_Form->_EditBuf_Text();
        //}-----------------------------------------------------------------

    //}

    //다 처리 했다면 다시 원상복구 시켜준다.
    _replaceAll_Btn->_Caption("모두 교환");

  }
  else
  {
    //이 경우는 "중지" 인 경우다.
    _replaceAll_Btn->_Caption("모두 교환");

    loop = false;

    Application->ProcessMessages();

  }

  return;

}

void __fastcall Tfind_DialogBox_Form::_EVENT_Click_findList_BmpBtn(void)
{
  //[2019.02.27.수][생성]{---------
  //[찾은목록] 을 보이거나 감춘다.
  //}------------------------------

  if(_findList_BmpBtn->_index == 0)
  {
    //[기본] 상태라면 [찾은목록] 을 보여준다.

    //[수직 줄이동자 설정]
    //{
        //[!]{----------------------------------------------------------
        //보이는 항목수(7개) 보다 작은 경우는 감추고, 큰 경우는 보인다.
        //}-------------------------------------------------------------

        if(_findList_List->_ItemCount() <= (7 - 2))
        {
          _findList_List->_ScrollVisible(false);

        }
        else
        {
          _findList_List->_ScrollVisible(true);

        }

    //}

    _findList_List->Visible = true;

    _findList_BmpBtn->_Index(1);

  }
  else
  {
    //[찾은목록] 을 감춘다.

    //[감추기]
    //{
        _findList_List->Visible = false;
        _findList_List->_ItemMouseSelect(-1);
        _findList_List->_ItemSelect(-1);

        _findAlign_List->Visible = false;
        _findAlign_List->_ItemMouseSelect(-1);
        _findAlign_List->_ItemSelect(-1);

        _findList_BmpBtn->_Index(0);

    //}

  }

}

void __fastcall Tfind_DialogBox_Form::_EVENT_ItemSelect_findList_PopupMenu(void)
{
  //[2019.02.27.수][생성]{---
  //[2019.03.02.토][수정]----
  //[문자열] 방식으로 변경.
  //}------------------------

  //[VAR]
  //{
      //[2019.03.02.토][추가]
      char  itemSelStr_[1024];

  //}

  //[항목 문자열 추출]
  //{
      _findList_PopupMenu->_ItemSelStr(itemSelStr_);

  //}

  if     (STR_Match(itemSelStr_, " 삭제 ") == true)
  {
    //[!]{----------------------------
    //현재 [선택] 상태의 항목을 삭제.
    //}-------------------------------

    //현재 선택된 것을 삭제.
    _findList_List->_ItemDelete(_findList_List->_itemSelIndex);

    //해당 항목이 삭제되었으므로 선택 해제.
    _findList_List->_ItemSelect(-1);

    //[수직 줄이동자 설정]
    //{
        //[!]{----------------------------------------------------------
        //보이는 항목수(7개) 보다 작은 경우는 감추고, 큰 경우는 보인다.
        //}-------------------------------------------------------------

        if(_findList_List->_ItemCount() <= (7 - 2))
        {
          _findList_List->_ScrollVisible(false);

        }
        else
        {
          _findList_List->_ScrollVisible(true);

        }

    //}

  }
  else if(STR_Match(itemSelStr_, " 모두삭제 ") == true)
  {
    //[!]{--------------
    //모든 항목을 삭제.
    //}-----------------

    //NULL 문자열로 설정하면 모든 항목은 없어진다.
    _findList_List->_ItemStr("");

    //[수직 줄이동자 설정]
    //{
        _findList_List->_ScrollVisible(false);

    //}

  }
  else if(STR_Match(itemSelStr_, " 내용보기 ") == true)
  {
    //[!]{-----------------------------------------------------
    //[편집기:새문서] 를 만들고 여기에 [찾은목록] 전체를 출력.
    //}--------------------------------------------------------

    //[새문서] 하나 만들기.
    editor_edit_Form->_EDITFILE_NewFile();

    //[새문서] 에 [찾은목록] 을 출력한다.
    editor_edit_Form->_EDIT_TextOut(_findList_List->_itemStr);

  }

}

void __fastcall Tfind_DialogBox_Form::_EVENT_ItemSelect_findList_List(void)
{
  //[2019.02.27.수][생성]{------------------------------
  //현재 선택된 [항목:문자열] 을 [찾을 문자열] 에 등록.
  //}---------------------------------------------------

  //[VAR]
  //{
      char  itemStr[1024*10];

  //}

  //[등록]
  //{
      //현재 [선택항목:문자열] 얻기.
      _findList_List->_ItemSelStr(itemStr);

      //[찾을 문자열] 에 등록.
      _find_Edit->_EDIT_TextOut(itemStr);

  //}

  //[감추기]
  //{
      _findList_List->Visible = false;
      _findList_List->_ItemMouseSelect(-1);
      _findList_List->_ItemSelect(-1);

      _findAlign_List->Visible = false;
      _findAlign_List->_ItemMouseSelect(-1);
      _findAlign_List->_ItemSelect(-1);

      _findList_BmpBtn->_Index(0);

  //}

  //[편집기 촛점 설정]
  //{ 
      _find_Edit->SetFocus();

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_ItemReSelect_findList_List(void)
{
  //[2019.02.27.수][생성]{---------------------
  //현재 필요하지 않다. 일단, 만들어만 놓는다.
  //}------------------------------------------

  // ...

}

void __fastcall Tfind_DialogBox_Form::_EVENT_ItemMouseSelect_findList_List(void)
{
  //[2019.02.27.수][생성]{-------------
  //[마우스] 로 [가선택] 된 항목 처리.
  //}----------------------------------

  //[빠른목록] 감추기.
  _findList_PopupMenu->Hide();

  //[2019.03.02.토][추가]
  //[빠른목록] 을 보이기 위한 [마우스:버튼:R] 로도 [선택] 이 되므로 [선택:항목] 을 해제한다.
  _findList_List->_ItemSelect(-1);

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_Esc_findList_List(void)
{
  //[2019.02.27.수][생성]

  //[감추기]
  //{
      //[KEY:Up] 인 경우는 감춘다.
      _findList_List->Visible = false;
      _findList_List->_ItemMouseSelect(-1);
      _findList_List->_ItemSelect(-1);

      _findAlign_List->Visible = false;
      _findAlign_List->_ItemMouseSelect(-1);
      _findAlign_List->_ItemSelect(-1);

      _findList_BmpBtn->_Index(0);

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_MouseUp_R_findList_List(void)
{
  //[2019.02.27.수][생성]{-------------------
  //[마우스:우측버튼] 이 올라온 경우를 처리.
  //[빠른목록] 을 보여주기 위하여 필요.
  //}----------------------------------------

  //[VAR]
  //{
      int  absTop;
      int  absLeft;

  //}

  //[항목 설정]
  //{
      //각 항목은 간단하게 [행단위] 로 구분된다.
      _findList_PopupMenu->_ItemStr(" 삭제 \r\n"
                                    " 모두삭제 \r\n"
                                    " 내용보기 ");

  //}

  //[대상 항목 선택]
  //{
      //[!]{------------------------------------
      //[빠른목록] 적용대상이 되는 항목을 지정.
      //현재 [가선택] 돼 있는 항목이 해당.
      //}---------------------------------------

      _findList_List->_ItemSelect(_findList_List->_itemMouseSelIndex);

  //}

  //[빠른목록 보이기]
  //{
      //[촛점 설정 부품 기록]
      //{
          //[!]{------------------------------------------------------------------
          //[목록] 이 촛점을 잃을 경우 촛점을 가질 [부품] 을 기록해 준다.
          //
          //<NULL> 로 지정하여 [빠른목록] 이 보이는 상태에서 항목을 선택하는 경우
          //<_EVENT_ItemSelect> 가 [두번] 방생하는 것을 막아준다.
          //}---------------------------------------------------------------------

          _findList_PopupMenu->_FocusedPart(NULL);

      //}

      //[보이기]
      //{
          //[!]{----------------------------------------------------
          //어떤 경우라도 정확한 위치에 [빠른목록] 이 보일수 있도록
          //<GPART_Get_AbsTopLeft()> 함수를 사용.
          //}-------------------------------------------------------

          //[절대위치 얻기]
          //{
              //빠른 목록이 표시되는 그림부품의 [절대위치] 를 구한다.
              GPART_Get_AbsTopLeft(_findList_PopupMenu->Parent, _findList_List, &absTop, &absLeft);

          //}

          //[보이기]
          //{
              //[절대위치] 에 [빠른목록] 을 표시한다.

              //[목록] 이 [화면지정자] 를 가리지 않고 계속 [한줄 편집기] 에 있도록
              //약간 오른쪽에 위치시킨다.-------------------------------v
              _findList_PopupMenu->_MenuShow(absLeft + _findList_List->_mouseX + 4, absTop + _findList_List->_mouseY);

          //}

      //}

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_PreUp_findList_List(void)
{
  //[2019.03.02.토][생성]{--------------------------------------
  //현재 [항목:0] 이라면 <_find_Edit> 로 [촛점] 을 이동 시킨다.
  //}-----------------------------------------------------------

  if(_findList_List->_itemMouseSelIndex == 0)
  {
    _findList_List->_ItemMouseSelect(-1);
    _findList_List->_ItemSelect(-1);

    _find_Edit->SetFocus();

  }

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_PreUp_findAlign_List(void)
{
  //[2019.03.02.토][생성]{--------------------------------------
  //현재 [항목:0] 이라면 <_find_Edit> 로 [촛점] 을 이동 시킨다.
  //}-----------------------------------------------------------

  if(_findAlign_List->_itemMouseSelIndex == 0)
  {
    _findAlign_List->_ItemMouseSelect(-1);
    _findAlign_List->_ItemSelect(-1);

    _find_Edit->SetFocus();

  }

}

void __fastcall Tfind_DialogBox_Form::_EVENT_ItemSelect_findAlign_List(void)
{
  //[2019.03.02.토][생성]{-------------------
  //[선택항목] 을 [찾을 문자열] 에 설정한다.
  //}----------------------------------------

  //[VAR]
  //{
      char  itemStr[1024*10];

  //}

  //[등록]
  //{
      //현재 [선택항목:문자열] 얻기.
      _findAlign_List->_ItemSelStr(itemStr);

      //[찾을 문자열] 에 등록.
      _find_Edit->_EDIT_TextOut(itemStr);

  //}

  //[감추기]
  //{
      _findList_List->Visible = false;
      _findList_List->_ItemMouseSelect(-1);
      _findList_List->_ItemSelect(-1);

      _findAlign_List->Visible = false;
      _findAlign_List->_ItemMouseSelect(-1);
      _findAlign_List->_ItemSelect(-1);

      _findList_BmpBtn->_Index(0);

  //}

  //[편집기 촛점 설정]
  //{ 
      _find_Edit->SetFocus();

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_MouseUp_R_findAlign_List(void)
{
  //[2019.03.02.토][생성]{-------------------
  //[마우스:우측버튼] 이 올라온 경우를 처리.
  //[빠른목록] 을 보여주기 위하여 필요.
  //}----------------------------------------

  //[VAR]
  //{
      int  absTop;
      int  absLeft;

  //}

  //[항목 설정]
  //{
      //각 항목은 간단하게 [행단위] 로 구분된다.
      _findList_PopupMenu->_ItemStr("::: 근접 단어 정렬 상태 :::");

  //}

  //[대상 항목 선택]
  //{
      //[!]{------------------------------------
      //[빠른목록] 적용대상이 되는 항목을 지정.
      //현재 [가선택] 돼 있는 항목이 해당.
      //}---------------------------------------

      _findAlign_List->_ItemSelect(_findAlign_List->_itemMouseSelIndex);

  //}

  //[빠른목록 보이기]
  //{
      //[촛점 설정 부품 기록]
      //{
          //[!]{------------------------------------------------------------------
          //[목록] 이 촛점을 잃을 경우 촛점을 가질 [부품] 을 기록해 준다.
          //
          //<NULL> 로 지정하여 [빠른목록] 이 보이는 상태에서 항목을 선택하는 경우
          //<_EVENT_ItemSelect> 가 [두번] 방생하는 것을 막아준다.
          //}---------------------------------------------------------------------

          _findList_PopupMenu->_FocusedPart(NULL);

      //}

      //[보이기]
      //{
          //[!]{----------------------------------------------------
          //어떤 경우라도 정확한 위치에 [빠른목록] 이 보일수 있도록
          //<GPART_Get_AbsTopLeft()> 함수를 사용.
          //}-------------------------------------------------------

          //[절대위치 얻기]
          //{
              //빠른 목록이 표시되는 그림부품의 [절대위치] 를 구한다.
              GPART_Get_AbsTopLeft(_findList_PopupMenu->Parent, _findAlign_List, &absTop, &absLeft);

          //}

          //[보이기]
          //{
              //[절대위치] 에 [빠른목록] 을 표시한다.

              //[목록] 이 [화면지정자] 를 가리지 않고 계속 [한줄 편집기] 에 있도록
              //약간 오른쪽에 위치시킨다.--------------------------------v
              _findList_PopupMenu->_MenuShow(absLeft + _findAlign_List->_mouseX + 4, absTop + _findAlign_List->_mouseY);

          //}

      //}

  //}

}

void __fastcall Tfind_DialogBox_Form::_EVENT_ItemMouseSelect_findAlign_List(void)
{
  //[2019.02.27.수][생성]{-------------
  //[마우스] 로 [가선택] 된 항목 처리.
  //}----------------------------------

  //[빠른목록] 감추기.
  _findList_PopupMenu->Hide();

  //[2019.03.02.토][추가]
  //[빠른목록] 을 보이기 위한 [마우스:버튼:R] 로도 [선택] 이 되므로 [선택:항목] 을 해제한다.
  _findAlign_List->_ItemSelect(-1);

}

void __fastcall Tfind_DialogBox_Form::_EVENT_KeyDown_Esc_findAlign_List(void)
{
  //[2019.02.27.수][생성]

  //[감추기]
  //{
      //[KEY:Up] 인 경우는 감춘다.
      _findList_List->Visible = false;
      _findList_List->_ItemMouseSelect(-1);
      _findList_List->_ItemSelect(-1);

      _findAlign_List->Visible = false;
      _findAlign_List->_ItemMouseSelect(-1);
      _findAlign_List->_ItemSelect(-1);

      _findList_BmpBtn->_Index(0);

  //}

}

//------------------------------------------------------------------------------

void __fastcall Tfind_DialogBox_Form::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2007.09.26.수][생성!!!]{-------
  //현재 [폼 이동] 처리에 사용한다.
  //}-------------------------------

  //[VAR]
  //{
      //[2018.03.17.토][추가!!!]
      TPoint  mousePos;

  //}

  //[전광판]
  //{
      //[2010.04.03.토][추가!!!]{-----------------------------
      //[전광판] 을 일시 정지 시킨다.
      //이는 이동, 크기조정시 끊어짐 현상을 막기 위한 것이다.
      //}-----------------------------------------------------

      ide_editor_Form->_GDotMatrix_RotateTemp(false);

  //}

  //[캡션바] 영역에서만 처리되어야 한다.
  if(((0 <= X) && (X < _caption_width)) &&
     ((0 <= Y) && (Y < _caption_height)))
  {
    if(Button == mbLeft)
    {
      //[위치 기록]
      //{
          //[2018.03.17.토][수정!!!]{-----------------------------------------------------
          //[전체화면] 을 대상으로한 위치 사용.
          //이는 <GVmos> 등 다른 Form 안에 생성되는 경우에도 동일하게 동작 시키기 위한것.
          //}-----------------------------------------------------------------------------

          //[전체화면] 을 대상으로 마우스 위치 얻기.
          GetCursorPos(&mousePos);

          //현재 <this> 위치와 [마우스] 위치 간의 거리 얻기.
          //항상 같은 거리를 유지하는 방법으로 [제목줄 이동] 을 구현하기 위한것.
          deltaLeft = mousePos.x - this->Left;
          deltaTop  = mousePos.y - this->Top;

      //}

      //caption 이 선택된 것을 알린다.
      _caption_selected = true;

      //[wine 지원]
      //{
          //[2018.03.04.일][추가!!!]{---------
          //[제목줄] 이동을 위한 타이머 켜기.
          //}---------------------------------

          if(_ide_option->wine == true)
          {
            captionMoveTimer->Enabled = true;

          }

      //}

    }

  }

  return;

}

void __fastcall Tfind_DialogBox_Form::FormMouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
  //[2007.09.26.수][생성!!!]{----------------------
  //마우스로 caption 을 집어 끄는 경우를 처리한다.
  //}----------------------------------------------

  //[VAR]
  //{
      //[2018.03.17.토][추가!!!]
      TPoint  mousePos;

  //}

  //[캡션바 이동]
  //{
      //[캡션바] 영역에서만 처리되어야 한다.
      if(((0 <= X) && (X < _caption_width)) &&
         ((0 <= Y) && (Y < _caption_height)) ||
         //마우스로 집어  끄는 경우 영역을 벗어난 경우도 처리 되어야 한다.
         //이는 집어 끌다가 놓치는 경우를 막기 위한 것이다.
         (Shift.Contains(ssLeft)))
      {
        if((Shift.Contains(ssLeft)) && (_caption_selected == true))
        {
          //caption 을 마우스로 집어끄는 경우 Form 을 이동 시켜야 한다.

          //[wine 지원]
          //{
              //[2018.03.04.일][추가!!!]{-------------------------------
              //<Linux:wine> 에서 구동 중이라면 여기서 처리하지 않는다.
              //<captionMoveTimerTimer()> 안에서 처리된다.
              //}-------------------------------------------------------

              if(_ide_option->wine == true)
              {
                //[Linux:wine]
                //이 경우 아래에서 사용하는 <Left>, <Top> 값은 <captionMoveTimer> 안에서
                //수정되고 있는 정확한 값으로 처리.

              }
              else
              {
                //[윈도우]

                //[위치 이동]
                //{
                    //[2018.03.17.토][수정!!!]{-----------------------------------------------------
                    //[전체화면] 을 대상으로한 위치 사용.
                    //이는 <GVmos> 등 다른 Form 안에 생성되는 경우에도 동일하게 동작 시키기 위한것.
                    //}-----------------------------------------------------------------------------

                    //[전체화면] 을 대상으로 마우스 위치 얻기.
                    GetCursorPos(&mousePos);

                    //현재 <this> 위치와 [마우스] 위치 간의 거리를
                    //항상 같은 거리로 유지하는 방법으로 [제목줄 이동] 을 구현.
                    this->Left = mousePos.x - deltaLeft;
                    this->Top  = mousePos.y - deltaTop;

                //}

              }

          //}

        }

      }

  //}

  return;

}

void __fastcall Tfind_DialogBox_Form::FormMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //[2007.09.26.수][생성!!!]

  //[wine 지원]
  //{
      //[2018.03.04.일][추가!!!]{---------
      //[제목줄] 이동을 위한 타이머 끄기.
      //}---------------------------------

      if(_ide_option->wine == true)
      {
        //<FormMouseUp> 에서는 무조건 타이머 정지.
        captionMoveTimer->Enabled = false;

      }

  //}

  //[전광판]
  //{
      //[2010.02.23.화][추가!!!]{--------------
      //[전광판] 을 다시 정지에서 해제시킨다.
      //}--------------------------------------

      ide_editor_Form->_GDotMatrix_RotateTemp(true);

  //}

  if(((0 <= X) && (X < _caption_width)) &&
     ((0 <= Y) && (Y < _caption_height)))
  {
    if(Button == mbRight)
    { 

    }

  }

  //[해제]
  //{
      //caption 선택을 해제한다.
      _caption_selected = false;

  //}

  return;

}

void __fastcall Tfind_DialogBox_Form::FormShow(TObject *Sender)
{
  //[2009.05.08.금][생성!!!]{---------
  //[찾을 문자열] 에 촛점을 맞춰준다.
  //
  //[2019.02.27.수][수정]-------------
  //}---------------------------------

  //[VAR]
  //{
      //[2019.02.27.수][추가]
      char       *fileBuf = NULL;

      int         fileSize;

  //}

  _find_Edit->SetFocus();

  //[2009.05.14.목][수정!!!]{---------------------------------------
  //이렇게 하지 않는 경우는 [입력지정자] 가 2 개 동시에 나온다.
  //따라서 [교환문자열] 의 것은 사라지게 만든다.
  //아마도 <KillFocus> 를 제대로 받지 못해서 발생하는 문제인것같다.
  _replace_Edit->_caret->_Hide();
  //}---------------------------------------------------------------

  //[문서목록:불러오기]
  //{
      //[2019.02.27.수][추가]{-------------------------------------
      //<IDE\find\find.gtxt> 문서를 읽어서 [찾은목록] 에 올려준다.
      //단, 아직 생성돼 있지 않은 경우는 "" 로 설정.
      //}----------------------------------------------------------

      //[문서열기]
      //{
          if(FILE_Open(ExtractFilePath(Application->ExeName) + "find\\find.gtxt",
                       (unsigned char **)(&fileBuf), &fileSize) != true) return;

          //[참고]{---------------------------------------------------------------------
          //<FILE_Open():false> 인 경우는 내부적으로 [문서가 존재하지 않는 경우] 이므로
          //아직 [동적생성] 이 안된 상태라 여기서 바로 종료해도 무방.
          //}---------------------------------------------------------------------------
          
      //}

      //[찾은목록:설정]
      //{
          //[!]{----------------------------------------------------------------
          //<find.gtxt> 내용은 원래 [찾은목록] 의 내용 그대로를 저장한 것이므로
          //읽어들인 그대로 다시 올려주면 된다.
          //}-------------------------------------------------------------------

          _findList_List->_ItemStr(fileBuf);

      //}

      //[공간 삭제]
      //{
          if(fileBuf != NULL) { delete [] fileBuf; fileBuf = NULL; }

      //}

  //}

  //[감추기]
  //{
      //[2019.03.03.일][추가]{----------------------------------
      //[찾기:대화상자] 를 보일때 무조건 처음 상태로 시작.
      //이전에 [찾은목록] 이 보이고 있는 상태에서 닫은 경우라도
      //보일때는 반드시 초기화 한 상태로 보이도록 한다.
      //}-------------------------------------------------------
      
      _findList_List->Visible = false;
      _findList_List->_ItemMouseSelect(-1);
      _findList_List->_ItemSelect(-1);

      _findAlign_List->Visible = false;
      _findAlign_List->_ItemMouseSelect(-1);
      _findAlign_List->_ItemSelect(-1);

      _findList_BmpBtn->_Index(0);

  //}

}

void __fastcall Tfind_DialogBox_Form::FormHide(TObject *Sender)
{
  //[2009.05.09.토][생성!!!]{-------------------------------------------------
  //현재 [찾을문자열] 에 등록된 문자열이 [편집기] 의 [형광문자] 로 등록되도록
  //다시 그려준다.
  //
  //[2018.07.25.수][수정!!!]--------------------------------------------------
  //[2018.07.25.수][수정!!!]{-------------------------------------------------
  //<_EVENT_KeyEnter_find_Edit()> 에 [찾기] 기능을 추가 했으므로 [종료] 시
  //[찾기] 기능이 동작하지 않도록 해당 처리 함수만 사용한다.
  //_EVENT_KeyEnter_find_Edit();
  //}-------------------------------------------------------------------------

  editor_edit_Form->_EditBuf_Text();

  //[문서목록:불러오기]
  //{
      //[2019.02.27.수][추가]{-------------------------------------
      //<IDE\find\find.gtxt> 문서를 읽어서 [찾은목록] 에 올려준다.
      //단, 아직 생성돼 있지 않은 경우는 "" 로 설정.
      //}----------------------------------------------------------

      //[해당 경로를 생성]
      //{
          //지정 경로(폴더)가 존재 하는지 확인하고 존재하지 않는다면 생성.
          File_CreateDirectory(((AnsiString)(ExtractFilePath(Application->ExeName) + "find\\")).c_str());

      //}

      //[문서저장]
      //{
          FILE_Save(ExtractFilePath(Application->ExeName) + "find\\find.gtxt",
                    _findList_List->_itemStr, STR_Length(_findList_List->_itemStr));

      //}

  //}


}

void __fastcall Tfind_DialogBox_Form::captionMoveTimerTimer(TObject *Sender)
{
  //[2018.03.04.일][생성!!!]{---------------------------
  //[Linux:wine] 에서 [제목줄:이동] 을 지원하기 위한것.
  //}---------------------------------------------------

  //[VAR]
  //{
      TPoint  mousePos;

  //}

  //[위치 수정]
  //{
      //[!]{-----------------------------------------------------------------------------
      //이전 방식은 <Linux:wine> 에서는 빠르게 이동하는 경우 [떨림] 현상이 생기고
      //이동이 끊어지는 문제가 발생.
      //이는 <Linux:wine> 에서 [제목줄] 밖으로 [화면지정자] 가 나가는 경우를 제대로
      //처리하지 못하는 문제인듯.
      //따라서, 기존처럼 [상대좌표] 를 사용하지 않고 [절대좌표] 를 사용하는 것으로 수정.
      //}--------------------------------------------------------------------------------

      //[마우스 절대 위치 얻기]
      //{
          //화면상의 [마우스] 절대 위치를 얻는다.
          GetCursorPos(&mousePos);

      //}

      //[이동]
      //{
          //[2018.03.17.토][수정!!!]{---------------------------------
          //현재 <this> 위치와 [마우스] 위치 간의 거리를
          //항상 같은 거리로 유지하는 방법으로 [제목줄 이동] 을 구현.
          //자세한 내용은 [제목줄 이동] 관련 부분 설명 연관 참고.
          //}---------------------------------------------------------
          
          this->Left = mousePos.x - deltaLeft;
          this->Top  = mousePos.y - deltaTop;

      //}

  //}

}






