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

#include <vcl.h>
#pragma hdrstop

#include "ide_msg.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tide_msg_Form *ide_msg_Form;
//---------------------------------------------------------------------------

//[다른 폼]
//{
    #include "main.h"
    #include "ide_main.h"
    #include "ide_menu.h"
    #include "ide_hsplit.h"
    #include "msg_msg.h"

    //[2009.10.01.목][추가!!!]
    #include "ide_library.h"
    #include "ide_msgbox.h"

    //[2009.10.02.금][추가!!!]
    #include "gui.h"

    //[2009.10.02.금][추가!!!]
    #include  "comport.h"

    //[2012.03.11.일][추가!!!]
    #include "ide_buttons.h"

//}

__fastcall Tide_msg_Form::Tide_msg_Form(TComponent* Owner)
        : TForm(Owner)
{
  //[VAR]
  //{
      //[2009.10.02.금][추가!!!]
      int  color;

  //}

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

  //}

  //[초기화]
  //{
      this->Left   = ide_menu_Form->Left;

      //[2018.06.04.월][추가!!!]
      //[출력창] 초기 문자열 증가로 높이 +3 추가.
      //--------------------------------v
      this->Height = 12 * 10 + 16 + 4 + 3;
      
      this->Top    = main_Form->Height - this->Height - 3;
      this->Width  = main_Form->Width - (d_border_width * 2) + 2;
      this->Color  = clWhite;

  //}

  //[컨트롤 생성]
  //{
      //[캡션바]
      //{
          _captionbar_Form          = new Tgui_captionbar_Form(this);
          _captionbar_Form->Parent  = this;
          _captionbar_Form->Visible = true;

          //초기화.
          _captionbar_Form->_Caption("출력창");

      //}

      //[알림판]
      //{
          msg_msg_Form          = new Tmsg_msg_Form(this);
          msg_msg_Form->Parent  = this;
          msg_msg_Form->Visible = true;
          msg_msg_Form->SendToBack();
      //}

      //[탭]
      //{
          _tabs_Form          = new Tgui_tabs_Form(this);
          _tabs_Form->Parent  = this;
          _tabs_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              _tabs_Form->_Tabs(" 출력내용 \r\n 개발검증내용 ");
          //}

          //[EVENT 함수]
          //{
              _tabs_Form->_EVENT_TabSelected = _EVENT_TabSelect;

          //}

          //[2011.07.08.금][추가!!!]{------------------------------------------
          //[화살표] 를 항상 보여준다.
          //반드시 <_tabs_Form->_Width_Self()> 이전에 먼저 설정해 주어야 한다.
          _tabs_Form->_Arrow_Auto(false);
          //}------------------------------------------------------------------

          //이 tab 은 완전히 자신의 컨트롤 자체의 최소 크기를 갖는다.
          _tabs_Form->_Width_Self();

      //}

      //[페이지]
      //{
          _page_Form          = new Tgui_page_Form(this);
          _page_Form->Parent  = this;
          _page_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              _page_Form->_Top(_captionbar_Form->Top + _captionbar_Form->Height);
              _page_Form->_Left(this->Left + this->Width - _page_Form->Width - 4);
          //}

          //[EVENT 함수]
          //{
              _page_Form->_EVENT_ArrowUp   = _EVENT_PageUp;
              _page_Form->_EVENT_ArrowDown = _EVENT_PageDown;
          //}
      //}

      //[모서리 상자]
      //{
          _edgebox_Form          = new Tgui_edgebox_Form(this);
          _edgebox_Form->Parent  = this;
          _edgebox_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              _edgebox_Form->_Top(this->Height - _edgebox_Form->Height);
              _edgebox_Form->_Left(this->Left + this->Width - _edgebox_Form->Width - 4 + 1);
          //}
      //}

      //[수직스크롤바]
      //{
          _scroll_v_Form          = new Tgui_scroll_v_Form(this);
          _scroll_v_Form->Parent  = this;
          _scroll_v_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              _scroll_v_Form->_Left(this->Left + this->Width - _scroll_v_Form->Width - 4);
              _scroll_v_Form->_Top(_page_Form->Top + _page_Form->Height);
              _scroll_v_Form->_Height(this->Height - _scroll_v_Form->Top - _edgebox_Form->Height);
          //}

          //[환경변수설정]
          //{
              //처음에는 내용이 없다.
              _scroll_v_Form->_DesignSize(0);
              _scroll_v_Form->_Max(0);

              msg_msg_Form->_Scroll_Set();
          //}

          //[EVENT 함수]
          //{
              //event 시 호출될 함수를 등록한다.
              _scroll_v_Form->_EVENT_Scroll    = _EVENT_V_Scroll;
              _scroll_v_Form->_EVENT_MouseDown = _EVENT_V_MouseDown;
          //}
      //}

      //[수평스크롤바]
      //{
          _scroll_h_Form          = new Tgui_scroll_h_Form(this);
          _scroll_h_Form->Parent  = this;
          _scroll_h_Form->Visible = true;

          //[컨트롤 초기화]
          //{
              _scroll_h_Form->_Left(this->Left + _tabs_Form->Left + _tabs_Form->Width - 3);
              _scroll_h_Form->_Top(_edgebox_Form->Top);
              _scroll_h_Form->_Width(this->Width - _scroll_h_Form->Left - _edgebox_Form->Width);
          //}

          //[환경변수설정]
          //{
              _scroll_h_Form->_DesignSize(400/4);
              _scroll_h_Form->_Max(400);
          //}

          //[EVENT 함수]
          //{
              //event 시 호출될 함수를 등록한다.
              _scroll_h_Form->_EVENT_Scroll    = _EVENT_H_Scroll;
              //[2007.04.05.목][추가!!!]
              _scroll_h_Form->_EVENT_MouseDown = _EVENT_H_MouseDown;
          //}
      //}

      //[통신상태]
      //{
          //[2009.10.01.목][추가!!!]{--------------------------------------
          //[통신상태] 를 알수 있는 LED 를 <gui_radio_button> 으로 만든다.
          //[수신] 만 상태 LED 를 생성한다.
          //}--------------------------------------------------------------

          //버튼에 사용할 색을 지정한다(제목줄과 같은 색으로).
          BMP_Get_Bright_Color(_ide_option->color_0, IDE_BRIGHT_captionbar, &color);

          //[바탕판 만들기]
          //{
              //[!]{--------------------------------------
              //관련 부품을 관리할 바탕판을 만든다.
              //이는 배치와 관리를 쉽게 하기 위한 것이다.
              //}-----------------------------------------

              _comPortBase_Label          = new Tgui_Label_Form(this);
              _comPortBase_Label->Parent  = this;
              _comPortBase_Label->Visible = false;

              _comPortBase_Label->_Width(343);
              _comPortBase_Label->_Height(17);
              _comPortBase_Label->_FontXY(0, 0);
              _comPortBase_Label->_FontColor(_ide_option->color_0);
              _comPortBase_Label->_Caption("");
              _comPortBase_Label->_Border(true);

          //}

          //[통신포트 번호 선택 버튼]
          //{
              _comPortNum_Btn          = new Tgui_button_Form(this);
              _comPortNum_Btn->Parent  = _comPortBase_Label;
              _comPortNum_Btn->Visible = true;

              _comPortNum_Btn->_Width(100);
              _comPortNum_Btn->_Height(17);
              _comPortNum_Btn->_FontColor(_ide_option->color_0);
              _comPortNum_Btn->_BackColor(color);
              _comPortNum_Btn->_Caption_AutoPos(true);
              _comPortNum_Btn->_Caption("포트번호(004)");
              _comPortNum_Btn->_Caption_AutoPos(false);
              _comPortNum_Btn->_Caption_X(6);
              _comPortNum_Btn->_Caption_Y(3);

              _comPortNum_Btn->_EVENT_Click = _EVENT_Click_comPortNum_Btn;

              //[풍선 도움말 설정]
              //{
                  //[2009.10.02.금][추가!!!]
                  _comPortNum_Btn->_BalloonHelpUse(true);
                  _comPortNum_Btn->_BalloonHelpStr
                  ("문자열 수신용 통신포트의 [포트번호] 를 설정합니다.\r\n"
                   "버튼을 누르면 나오는 아래의 [한줄 편집기] 에서 값을 설정할수 있으며\r\n"
                   "설정값을 입력후 <Enter 키> 나 다시 버튼을 누르면 값이 즉시 반영됩니다.\r\n"
                   "[10진수] 만 사용 가능합니다."
                  );

              //}

          //}

          //[통신포트 전송율 선택 버튼]
          //{
              _comPortBaud_Btn          = new Tgui_button_Form(this);
              _comPortBaud_Btn->Parent  = _comPortBase_Label;
              _comPortBaud_Btn->Visible = true;

              _comPortBaud_Btn->_Width(80);
              _comPortBaud_Btn->_Height(17);
              _comPortBaud_Btn->_FontColor(_ide_option->color_0);
              _comPortBaud_Btn->_BackColor(color);
              _comPortBaud_Btn->_Caption("00115200");
              _comPortBaud_Btn->_Caption_AutoPos(false);
              _comPortBaud_Btn->_Caption_X(8);
              _comPortBaud_Btn->_Caption_Y(3);

              _comPortBaud_Btn->_EVENT_Click = _EVENT_Click_comPortBaud_Btn;

              //[풍선 도움말 설정]
              //{
                  //[2009.10.02.금][추가!!!]
                  _comPortBaud_Btn->_BalloonHelpUse(true);
                  _comPortBaud_Btn->_BalloonHelpStr
                  ("문자열 수신용 통신포트의 [전송율] 을 설정합니다.\r\n"
                   "버튼을 누르면 나오는 아래의 [한줄 편집기] 에서 값을 설정할수 있으며\r\n"
                   "설정값을 입력후 <Enter 키> 나 다시 버튼을 누르면 값이 즉시 반영됩니다.\r\n"
                   "[10진수] 만 사용 가능합니다."
                  );

              //}

          //}

          //[통신포트 열기/닫기 버튼]
          //{
              _comPortOpen_Btn          = new Tgui_button_Form(this);
              _comPortOpen_Btn->Parent  = _comPortBase_Label;
              _comPortOpen_Btn->Visible = true;

              _comPortOpen_Btn->_Width(50);
              _comPortOpen_Btn->_Height(17);
              _comPortOpen_Btn->_FontColor(_ide_option->color_0);
              _comPortOpen_Btn->_BackColor(color);
              _comPortOpen_Btn->_Caption("열기");
              _comPortOpen_Btn->_Caption_AutoPos(false);
              _comPortOpen_Btn->_Caption_X(12);
              _comPortOpen_Btn->_Caption_Y(3);

              _comPortOpen_Btn->_EVENT_Click = _EVENT_Click_comPortOpen_Btn;

              //[풍선 도움말 설정]
              //{
                  //[2009.10.02.금][추가!!!]
                  _comPortOpen_Btn->_BalloonHelpUse(true);
                  _comPortOpen_Btn->_BalloonHelpStr
                  ("문자열 수신용 통신포트를 [열기/닫기] 합니다.\r\n"
                   "통신포트가 이상없이 열린 경우는 해당 LED 가 점등합니다."
                  );

              //}

          //}

          //[통신포트열림/닫힘]
          //{
              _comPort_RadioBtn          = new Tgui_radio_button_Form(this);
              _comPort_RadioBtn->Parent  = _comPortBase_Label;
              _comPort_RadioBtn->Visible = true;
              //사용자가 눌러도 전환되지 않도록 무효화 한다.
              //그래도, 내부적으로는 다 접근 가능하다.
              _comPort_RadioBtn->Enabled = false;

              //[라벨 설정]
              //{
                  _comPort_Label          = new Tgui_Label_Form(this);
                  _comPort_Label->Parent  = _comPortBase_Label;
                  _comPort_Label->Visible = true;

                  _comPort_Label->_Width(12*4 + 2);
                  _comPort_Label->_Height(12);
                  _comPort_Label->_FontXY(0, 0);
                  _comPort_Label->_FontColor(_ide_option->color_0);
                  _comPort_Label->_Caption("통신포트");

              //}

          //}

          //[수신]
          //{
              _comRxd_RadioBtn          = new Tgui_radio_button_Form(this);
              _comRxd_RadioBtn->Parent  = _comPortBase_Label;
              _comRxd_RadioBtn->Visible = true;
              //사용자가 눌러도 전환되지 않도록 무효화 한다.
              //그래도, 내부적으로는 다 접근 가능하다.
              _comRxd_RadioBtn->Enabled = false;

              //[라벨 설정]
              //{
                  _comRxd_Label          = new Tgui_Label_Form(this);
                  _comRxd_Label->Parent  = _comPortBase_Label;
                  _comRxd_Label->Visible = true;

                  _comRxd_Label->_Width(12*2 + 2);
                  _comRxd_Label->_Height(12);
                  _comRxd_Label->_FontXY(0, 0);
                  _comRxd_Label->_FontColor(_ide_option->color_0);
                  _comRxd_Label->_Caption("수신");

              //}

          //}

      //}

      //가장 위에 배치시킨다.
      _edgebox_Form->BringToFront();

  //}

  //[설정정보 다시 읽어서 설정]
  //{
      //[2009.10.02.목][추가!!!]{----------------------------
      //통신포트 설정을 읽어서 해당 부품을 다시 설정해 준다.
      //}----------------------------------------------------

      _ComPort_OptionReload();

  //}

  //[통신포트 변수 초기화]
  //{
      //[2009.10.02.금][추가!!!]

      //[2011.08.21.일][주석처리!!!]
      //_comStr      = NULL;
      //_comStrIndex = 0;

  //}

  return;

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

void __fastcall Tide_msg_Form::WndProc(Messages::TMessage  &Message)
{
  //[2012.06.07.목][생성!!!]

  if(Message.Msg == WM_ERASEBKGND)
  {
    //[2012.06.07.목][추가!!!]{-----------------------------------
    //<ide_msg_Form> 의 경우는 보이는 부분이 없기 때문에 쓸데없이
    //바탕등이 그려지지 않도록 <WM_ERASEBKGND> 는 걸러낸다.
    //}-----------------------------------------------------------

    return;

  }

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

  //}

}

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

void __fastcall Tide_msg_Form::_Resize(void)
{
  //[2006.10.22.일][생성!!!]{--
  //컨트롤 크기를 조정한다.
  //}--------------------------

  //[크기조정]
  //{
      //IDE Form 에 맞게 크기를 조정한다.
      this->Top    = main_Form->Height - this->Height - 3;
      this->Width  = main_Form->Width - (d_border_width * 2) + 2;
  //}

  //[전체 그림 사용]
  //{
      //[2007.03.25.일][추가!!!]
      //전체그림사용 의 경우는 위치가 바뀌는 경우도 무조건 다시 그려야 배경그림
      //이 정확한 위치에 표시된다.
      if(IDE_BACKBMP_entire)
      {
        msg_msg_Form->_Resize();

      }

  //}

  //[통신관련 부품 위치]
  //{
      //[2009.10.02.금][추가!!!]{--------------------------------------------
      //실제 배치는 생성시에 하지 않고 이곳에서 수행한다.
      //이는 생성시에는 일부 배치가 제대로 되지 않는 부품들이 있기 때문이다.
      //}--------------------------------------------------------------------

      if(_comPortBase_Label != NULL)
      {
        _comPortBase_Label->_Top(0);
        _comPortBase_Label->_Left(_captionbar_Form->Width - _comPortBase_Label->Width);

      }

      if(_comPortNum_Btn != NULL)
      {
        _comPortNum_Btn->_Top(0);
        _comPortNum_Btn->_Left(0);

      }

      if(_comPortBaud_Btn != NULL)
      {
        _comPortBaud_Btn->_Top(0);
        _comPortBaud_Btn->_Left(_comPortNum_Btn->Left + _comPortNum_Btn->Width - 1);

      }

      if(_comPortOpen_Btn != NULL)
      {
        _comPortOpen_Btn->_Top(0);
        _comPortOpen_Btn->_Left(_comPortBaud_Btn->Left + _comPortBaud_Btn->Width - 1);

      }

      if(_comPort_RadioBtn != NULL)
      {
        _comPort_RadioBtn->_Top(3);
        _comPort_RadioBtn->_Left(_comPortOpen_Btn->Left + _comPortOpen_Btn->Width + 6);

      }

      if(_comPort_Label != NULL)
      {
        _comPort_Label->_Top(_comPort_RadioBtn->Top - 1);
        _comPort_Label->_Left(_comPort_RadioBtn->Left + _comPort_RadioBtn->Width);

      }

      if(_comRxd_RadioBtn != NULL)
      {
        _comRxd_RadioBtn->_Top(3);
        _comRxd_RadioBtn->_Left(_comPort_Label->Left + _comPort_Label->Width + 4);

      }

      if(_comRxd_Label != NULL)
      {
        _comRxd_Label->_Top(_comRxd_RadioBtn->Top - 1);
        _comRxd_Label->_Left(_comRxd_RadioBtn->Left + _comRxd_RadioBtn->Width);

      }
      
  //}

  return;

}

void __fastcall Tide_msg_Form::_Split_h(void)
{
  //[2006.10.24.화][생성!!!]{------
  //수평 spliter 동작시 크기 조정.
  //}------------------------------


  //[안전장치][2012.06.25.월][추가!!!]{---
  if(ide_hsplit_Form == NULL) return;
  //}-------------------------------------

  //[크기조정]
  //{
      //IDE Form 에 맞게 크기를 조정한다.
      this->Top    = ide_hsplit_Form->Top + ide_hsplit_Form->Height - 1;
      this->Height = main_Form->Height - this->Top - 3;

  //}

  return;

}

//[EVENT]-----------------------------------------------------------------------

void __fastcall Tide_msg_Form::FormResize(TObject *Sender)
{
  //[2006.10.26][생성!!!]{---------------------------
  //이 Form 안의 다른 컨트롤의 크기를 새로 조정한다.
  //}------------------------------------------------

  if(_captionbar_Form != NULL)
  {
    _captionbar_Form->_Resize();

  }

  if(msg_msg_Form != NULL)
  {
    msg_msg_Form->_Resize();

  }

  if(_tabs_Form != NULL)
  {
    _tabs_Form->_Top(this->Height - _tabs_Form->Height);

  }

  if(_page_Form != NULL)
  {
    _page_Form->_Top(_captionbar_Form->Top + _captionbar_Form->Height);
    _page_Form->_Left(this->Left + this->Width - _page_Form->Width - 4);

  }

  if(_edgebox_Form != NULL)
  {
    _edgebox_Form->_Top(this->Height - _edgebox_Form->Height);
    _edgebox_Form->_Left(this->Left + this->Width - _edgebox_Form->Width - 4 + 1);

  }

  if(_scroll_v_Form != NULL)
  {
    _scroll_v_Form->_Left(this->Left + this->Width - _scroll_v_Form->Width - 4);
    _scroll_v_Form->_Top(_page_Form->Top + _page_Form->Height);
    _scroll_v_Form->_Height(this->Height - _scroll_v_Form->Top - _edgebox_Form->Height);

    msg_msg_Form->_Scroll_Set();

  }

  if(_scroll_h_Form != NULL)
  {
    _scroll_h_Form->_Left(this->Left + _tabs_Form->Left + _tabs_Form->Width - 3);
    _scroll_h_Form->_Top(_edgebox_Form->Top);
    _scroll_h_Form->_Width(this->Width - _scroll_h_Form->Left - _edgebox_Form->Width);

  }

  return;

}

//[FUNCTION POINTER]------------------------------------------------------------

void __fastcall Tide_msg_Form::_EVENT_V_Scroll(void)
{
  //[2006.11.01.수][생성!!!]{-------------------------------------
  //[수직스크롤바] 의 이동시 처리를 수행한다.
  //이는 해당 [스크롤바] 의 _position 값이 바뀌었음을 의미하므로,
  //_position 의 변화에 따른 처리를 수행하면 된다.
  //}-------------------------------------------------------------

  //[포커스 주기]
  //{
      //[휠마우스] 를 사용하게 하기 위하여 반드시 포커스를 주어야 한다.
      //휠은 수직 스크롤바에만 적용한다.
      if(msg_msg_Form->Focused() != true)
      {
        //[2023.02.01.수][중요수정]{*************************************************
        //[검증] 시 <msg_msg_Form->_PrintAddXXX()> 계열 함수를 주로 사용하는데
        //이떼 아래 부분때문에 [촛점이동] 이 발생하여 [촛점] 을 갖는 [그림부품] 등의
        //제대로된 검증을 할수 없어, 이 촛점 설정 부분을 주석으로 처리한다.
        //
        //여기의 [촛점] 은 이 함수 아래 <_EVENT_V_MouseDown()> 에서만 처리하면 된다.
        //따라서 이 부분은 주석처리한다.
        //msg_msg_Form->SetFocus();
        //}**************************************************************************

      }

  //}

  //[스크롤 동기화]
  //{
      msg_msg_Form->_Text(msg_msg_Form->_text_index);
      
  //}

  return;

}

void __fastcall Tide_msg_Form::_EVENT_V_MouseDown(void)
{
  //[2006.11.28.화][생성!!!]{-------------------
  //[수직스크롤바] 의 click 시 처리를 수행한다.
  //}-------------------------------------------

  //[포커스 주기]
  //{ 
      //[휠마우스] 를 사용하게 하기 위하여 반드시 포커스를 주어야 한다.
      //휠은 수직 스크롤바에만 적용한다.
      if(msg_msg_Form->Focused() != true)
      {
        msg_msg_Form->SetFocus();

      }

  //}

  return;

}

void __fastcall Tide_msg_Form::_EVENT_H_Scroll(void)
{
  //[2006.11.01.수][생성!!!]{-------------------------------------
  //[수평스크롤바] 의 이동시 처리를 수행한다.
  //이는 해당 [스크롤바] 의 _position 값이 바뀌었음을 의미하므로,
  //_position 의 변화에 따른 처리를 수행하면 된다.
  //}-------------------------------------------------------------

  //[포커스 주기]
  //{
      //[휠마우스] 를 사용하게 하기 위하여 반드시 포커스를 주어야 한다.
      //휠은 수직 스크롤바에만 적용한다.
      if(msg_msg_Form->Focused() != true)
      {
        msg_msg_Form->SetFocus();

      }
      
  //}

  //[스크롤 동기화]
  //{
      msg_msg_Form->_Text(msg_msg_Form->_text_index);
      
  //}

  return;

}

void __fastcall Tide_msg_Form::_EVENT_H_MouseDown(void)
{
  //[2007.04.05.목][생성!!!]{-------------------
  //[수평스크롤바] 의 click 시 처리를 수행한다.
  //}-------------------------------------------

  //[포커스 주기]
  //{
      //[휠마우스] 를 사용하게 하기 위하여 반드시 포커스를 주어야 한다.
      //휠은 수직 스크롤바에만 적용한다.
      if(msg_msg_Form->Focused() != true)
      {
        msg_msg_Form->SetFocus();

      }
      
  //}

  return;

}

void __fastcall Tide_msg_Form::_EVENT_PageUp(void)
{
  //[VAR]
  //{
      int  position = _scroll_v_Form->_position;

  //}

  position -= ((msg_msg_Form->Height - _tabs_Form->Height) / msg_msg_Form->_line_height);

  _scroll_v_Form->_Position(position);

  //[스크롤 동기화]
  //{
      msg_msg_Form->_Text(msg_msg_Form->_text_index);
      
  //}

  return;

}

void __fastcall Tide_msg_Form::_EVENT_PageDown(void)
{

  //[VAR]
  //{
      int  position = _scroll_v_Form->_position;

  //}

  position += ((msg_msg_Form->Height - _tabs_Form->Height) / msg_msg_Form->_line_height);

  _scroll_v_Form->_Position(position);


  //[스크롤 동기화]
  //{
      msg_msg_Form->_Text(msg_msg_Form->_text_index);

  //}
  
  return;

}

void __fastcall Tide_msg_Form::_EVENT_TabSelect(void)
{
  //[2006.11.06.월][생성!!!]{----
  //탭이 선택된 경우를 처리한다.
  //}----------------------------

  //[현재 scroll 위치 저장]
  //{
      msg_msg_Form->_scroll_position[msg_msg_Form->_text_index] = _scroll_v_Form->_position;
      
  //}

  switch(_tabs_Form->_tabindex)
  {
    case 0 : //0번 탭 처리.
    {
      //출력내용.

      msg_msg_Form->_text_index = 0;

      //원래 scroll 위치를 기록한다.
      _scroll_v_Form->_position = msg_msg_Form->_scroll_position[msg_msg_Form->_text_index];

      msg_msg_Form->_Scroll_Set();

      msg_msg_Form->_Text(msg_msg_Form->_text_index);

      //[2009.10.02.금][추가!!!]{----------
      //통신관련 부품을 감춘다.
      _comPortBase_Label->Visible = false;
      //}----------------------------------

      //[2011.08.21.일][추가!!!]
      _captionbar_Form->_Caption("출력창");

    } break;

    case 1 : //1번 탭 처리.
    {
      //개발검증내용.

      msg_msg_Form->_text_index = 1;

      //원래 scroll 위치를 기록한다.
      _scroll_v_Form->_position = msg_msg_Form->_scroll_position[msg_msg_Form->_text_index];

      msg_msg_Form->_Scroll_Set();

      msg_msg_Form->_Text(msg_msg_Form->_text_index);

      //[2009.10.02.금][추가!!!]{------------------------------------------------------
      //통신관련 부품을 보여준다.
      //일단 보이지 않은 곳에서 보이게 만들어 내부 부품의 위치를 확정한뒤
      //_Resize() 함수로 다시 배치하여 제위치에 오게 만든다.
      //이는 내부 부품이 배치되는 모습을 보여주지 않아 보다 보기 좋게 하기 위한것이다.
      _comPortBase_Label->Left    = this->Width + 100;
      _comPortBase_Label->Visible = true;
      _Resize();
      //}------------------------------------------------------------------------------

      //[2011.08.21.일][추가!!!]
      _captionbar_Form->_Caption("검증출력창(검증문자열/통신수신문자열 출력)");

    } break;

  }
  
  return;

}

void __fastcall Tide_msg_Form::_EVENT_Click_comPortNum_Btn(void)
{
  //[2009.10.01.목][생성!!!]

  //[VAR]
  //{
      char   tempLineStr[OPT_wordStrSize];
      char   tempStr[OPT_wordStrSize];
      int    tempVal;

  //}

  //[현재 값 문자열 변환]
  //{
      CONV_LongVal_To_Str(_ide_option->port2_Num, 3, false, tempStr);

  //}

  //[현재 설정값을 보여주기]
  //{
      ide_msgbox_Form->_edit_Edit->_EDIT_TextOut(tempStr);

  //}

  if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
                                   "[통신포트 번호] 를 설정합니다.\r\n"
                                   "[10진수] 만 사용 가능하고 1 - 255 사이의 값만 사용 가능합니다.") == true)
  {
    //이 경우는 설정을 반영해 주어야 한다.

    //[10진수 인지 학인]
    //{
        if(STR_Is_Dec(ide_msgbox_Form->_edit_Edit->_editbuf) != true)
        {
          //10진수 문자열이 아닌 것이다.
          //오류 알림글은 STR_Is_Dec() 함수 내부적으로 자동 처리 된다.

          return;

        }

    //}

    //[문자열 => 값 으로 변환]
    //{
        CONV_DecStr_To_IntVal(ide_msgbox_Form->_edit_Edit->_editbuf, &tempVal);

    //}

    //[값 범위 확인]
    //{
        if((1 <= tempVal) && (tempVal <= 255))
        {
          //이상없는 값을 여기서 할당한다.
          _ide_option->port2_Num = tempVal;

        }
        else
        {
          //이전 설정값이 그대로 남아 있게 된다.
          ide_msgbox_Form->_MsgBox(d_MSGBOX_error,
                                   "1 - 255 사이의 값만 사용할수 있습니다.");

        }

    //}

    //[값 => 문자열로 변환]
    //{
        CONV_LongVal_To_Str(_ide_option->port2_Num, 3, false, tempStr);

    //}

    //[문자열 합성/표시]
    //{
        //버튼에 표시할 문자열을 합성한다.
        STR_Assign(tempLineStr, "포트번호(");
        STR_Add(tempLineStr, tempStr);
        STR_Add(tempLineStr, ")");

        _comPortNum_Btn->_Caption(tempLineStr);

    //}

    //[수정 반영]
    //{
        //설정값에 포트 번호를 기록한것 까지만 처리하면 된다.
        //실제는 [열기/닫기] 버튼으로 다시 열어 주므로 여기서는 더이상 할 것이 없다.

    //}

  }

  return;

}

void __fastcall Tide_msg_Form::_EVENT_Click_comPortBaud_Btn(void)
{
  //[2009.10.02.목][생성!!!]

  //[VAR]
  //{
      char   tempLineStr[OPT_wordStrSize];
      char   tempStr[OPT_wordStrSize];
      int    tempVal;

  //}

  //[현재 값 문자열 변환]
  //{
      CONV_LongVal_To_Str(_ide_option->port2_Baud, 8, false, tempStr);

  //}

  //[현재 설정값을 보여주기]
  //{
      ide_msgbox_Form->_edit_Edit->_EDIT_TextOut(tempStr);

  //}

  if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
                                   "[통신포트 전송율] 을 설정합니다.\r\n"
                                   "[10진수] 만 사용 가능하고 2400, 9600, 38400, 115200 등 \r\n"
                                   "사용할 [전송율] 을 입력하면 됩니다.") == true)
  {
    //이 경우는 설정을 반영해 주어야 한다.

    //[10진수 인지 학인]
    //{
        if(STR_Is_Dec(ide_msgbox_Form->_edit_Edit->_editbuf) != true)
        {
          //10진수 문자열이 아닌 것이다.
          //오류 알림글은 STR_Is_Dec() 함수 내부적으로 자동 처리 된다.

          return;

        }

    //}

    //[문자열 => 값 으로 변환]
    //{
        CONV_DecStr_To_IntVal(ide_msgbox_Form->_edit_Edit->_editbuf, &tempVal);

        //현재 전송율을 일단 설정정보에 저장한다.
        _ide_option->port2_Baud = tempVal;

    //}

    //[값 => 문자열로 변환]
    //{
        CONV_LongVal_To_Str(_ide_option->port2_Baud, 8, false, tempStr);

    //}

    //[문자열 합성/표시]
    //{
        //버튼에 표시할 문자열을 합성한다.
        STR_Assign(tempLineStr, tempStr);

        _comPortBaud_Btn->_Caption(tempLineStr);

    //}

    //[수정 반영]
    //{
        //설정값에 포트 번호를 기록한것 까지만 처리하면 된다.
        //실제는 [열기/닫기] 버튼으로 다시 열어 주므로 여기서는 더이상 할 것이 없다.

    //}

  }

  return;

}

void __fastcall Tide_msg_Form::_EVENT_Click_comPortOpen_Btn(void)
{
  //[2009.10.02.금][생성!!!]{-------------------------------------------
  //[2012.03.11.일][수정!!!]--------------------------------------------
  //[기본통신포트] 와 [출력창:개발검증내용:통신포트] 가 같은 통신포트를
  //사용중인 경우 배타적 속성을 적용.
  //이는 통신포트 전환을 보다 쉽게 하기 위한것.
  //}-------------------------------------------------------------------


  //[[맷돌직접연결:통신포트> 확인]
  //{
      //[2012.03.12.월][추가!!!]{-----------------------------------------------------
      //[출력창:개발검증내용:통신포트] 와 [맷돌직접연결:통신포트] 가 같은 번호인 경우
      //배타적인 [열기] 가 가능하도록 처리.
      //단, 둘다 [같은 통신포트 번호] 를 사용하고 있을 경우만 해당.
      //
      //[맷돌직접연결:통신포트] 가 열려있는 경우는 이를 먼저 강제로 닫아준다.
      //
      //전용 함수로 자동 처리.
      //}-----------------------------------------------------------------------------

      ide_buttons_Form->_VmosMdl_ExUnCheck();

  //}


  if(STR_Match(_comPortOpen_Btn->_caption, "열기"))
  {
    //[!]{------------------
    //통신 포트를 열어준다.
    //}---------------------

    //통신 포트를 열지 못한 경우는 [버튼] 의 문자열을 바꾸지 않고 바로 종료한다.
    if(Ide_Comport2_Open(_ide_option->port2_Num, _ide_option->port2_Baud) != true) return;

    //문자열을 바꿔준다.
    _comPortOpen_Btn->_Caption("닫기");

    //[통신타이머구동 시작]
    //{
        _ComDebugTimer_OnOff(true);

    //}

  }
  else
  {
    //[!]{------------------
    //통신 포트를 닫아준다.
    //}---------------------

    //통신포트를 닫지 못한 경우는 [버튼] 의 문자열을 바꾸지 않고 바로 종료한다.
    if(Ide_Comport2_Close() != true) return;

    //문자열을 바꿔준다.
    _comPortOpen_Btn->_Caption("열기");

    //[통신타이머구동 중지]
    //{
        _ComDebugTimer_OnOff(false);

    //}

  }

  return;

}

void __fastcall Tide_msg_Form::FormShow(TObject *Sender)
{
  //[2007.03.25.일][생성!!!]{-----------------------------------------------------
  //이 폼이 생성될때는 크기 정보가 확정되지 않으므로 여기서 한번 그려주어야 한다.
  //단, 이 경우는 [전체그림사용] 의 경우로 한정된다.
  //}-----------------------------------------------------------------------------

  if(IDE_BACKBMP_entire)
  {
    msg_msg_Form->_Shape();

  }

  //[다시 배치]
  //{
      //[2009.10.01.목][생성!!!]{------------------------------------------
      //일부 [부품] 은 초기 생성시에 제 위치를 갖지 못하는 문제가 있으므로
      //반드시 여기서 보일때 재위치에 있도록 위치조정 함수를 호출해 준다.
      //}------------------------------------------------------------------

      _Resize();

  //}

  return;

}

//------------------------------------------------------------------------------
//[LED 함수]--------------------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tide_msg_Form::_Led_Comport(bool  pTonFoff)
{
  //[2009.10.02.금][생성!!!]{------
  //[통신포트] LED 를 켜거나 끈다.
  //}------------------------------

  _comPort_RadioBtn->_Checked(pTonFoff);

  return;

}

void __fastcall Tide_msg_Form::_Led_Rxd(bool  pTonFoff)
{
  //[2009.10.02.목][생성!!!]{---
  //[수신] LED 를 켜거나 끈다.
  //}---------------------------

  _comRxd_RadioBtn->_Checked(pTonFoff);

  if(pTonFoff == true)
  {
    //이 경우는 해당 [타이머] 도 같이 켜준다.
    comRxd_Timer->Enabled = true;

  }

  return;

}

void __fastcall Tide_msg_Form::comRxd_TimerTimer(TObject *Sender)
{
  //[2009.10.02.금][생성!!!]

  //타이머 끄기.
  comRxd_Timer->Enabled = false;

  //LED 끄기.
  _comRxd_RadioBtn->_Checked(false);

  return;

}

void __fastcall Tide_msg_Form::_ComPort_OptionReload(void)
{
  //[2009.10.02.금][생성!!!]{----------------------------------
  //이미 설정된 포트, 전송율대로 다시 관련 부품을 설정해 준다.
  //}----------------------------------------------------------

  //[VAR]
  //{
      char   tempLineStr[OPT_wordStrSize];
      char   tempStr[OPT_wordStrSize];

  //}

  //[통신 포트 번호]
  //{
      //[값 => 문자열로 변환]
      CONV_LongVal_To_Str(_ide_option->port2_Num, 3, false, tempStr);

      //버튼에 표시할 문자열을 합성한다.
      STR_Assign(tempLineStr, "포트번호(");
      STR_Add(tempLineStr, tempStr);
      STR_Add(tempLineStr, ")");
      _comPortNum_Btn->_Caption(tempLineStr);

  //}

  //[통신 전송율]
  //{
      //[값 => 문자열로 변환]
      CONV_LongVal_To_Str(_ide_option->port2_Baud, 8, false, tempStr);

      STR_Assign(tempLineStr, tempStr);
      _comPortBaud_Btn->_Caption(tempLineStr);

  //}

}

void __fastcall Tide_msg_Form::_ComPort_ExClose(void)
{
  //[2012.03.11.일][생성!!!]{-----------------------------------------------------
  //<ide_buttons_Form->_EVENT_Click_vmosMdl_CheckBtn()> 에서 [검증용:통신포트] 를
  //[닫기] 하는 경우 사용하기 위하여 특별 제작.
  //
  //[2012.03.12.월][추가!!!]------------------------------------------------------
  //[통신포트 겹침] 도 여기서 직접 확인.
  //}-----------------------------------------------------------------------------

  //[통신포트가 겹치나?]
  //{
      //[2012.03.12.월][추가!!!]{------------------------
      //사용하는 포트가 다르다면 더이상 처리하지 않는다.
      //}------------------------------------------------

      if(_ide_option->portnumber != _ide_option->port2_Num) return;

  //}

  //[통신포트가 현재 열려있나?]
  //{
      //[2012.03.12.월][추가!!!]{-----------------------------
      //검증 문자열 수신용 통신포트가 열려있는 경우만 처리.
      //다음 처리부에서 자동으로 [열려있는 경우] 만 처리된다.
      //}-----------------------------------------------------

  //}

  if(STR_Match(_comPortOpen_Btn->_caption, "닫기"))
  {
    //[!]{------------
    //통신 포트 닫기.
    //}---------------

    //통신포트를 닫지 못한 경우는 [버튼] 의 문자열을 바꾸지 않고 바로 종료한다.
    if(Ide_Comport2_Close() != true) return;

    //문자열을 바꿔준다.
    _comPortOpen_Btn->_Caption("열기");

    //[통신타이머구동 중지]
    //{
        _ComDebugTimer_OnOff(false);

    //}

  }

}

//------------------------------------------------------------------------------
//[검증 문자열 타이머 관련]-----------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tide_msg_Form::_ComDebugTimer_OnOff(bool  pTonFoff)
{
  //[2009.10.02.금][생성!!!]{--------------------------
  //통신 타이머를 껼때 : 저장소등을 동적 생성해준다.
  //통신 타이머를 끌때 : 동적생성한 저장소를 삭제한다.
  //}--------------------------------------------------

  if(pTonFoff == true)
  {
    //[2011.08.21.일][주석처리!!!]
    //[개발검증 알림창] 과 대응하므로 [개발검증 알림창] 과 같은 크기로 생성한다.
    //_comStr = new unsigned char [OPT_DebugBufSize];
    //_comStrIndex = 0;

    comDebug_Timer->Enabled = true;

  }
  else
  {
    comDebug_Timer->Enabled = false;

    //[2011.08.21.일][주석처리!!!]
    //더이상 저장소가 필요 없으므로 삭제한다.
    //delete [] _comStr;
    //_comStr = NULL;
    //_comStrIndex = 0;

  }

  return;

}

void __fastcall Tide_msg_Form::comDebug_TimerTimer(TObject *Sender)
{
  //[2009.10.02.금][생성!!!]{------------------------------------------------------
  //정해진 시간 주기마다 수신된 내용을 [검증개발알림창] 에 표시해 준다.
  //문자열만을 대상으로 하고 문자열 뒤에 반드시 '\0' 까지 붙어서 전송된다고
  //가정하므로, '\0' 이 도착하면 모든 문자열 수신이 완료된 것으로 보고
  //문자열을 [개발검증 알림창] 에 출력해 준다.
  //
  //[2011.08.21.일][수정!!!]-------------------------------------------------------
  //이전과 달리, 1바이트씩만 처리하는 것이 아니라
  //
  //1) 수신된 것 전부를 대상으로 '\0' 이 있는 지 확인
  //
  //2) '\0' 이 있다면, 이 지점까지 저장소에 저장후(memmove() 사용) 문자열 출력.
  //
  //3) '\0' 이 없다면 현재 수신된 것을 일단 저장소에 저장(memmove() 사용) 만 한다.
  //}------------------------------------------------------------------------------

  //[VAR]
  //{
      class  COMPORT  *comPort;

      //수신된 바이트 수.
      int    rxCount;

      int    i, s;

  //}

  //[통신포트 위치 얻기]{----------------------
  COMPORT_GetPtr(d_ComportID_Debug, &comPort);
  //}------------------------------------------

  //[수신 개수 확인]
  //{
      rxCount = comPort->Get_RxCount();

  //}

  //수신된 것이 있는 경우만 처리한다.
  if(rxCount > 0)
  {
    //[!]{-------------------------------------------------------------------------
    //일단, 수신된 것을 바로 바로 출력한다.
    //강제적으로 [저장소] 에 복사후 뒤에 '\0' 을 붙여 출력해준다.
    //
    //[주의!!!]--------------------------------------------------------------------
    //{ 문자열0'\0'문자열1'\0'... } 의 형식인 경우도 있을수 있으므로
    //무조건 수신된 것을 출력하는 방식으로는 [문자열0] 만 출력되고 만다.
    //따라서, 현재 수신된 자료를 검사하여
    //
    //1) '\0' 이 있다면 이 것을 기준으로 문자열단위로 모두 출력하고
    //   마지막에 '\0' 을 붙여 출력해 준다.
    //
    //2) '\0' 이 하나도 없다면 맨 뒤에 '\0' 을 붙여 문자열로 마무리 하고 출력한다.
    //}----------------------------------------------------------------------------

    //[읽기]
    //{
        //[!]{-----------------------------------------------------------------
        //[통신포트] 에서 현재 수신된 것을 읽어들인다.
        //읽어들인 것은 [통신포트] 의 <comPort->_rxBuf> 임시저장소에 복사된다.
        //}--------------------------------------------------------------------

        comPort->Read(rxCount);

    //}

    for(i = 0, s = 0; i < rxCount; i++)
    {
      //일단, '\0' 가 있는지 찾는다.
      if(comPort->_rxBuf[i] == '\0')
      {
        //[!]{------------------------------------------------
        //'\0' 이 발견됐다면 일단 여기까지 문자열을 출력한다.
        //}---------------------------------------------------

        //[<출력창:검증> 에 출력]
        //{
            msg_msg_Form->_PrintAdd(d_msg_debug, (char *)(&(comPort->_rxBuf[s])));

        //}

        //[문자열 시작위치 지정]
        //{
            //다음 문자열 시작 위치를 기록한다.
            s = i + 1;

        //}

      }

    }

    //[!]{--------------------------------------------------------
    //여기까지 온것은 현재 [저장소] 안에는 '\0' 이 없다는 것이다.
    //}-----------------------------------------------------------

    //[문자열 완성]
    //{
        //[!]{-----------------------------------------------------
        //일단, 맨 뒤에 '\0' 을 붙여 문자열로 완성한다.
        //[한글] 등 2 바이트 체계는 문자가 깨질수 있으나 무시한다.
        //}--------------------------------------------------------

        comPort->_rxBuf[rxCount] = '\0';

    //}

    //[<출력창:검증> 에 출력]
    //{
        msg_msg_Form->_PrintAdd(d_msg_debug, (char *)(&(comPort->_rxBuf[s])));

    //}

  }

}

/*
void __fastcall Tide_msg_Form::comDebug_TimerTimer(TObject *Sender)
{
  //[2009.10.02.금][생성!!!]{---------------------------------------------------
  //정해진 시간 주기마다 수신된 내용을 [검증개발알림창] 에 표시해 준다.
  //문자열만을 대상으로 하고 문자열 뒤에 반드시 '\0' 까지 붙어서 전송된다고
  //가정하므로, '\0' 이 도착하면 모든 문자열 수신이 완료된 것으로 보고
  //문자열을 [개발검증 알림창] 에 출력해 준다.
  //
  //[2011.08.21.일][수정!!!]----------------------------------------------------
  //이전과 달리, 1바이트씩만 처리하는 것이 아니라
  //
  //1) 수신된 것 전부를 대상으로 '\0' 이 있는 지 확인
  //
  //2) '\0' 이 있다면, 이 지점까지 저장소에 저장후(memmove() 사용) 문자열 출력.
  //
  //3) '\0' 이 없다면 현재 수신된 것을 일단 저장소에 저장(memmove()) 만 한다.
  //}---------------------------------------------------------------------------

  //[VAR]
  //{
      class  COMPORT  *comPort;

  //}

  //[통신포트 위치 얻기]{----------------------
  COMPORT_GetPtr(d_ComportID_Debug, &comPort);
  //}------------------------------------------

  while(comPort->Read(1))
  {
    //[범위 검사]
    //{
        //[2009.11.29.일][중요추가!!!]{-----------------------------------------------------
        //계속 문자열만 오고 '\0' 이 오지 않는 경우는 용량을 넘어서서 심각한 오류가
        //발생하므로 이를 막기 위하여 범위를 넘으면 자동으로 처음부터 다시 저장되도록 한다.
        //}---------------------------------------------------------------------------------

        if(_comStrIndex >= OPT_DebugBufSize) { _comStrIndex = 0; }

    //}

    //일단 수신된 문자한개를 저장한다.
    _comStr[_comStrIndex++] = comPort->_rxBuf[0];

    //문자열을 완성한다.
    if(comPort->_rxBuf[0] == '\0')
    {
      //문자열 끝을 알리는 '\0' 이 수신되었으므로 현재 수집된 문자열을 출력한다.
      msg_msg_Form->_PrintAdd(d_msg_debug, _comStr);

      //문자열 수집을 위하여 다시 처음 저장위치로 돌려놓는다.
      _comStrIndex = 0;

    }

  }

  return;

}

*/
