

//[2009.11.24.화][생성!!!]{---------------------------
//<servoZero_DialogBox_Form> 을 가지고 새로 생성한다.
//}---------------------------------------------------


#include <vcl.h>
#pragma hdrstop

#include "gmrcbasic_DialogBox.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tgmrcbasic_DialogBox_Form *gmrcbasic_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"

//[2009.11.21.토][추가!!!]
#include "matdol.h"

//[2009.11.24.화][추가!!!]
#include "gmrcbasic-msg-sys.h"

//[2009.11.25.수][추가!!!]
//통신포트에 접근하기 위한것.
#include  "comport.h"

//[2009.11.25.수][추가!!!]
//맷돌과 통신하기 위한 것.
#include  "combus.h"

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

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

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

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

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

  }

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

  return;

}

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

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

      TRect       colorBoxTRect;
      int         w, h;

      int         i;

      //[2009.11.20.금][추가!!!]
      char        tempWord[OPT_wordStrSize];

  //}

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

  //}

  //[초기화]
  //{
      //--------------------------------------------------------------------------
      //크기는 표시되는 내용에 따라 자동으로 처리 되지만 일단 임의 값을 기록한다.
      this->Left     = 0;
      this->Top      = 0;
      this->Width    = 300;
      this->Height   = 302;//195;
      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, " G.M.RC.BASiC 설정 대화상자 ");

      //높이 지정.
      _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;

          //}

      //}

  //}

  //[내부 부품들]
  //{
      //[제어기 번호]
      //{
          //[라벨]
          //{
              _did_Label          = new Tgui_Label_Form(this);
              _did_Label->Parent  = this;
              _did_Label->Visible = true;

              _did_Label->_Width(185);
              _did_Label->_Left(8);
              _did_Label->_Top(28);
              _did_Label->_FontColor(_ide_option->color_0);
              _did_Label->_Caption("제어기 번호(0 - 63 사이값):");
              _did_Label->_Border(false);

              _did_Label->_FontStyle(d_FONTSTYLE_bold);

          //}

          //[번호]
          //{
              _did_Btn          = new Tgui_button_Form(this);
              _did_Btn->Parent  = this;
              _did_Btn->Visible = true;

              _did_Btn->_Top(_did_Label->Top - 1);
              _did_Btn->_Left(_did_Label->Left + _did_Label->Width + 2);
              _did_Btn->_Width(20);
              _did_Btn->_Height(16);
              //_did_Btn->_FontColor(_ide_option->color_0);
              _did_Btn->_Caption("00");

              _did_Btn->_EVENT_Click = _EVENT_Click_did_Btn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _did_Btn->_BalloonHelpUse(true);
                  _did_Btn->_BalloonHelpStr
                  ("G.M.RC.BASiC 의 [제어기 번호(DID)] 를 설정합니다.\r\n"
                   "버튼을 누르면 설정을 위한 대화상자가 나옵니다."
                  );

              //}

          //}

      //}

      //[서보 번호]
      //{
          for(i = 0; i < 8; i++)
          {
            //[라벨 설정]
            //{
                _sv_Label[i]          = new Tgui_Label_Form(this);
                _sv_Label[i]->Parent  = this;
                _sv_Label[i]->Visible = true;

                _sv_Label[i]->_Width(20);
                _sv_Label[i]->_Height(12);
                _sv_Label[i]->_Left(_did_Label->Left + 27*i);
                _sv_Label[i]->_Top(_did_Label->Top + _did_Label->Height + 4);
                _sv_Label[i]->_FontXY(0,0);
                _sv_Label[i]->_FontColor(_ide_option->color_0);

                //[PWM 번호 구하기]
                //{
                    STR_Assign(tempWord, "S");

                    CONV_LongVal_To_Str(i, 1, false, &(tempWord[1]));

                    _sv_Label[i]->_Caption(tempWord);

                //}

            //}

            //[라디오 버튼 ]
            //{
                _sv_RadioBtn[i]          = new Tgui_radio_button_Form(this);
                _sv_RadioBtn[i]->Parent  = this;
                _sv_RadioBtn[i]->Visible = true;

                _sv_RadioBtn[i]->_Left(_sv_Label[i]->Left + 4);
                _sv_RadioBtn[i]->_Top(_sv_Label[i]->Top + _sv_Label[i]->Height + 2);

                _sv_RadioBtn[i]->_EVENT_Down = _EVENT_Down_sv_RadioBtn;
                _sv_RadioBtn[i]->_EVENT_Click = _EVENT_Click_sv_RadioBtn;

            //}

            //[풍선 도움말 설정]
            //{
                //[2009.11.29.일][추가!!!]
                _sv_RadioBtn[i]->_BalloonHelpUse(true);
                _sv_RadioBtn[i]->_BalloonHelpStr
                ("설정 대상이 되는 [서보 번호] 를 선택합니다.\r\n"
                 "해당 서보를 선택하면 현재 설정된 값들이\r\n"
                 "대화상자의 해당 항목에  표시됩니다.\r\n"
                 "아무것도 선택되지 않은 상태에서는 기본적으로\r\n"
                 "[0번 서보] 가 선택된 것으로 인식합니다."
                );

            //}

          }

      //}

      //[PWM/AD]
      //{
          //[바탕 라벨]
          //{
              _base_Label          = new Tgui_Label_Form(this);
              _base_Label->Parent  = this;
              _base_Label->Visible = true;

              _base_Label->_Width(58);
              _base_Label->_Height(46);
              _base_Label->_Left(_did_Btn->Left + _did_Btn->Width + 12 + 6);
              _base_Label->_Top(_did_Btn-> Top);
              _base_Label->_Caption("");
              _base_Label->_Border(true);

          //}

          //[PWM 라벨]
          //{
              _pwm_Label          = new Tgui_Label_Form(this);
              _pwm_Label->Parent  = this;
              _pwm_Label->Visible = true;

              _pwm_Label->_Width(27);
              _pwm_Label->_Left(_base_Label->Left + 6);
              _pwm_Label->_Top(_base_Label->Top + 6);
              _pwm_Label->_FontColor(_ide_option->color_0);
              _pwm_Label->_Caption("PWM");
              _pwm_Label->_Border(false);

              _pwm_Label->_FontStyle(d_FONTSTYLE_bold);

          //}

          //[PWM 확인상자]
          //{
              _pwm_CheckBtn          = new Tgui_check_button_Form(this);
              _pwm_CheckBtn->Parent  = this;
              _pwm_CheckBtn->Visible = true;

              _pwm_CheckBtn->_Left(_pwm_Label->Left + _pwm_Label->Width + 5);
              _pwm_CheckBtn->_Top(_pwm_Label->Top + 2);
              _pwm_CheckBtn->_Checked(true);

              _pwm_CheckBtn->_EVENT_Click = _EVENT_Click_pwm_CheckBtn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _pwm_CheckBtn->_BalloonHelpUse(true);
                  _pwm_CheckBtn->_BalloonHelpStr
                  ("해당 서보의 PWM 출력을 [켜기/끄기] 합니다.\r\n"
                   "[v] 표시가 된 것은 현재 [켜기] 된 상태입니다.\r\n"
                   "이 속성은 제어기의 EEPROM 에 저장됩니다."
                  );

              //}

          //}

          //[AD 라벨]
          //{
              _ad_Label          = new Tgui_Label_Form(this);
              _ad_Label->Parent  = this;
              _ad_Label->Visible = true;

              _ad_Label->_Width(27);
              _ad_Label->_Left(_pwm_Label->Left);
              _ad_Label->_Top(_pwm_Label->Top + _pwm_Label->Height + 4);
              _ad_Label->_FontColor(_ide_option->color_0);
              _ad_Label->_Caption("A/D");
              _ad_Label->_Border(false);

              _ad_Label->_FontStyle(d_FONTSTYLE_bold);

          //}

          //[AD 확인상자]
          //{
              _ad_Btn          = new Tgui_button_Form(this);
              _ad_Btn->Parent  = this;
              _ad_Btn->Visible = true;

              _ad_Btn->_Top(_ad_Label->Top + 1);
              _ad_Btn->_Left(_ad_Label->Left + _ad_Label->Width + 4);
              _ad_Btn->_Width(13);
              _ad_Btn->_Height(13);
              //_ad_Btn->_FontColor(_ide_option->color_0);
              _ad_Btn->_Caption_AutoPos(false);
              _ad_Btn->_Caption_X(3);
              _ad_Btn->_Caption_Y(1);
              _ad_Btn->_Caption("A");

              _ad_Btn->_EVENT_Click = _EVENT_Click_ad_Btn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _ad_Btn->_BalloonHelpUse(true);
                  _ad_Btn->_BalloonHelpStr
                  ("해당 서보를 구동할 PWM 종류를 [아날로그/디지탈] 로 설정합니다.\r\n"
                   "[A](아날로그)/[D](디지탈서보) 로 설정된 상태입니다.\r\n"
                   "[아날로그] 서보는 PWM 이 계속 출력되지만 [디지탈] 서보는\r\n"
                   "[각도] 가 변경될 때만 PWM 이 출력됩니다.\r\n"
                   "[디지탈] 서보인 경우는 둘 중 아무것이나 사용해도 무관합니다.\r\n"
                   "이 속성은 제어기의 EEPROM 에 저장됩니다."
                  );

              //}

          //}

      //}

      //[줄이동자]
      //{
          //[시작값 라벨]
          //{
              _min_Label          = new Tgui_Label_Form(this);
              _min_Label->Parent  = this;
              _min_Label->Visible = true;

              _min_Label->_Width(9);
              _min_Label->_Left(_did_Label->Left);
              _min_Label->_Top(_sv_RadioBtn[0]->Top + _sv_RadioBtn[0]->Height + 10);
              _min_Label->_FontColor(_ide_option->color_0);
              _min_Label->_Caption("0");
              _min_Label->_Border(false);

          //}

          //[처리 중인 항목]
          //{
              _title_Label          = new Tgui_Label_Form(this);
              _title_Label->Parent  = this;
              _title_Label->Visible = true;

              _title_Label->_Width(118);
              _title_Label->_Left(_min_Label->Left + _min_Label->Width + 4);
              _title_Label->_Top(_min_Label->Top);
              _title_Label->_FontColor(_ide_option->color_0);
              _title_Label->_Caption("[각도]");
              _title_Label->_Border(false);

          //}

          //[줄이동자 값]
          //{
              _value_Btn          = new Tgui_button_Form(this);
              _value_Btn->Parent  = this;
              _value_Btn->Visible = true;

              _value_Btn->_Top(_min_Label->Top);
              _value_Btn->_Left(this->Width/2 - _value_Btn->Width/2);
              _value_Btn->_Width(36);
              _value_Btn->_Height(16);
              //_value_Btn->_FontColor(_ide_option->color_0);
              _value_Btn->_Caption("090");

              _value_Btn->_EVENT_Click = _EVENT_Click_value_Btn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _value_Btn->_BalloonHelpUse(true);
                  _value_Btn->_BalloonHelpStr
                  ("현재 [설정항목] 의 값을 줄이동자를 사용하지 않고 직접 설정합니다.\r\n"
                   "자체적으로 현재 값을 표시하는 기능도 겸하고 있으며, 누르면 나오는\r\n"
                   "대화상자에서 직접 값을 설정할수 있습니다.\r\n"
                   "단, 직접 서보에 바로 적용되는 값도 있으나 그렇지 않은 것도 있으며\r\n"
                   "반드시 해당 항목의 [설정 버튼] 을 눌러야만 제어기에 설정됩니다."
                  );

              //}

          //}

          //[끝값 라벨]
          //{
              _max_Label          = new Tgui_Label_Form(this);
              _max_Label->Parent  = this;
              _max_Label->Visible = true;

              _max_Label->_Width(27);
              _max_Label->_Left(this->Width - _value_Btn->Width);
              _max_Label->_Top(_min_Label->Top);
              _max_Label->_FontColor(_ide_option->color_0);
              _max_Label->_Caption("180");
              _max_Label->_Border(false);

          //}

          //[듀티값 줄이동자]
          //{
              //전체 설정을 수직으로 줄이동할 [수직 줄이동자] 를 배치한다.

              _value_ScrollH          = new Tgui_scroll_h_Form(this);
              _value_ScrollH->Parent  = this;
              _value_ScrollH->Visible = true;

              _value_ScrollH->_Left(8);
              _value_ScrollH->_Top(_value_Btn->Top + _value_Btn->Height + 2);
              _value_ScrollH->_Width(this->Width - 16);

              _value_ScrollH->_Min(0);
              _value_ScrollH->_Max(180);
              _value_ScrollH->_DesignSize(_value_ScrollH->_max/4);
              _value_ScrollH->_Position(90);

              //[EVENT 함수]
              //{
                  _value_ScrollH->_EVENT_Scroll = _EVENT_Scroll_value_ScrollH;

              //}

          //}

      //}

      //[항목]
      //{
          //[각도]
          //{
              //[라디오 버튼 ]
              //{
                  _itemDeg_RadioBtn          = new Tgui_radio_button_Form(this);
                  _itemDeg_RadioBtn->Parent  = this;
                  _itemDeg_RadioBtn->Visible = true;

                  _itemDeg_RadioBtn->_Left(_did_Label->Left);
                  _itemDeg_RadioBtn->_Top(_value_ScrollH->Top + _value_ScrollH->Height + 10);

                  //[각도] 가 처음에 선택된 것으로 만든다.
                  _itemDeg_RadioBtn->_Checked(true);

                  _itemDeg_RadioBtn->_EVENT_Click = _EVENT_Click_itemDeg_RadioBtn;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemDeg_RadioBtn->_BalloonHelpUse(true);
                      _itemDeg_RadioBtn->_BalloonHelpStr
                      ("줄이동자를 [각도] 설정으로 전환합니다.\r\n"
                       "자동으로 선택된 서보의 현재 [각도] 값을 읽어서 표시해 주며\r\n"
                       "줄이동자를 움직이면 해당 서보가 움직입니다."
                      );

                  //}

              //}

              //[항목이름]
              //{
                  _itemDeg_Label          = new Tgui_Label_Form(this);
                  _itemDeg_Label->Parent  = this;
                  _itemDeg_Label->Visible = true;

                  _itemDeg_Label->_Width(12*2 + 4);
                  _itemDeg_Label->_Left(_itemDeg_RadioBtn->Left + _itemDeg_RadioBtn->Width + 1);
                  _itemDeg_Label->_Top(_itemDeg_RadioBtn->Top - 1);
                  _itemDeg_Label->_FontColor(_ide_option->color_0);
                  _itemDeg_Label->_Caption("각도");
                  _itemDeg_Label->_Border(false);

              //}

          //}

          //[속도]
          //{
              //[라디오 버튼 ]
              //{
                  _itemSpd_RadioBtn          = new Tgui_radio_button_Form(this);
                  _itemSpd_RadioBtn->Parent  = this;
                  _itemSpd_RadioBtn->Visible = true;

                  _itemSpd_RadioBtn->_Left(_itemDeg_Label->Left + _itemDeg_Label->Width + 4);
                  _itemSpd_RadioBtn->_Top(_itemDeg_RadioBtn->Top);

                  _itemSpd_RadioBtn->_EVENT_Click = _EVENT_Click_itemSpd_RadioBtn;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemSpd_RadioBtn->_BalloonHelpUse(true);
                      _itemSpd_RadioBtn->_BalloonHelpStr
                      ("줄이동자를 [속도] 설정으로 전환합니다.\r\n"
                       "자동으로 선택된 서보의 현재 [속도] 값을 읽어서 표시해 주며\r\n"
                       "줄이동자를 움직여 [속도] 값을 조정할수 있습니다.\r\n"
                       "단, 이 값은 옆의 [속도] 버튼을 눌러야 제어기에 설정됩니다."
                      );

                  //}

              //}

              //[항목이름]
              //{
                  _itemSpd_Btn          = new Tgui_button_Form(this);
                  _itemSpd_Btn->Parent  = this;
                  _itemSpd_Btn->Visible = true;

                  _itemSpd_Btn->_Top(_itemSpd_RadioBtn->Top - 3);
                  _itemSpd_Btn->_Left(_itemSpd_RadioBtn->Left + _itemSpd_RadioBtn->Width + 3);
                  _itemSpd_Btn->_Width(12*2 + 4);
                  _itemSpd_Btn->_Height(17);
                  //_itemSpd_Btn->_FontColor(_ide_option->color_0);
                  _itemSpd_Btn->_Caption_AutoPos(false);
                  _itemSpd_Btn->_Caption_X(2);
                  _itemSpd_Btn->_Caption_Y(3);
                  _itemSpd_Btn->_Caption("속도");

                  _itemSpd_Btn->_EVENT_Click = _EVENT_Click_itemSpd_Btn;

                  //처음에는 무효화 상태.
                  _itemSpd_Btn->Enabled = false;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemSpd_Btn->_BalloonHelpUse(true);
                      _itemSpd_Btn->_BalloonHelpStr
                      ("줄이동자에 표시된 [속도] 값을 제어기에 설정합니다.\r\n"
                       "향후 서보는 이 [속도] 로 움직이게 됩니다."
                      );

                  //}

              //}

          //}

          //[주기]
          //{
              //[라디오 버튼 ]
              //{
                  _itemPrd_RadioBtn          = new Tgui_radio_button_Form(this);
                  _itemPrd_RadioBtn->Parent  = this;
                  _itemPrd_RadioBtn->Visible = true;

                  _itemPrd_RadioBtn->_Left(_itemSpd_Btn->Left + _itemSpd_Btn->Width + 7);
                  _itemPrd_RadioBtn->_Top(_itemDeg_RadioBtn->Top);

                  _itemPrd_RadioBtn->_EVENT_Click = _EVENT_Click_itemPrd_RadioBtn;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemPrd_RadioBtn->_BalloonHelpUse(true);
                      _itemPrd_RadioBtn->_BalloonHelpStr
                      ("줄이동자를 [주기] 설정으로 전환합니다.\r\n"
                       "자동으로 선택된 서보의 현재 [주기] 값을 읽어서 표시해 주며\r\n"
                       "줄이동자를 움직여 주기값을 조정할수 있습니다.\r\n"
                       "단, 이 값은 옆의 [주기] 버튼을 눌러야 제어기에 설정됩니다."
                      );

                  //}

              //}

              //[항목이름]
              //{
                  _itemPrd_Btn          = new Tgui_button_Form(this);
                  _itemPrd_Btn->Parent  = this;
                  _itemPrd_Btn->Visible = true;

                  _itemPrd_Btn->_Top(_itemPrd_RadioBtn->Top - 3);
                  _itemPrd_Btn->_Left(_itemPrd_RadioBtn->Left + _itemPrd_RadioBtn->Width + 3);
                  _itemPrd_Btn->_Width(12*2 + 4);
                  _itemPrd_Btn->_Height(17);
                  //_itemPrd_Btn->_FontColor(_ide_option->color_0);
                  _itemPrd_Btn->_Caption_AutoPos(false);
                  _itemPrd_Btn->_Caption_X(2);
                  _itemPrd_Btn->_Caption_Y(3);
                  _itemPrd_Btn->_Caption("주기");

                  _itemPrd_Btn->_EVENT_Click = _EVENT_Click_itemPrd_Btn;

                  //처음에는 무효화 상태.
                  _itemPrd_Btn->Enabled = false;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemPrd_Btn->_BalloonHelpUse(true);
                      _itemPrd_Btn->_BalloonHelpStr
                      ("줄이동자에 표시된 [주기] 값을 제어기에 설정합니다.\r\n"
                       "향후 제어기는 이 [주기] 의 PWM 을 출력하게 되며\r\n"
                       "이 값은 제어기의 EEPROM 에 저장됩니다."
                      );

                  //}

              //}

          //}

          //[영점0도]
          //{
              //[라디오 버튼 ]
              //{
                  _itemZero0_RadioBtn          = new Tgui_radio_button_Form(this);
                  _itemZero0_RadioBtn->Parent  = this;
                  _itemZero0_RadioBtn->Visible = true;

                  _itemZero0_RadioBtn->_Left(_itemPrd_Btn->Left + _itemPrd_Btn->Width + 7);
                  _itemZero0_RadioBtn->_Top(_itemDeg_RadioBtn->Top);

                  _itemZero0_RadioBtn->_EVENT_Click = _EVENT_Click_itemZero0_RadioBtn;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemZero0_RadioBtn->_BalloonHelpUse(true);
                      _itemZero0_RadioBtn->_BalloonHelpStr
                      ("줄이동자를 [영점 0도] 설정으로 전환합니다.\r\n"
                       "자동으로 선택된 서보의 현재 [영점 0도] 값을 읽어서 표시해 주며\r\n"
                       "줄이동자를 움직여 [영점 0도] 값을 조정할수 있습니다.\r\n"
                       "단, 이 값은 옆의 [영점0°] 버튼을 눌러야 제어기에 설정됩니다."
                      );

                  //}

              //}

              //[항목이름]
              //{
                  _itemZero0_Btn          = new Tgui_button_Form(this);
                  _itemZero0_Btn->Parent  = this;
                  _itemZero0_Btn->Visible = true;

                  _itemZero0_Btn->_Top(_itemZero0_RadioBtn->Top - 3);
                  _itemZero0_Btn->_Left(_itemZero0_RadioBtn->Left + _itemZero0_RadioBtn->Width + 3);
                  _itemZero0_Btn->_Width(12*2 + 9*2 + 2);
                  _itemZero0_Btn->_Height(17);
                  //_itemZero0_Btn->_FontColor(_ide_option->color_0);
                  _itemZero0_Btn->_Caption_AutoPos(false);
                  _itemZero0_Btn->_Caption_X(2);
                  _itemZero0_Btn->_Caption_Y(3);
                  _itemZero0_Btn->_Caption("영점0°");

                  _itemZero0_Btn->_EVENT_Click = _EVENT_Click_itemZero0_Btn;

                  //처음에는 무효화 상태.
                  _itemZero0_Btn->Enabled = false;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemZero0_Btn->_BalloonHelpUse(true);
                      _itemZero0_Btn->_BalloonHelpStr
                      ("줄이동자에 표시된 [영점0°] 값을 제어기에 설정합니다.\r\n"
                       "향후 제어기는 이 [영점0°] 가 반영되어 움직이게 되며\r\n"
                       "이 값은 제어기의 EEPROM 에 저장됩니다."
                      );

                  //}

              //}

          //}

          //[영점180도]
          //{
              //[라디오 버튼 ]
              //{
                  _itemZero180_RadioBtn          = new Tgui_radio_button_Form(this);
                  _itemZero180_RadioBtn->Parent  = this;
                  _itemZero180_RadioBtn->Visible = true;

                  _itemZero180_RadioBtn->_Left(_itemZero0_Btn->Left + _itemZero0_Btn->Width + 7);
                  _itemZero180_RadioBtn->_Top(_itemDeg_RadioBtn->Top);

                  _itemZero180_RadioBtn->_EVENT_Click = _EVENT_Click_itemZero180_RadioBtn;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemZero180_RadioBtn->_BalloonHelpUse(true);
                      _itemZero180_RadioBtn->_BalloonHelpStr
                      ("줄이동자를 [영점 180도] 설정으로 전환합니다.\r\n"
                       "자동으로 선택된 서보의 현재 [영점 180도] 값을 읽어서 표시해 주며\r\n"
                       "줄이동자를 움직여 [영점 180도] 값을 조정할수 있습니다.\r\n"
                       "단, 이 값은 옆의 [영점180°] 버튼을 눌러야 제어기에 설정됩니다."
                      );

                  //}

              //}

              //[항목이름]
              //{
                  _itemZero180_Btn          = new Tgui_button_Form(this);
                  _itemZero180_Btn->Parent  = this;
                  _itemZero180_Btn->Visible = true;

                  _itemZero180_Btn->_Top(_itemZero180_RadioBtn->Top - 3);
                  _itemZero180_Btn->_Left(_itemZero180_RadioBtn->Left + _itemZero180_RadioBtn->Width + 3);
                  _itemZero180_Btn->_Width(12*2 + 9*4 + 2);
                  _itemZero180_Btn->_Height(17);
                  //_itemZero180_Btn->_FontColor(_ide_option->color_0);
                  _itemZero180_Btn->_Caption_AutoPos(false);
                  _itemZero180_Btn->_Caption_X(2);
                  _itemZero180_Btn->_Caption_Y(3);
                  _itemZero180_Btn->_Caption("영점180°");

                  _itemZero180_Btn->_EVENT_Click = _EVENT_Click_itemZero180_Btn;

                  //처음에는 무효화 상태.
                  _itemZero180_Btn->Enabled = false;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _itemZero180_Btn->_BalloonHelpUse(true);
                      _itemZero180_Btn->_BalloonHelpStr
                      ("줄이동자에 표시된 [영점180°] 값을 제어기에 설정합니다.\r\n"
                       "향후 제어기는 이 [영점180°] 가 반영되어 움직이게 되며\r\n"
                       "이 값은 제어기의 EEPROM 에 저장됩니다."
                      );

                  //}

              //}

          //}

      //}

      //[제어기 제어]
      //{
          //[재기동]
          //{
              _cntReset_BmpBtn          = new Tgui_bmpbutton_Form(this);
              _cntReset_BmpBtn->Parent  = this;
              _cntReset_BmpBtn->Visible = true;

              //그림 할당하기.
              bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\button\\24_20\\reset.bmp";

              _cntReset_BmpBtn->_Top(_itemDeg_RadioBtn->Top + _itemDeg_RadioBtn->Height + 10);
              _cntReset_BmpBtn->_Left(8);
              _cntReset_BmpBtn->_Width(28);
              _cntReset_BmpBtn->_Height(20);
              _cntReset_BmpBtn->_Border(true);
              _cntReset_BmpBtn->_Bitmap(bmp_path);
              _cntReset_BmpBtn->_Image_Width(24);
              _cntReset_BmpBtn->_Image_Height(20);
              _cntReset_BmpBtn->_Image_X(2);

              //동작함수 등록.
              _cntReset_BmpBtn->_EVENT_Click = _EVENT_Click_cntReset_BmpBtn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _cntReset_BmpBtn->_BalloonHelpUse(true);
                  _cntReset_BmpBtn->_BalloonHelpStr
                  ("제어기를 [재기동] 시킵니다."
                  );

              //}

          //}

          //[PWM 출력 시작]
          //{
              _cntStart_BmpBtn          = new Tgui_bmpbutton_Form(this);
              _cntStart_BmpBtn->Parent  = this;
              _cntStart_BmpBtn->Visible = true;

              //그림 할당하기.
              bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\button\\24_20\\start.bmp";

              _cntStart_BmpBtn->_Top(_itemDeg_RadioBtn->Top + _itemDeg_RadioBtn->Height + 10);
              _cntStart_BmpBtn->_Left(_cntReset_BmpBtn->Left + _cntReset_BmpBtn->Width + 4);
              _cntStart_BmpBtn->_Width(28);
              _cntStart_BmpBtn->_Height(20);
              _cntStart_BmpBtn->_Border(true);
              _cntStart_BmpBtn->_Bitmap(bmp_path);
              _cntStart_BmpBtn->_Image_Width(24);
              _cntStart_BmpBtn->_Image_Height(20);
              _cntStart_BmpBtn->_Image_X(2);

              //동작함수 등록.
              _cntStart_BmpBtn->_EVENT_Click = _EVENT_Click_cntStart_BmpBtn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _cntStart_BmpBtn->_BalloonHelpUse(true);
                  _cntStart_BmpBtn->_BalloonHelpStr
                  ("제어기 자체 PWM 출력을 다시 시작 시킵니다."
                  );

              //}

          //}

          //[PWM 출력 중단]
          //{
              _cntStop_BmpBtn          = new Tgui_bmpbutton_Form(this);
              _cntStop_BmpBtn->Parent  = this;
              _cntStop_BmpBtn->Visible = true;

              //그림 할당하기.
              bmp_path = ExtractFilePath(Application->ExeName) + "sysbmp\\button\\24_20\\stop.bmp";

              _cntStop_BmpBtn->_Top(_itemDeg_RadioBtn->Top + _itemDeg_RadioBtn->Height + 10);
              _cntStop_BmpBtn->_Left(_cntStart_BmpBtn->Left + _cntStart_BmpBtn->Width + 4);
              _cntStop_BmpBtn->_Width(28);
              _cntStop_BmpBtn->_Height(20);
              _cntStop_BmpBtn->_Border(true);
              _cntStop_BmpBtn->_Bitmap(bmp_path);
              _cntStop_BmpBtn->_Image_Width(24);
              _cntStop_BmpBtn->_Image_Height(20);
              _cntStop_BmpBtn->_Image_X(2);

              //동작함수 등록.
              _cntStop_BmpBtn->_EVENT_Click = _EVENT_Click_cntStop_BmpBtn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _cntStop_BmpBtn->_BalloonHelpUse(true);
                  _cntStop_BmpBtn->_BalloonHelpStr
                  ("제어기 자체 PWM 출력을 일시 중지 시킵니다."
                  );

              //}

          //}

          //[시작값 고정]
          //{
              _cntFix_Btn          = new Tgui_button_Form(this);
              _cntFix_Btn->Parent  = this;
              _cntFix_Btn->Visible = true;

              _cntFix_Btn->_Top(_cntStop_BmpBtn->Top);
              _cntFix_Btn->_Left(_cntStop_BmpBtn->Left + _cntStop_BmpBtn->Width + 4);
              _cntFix_Btn->_Width(12*4 + 9 + 6);
              _cntFix_Btn->_Height(20);
              //_cntFix_Btn->_FontColor(_ide_option->color_0);
              _cntFix_Btn->_Caption_AutoPos(false);
              _cntFix_Btn->_Caption_X(2 + 2);
              _cntFix_Btn->_Caption_Y(5);
              _cntFix_Btn->_Caption("시작 고정");

              _cntFix_Btn->_EVENT_Click = _EVENT_Click_cntFix_Btn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _cntFix_Btn->_BalloonHelpUse(true);
                  _cntFix_Btn->_BalloonHelpStr
                  ("현재 제어기의 상태를 [제어기 초기상태] 로 기억 시킵니다.\r\n"
                   "[재기동] 시에 각 서보의 [각도], [속도] 가 지금 기억 상태로 시작되며\r\n"
                   "이 설정은 제어기의 EEPROM 에 저장됩니다."
                  );

              //}

          //}

          //[제어기 초기화]
          //{
              _cntFormat_Btn          = new Tgui_button_Form(this);
              _cntFormat_Btn->Parent  = this;
              _cntFormat_Btn->Visible = true;

              _cntFormat_Btn->_Top(_cntFix_Btn->Top);
              _cntFormat_Btn->_Left(_cntFix_Btn->Left + _cntFix_Btn->Width + 4);
              _cntFormat_Btn->_Width(12*8 + 9*2 + 6);
              _cntFormat_Btn->_Height(20);
              //_cntFormat_Btn->_FontColor(_ide_option->color_0);
              _cntFormat_Btn->_Caption_AutoPos(false);
              _cntFormat_Btn->_Caption_X(2 + 2);
              _cntFormat_Btn->_Caption_Y(5);
              _cntFormat_Btn->_Caption("제어기 완전 초기화");

              _cntFormat_Btn->_EVENT_Click = _EVENT_Click_cntFormat_Btn;

              //[풍선 도움말 설정]
              //{
                  //[2009.11.29.일][추가!!!]
                  _cntFormat_Btn->_BalloonHelpUse(true);
                  _cntFormat_Btn->_BalloonHelpStr
                  ("제어기를 [공장 초기화] 상태로 만들고 모든 기능을 완전히 초기화 합니다.\r\n"
                   "제어기 EEPROM 에 저장된 사용자의 모든 설정은 삭제되며, 제어기가\r\n"
                   "정상동작을 하지 않거나 제어기를 초기상태로 돌리고 싶을때 사용합니다."
                  );

              //}

          //}

      //}

      //[통신포트]
      //{
          //[바탕]
          //{
              _comBase_Label          = new Tgui_Label_Form(this);
              _comBase_Label->Parent  = this;
              _comBase_Label->Visible = true;

              _comBase_Label->_Left(8);
              _comBase_Label->_Top(_cntReset_BmpBtn->Top + _cntReset_BmpBtn->Height + 6);
              _comBase_Label->_Width(this->Width - 17);
              _comBase_Label->_Height(19);

              _comBase_Label->_FontColor(_ide_option->color_0);
              _comBase_Label->_Caption("");
              _comBase_Label->_Border(true);

          //}

          //[제목]
          //{
              _comText_Label          = new Tgui_Label_Form(this);
              _comText_Label->Parent  = this;
              _comText_Label->Visible = true;

              _comText_Label->_Width(12*13 + 9*3 + 4);
              _comText_Label->_Left(9);
              _comText_Label->_Top(_cntReset_BmpBtn->Top + _cntReset_BmpBtn->Height + 8);
              _comText_Label->_FontColor(_ide_option->color_0);
              _comText_Label->_Caption("제어기가 연결된 맷돌통신포트");
              _comText_Label->_Border(false);
              //_comText_Label->_FontStyle(d_FONTSTYLE_bold);

          //}

          //[COM0]
          //{
              //[라디오 버튼]
              //{
                  _com0_RadioBtn          = new Tgui_radio_button_Form(this);
                  _com0_RadioBtn->Parent  = this;
                  _com0_RadioBtn->Visible = true;

                  _com0_RadioBtn->_Left(_comText_Label->Left + _comText_Label->Width - 6);
                  _com0_RadioBtn->_Top(_comText_Label->Top + 2);
                  _com0_RadioBtn->_Checked(true);

                  _com0_RadioBtn->_EVENT_Click = _EVENT_Click_com0_RadioBtn;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _com0_RadioBtn->_BalloonHelpUse(true);
                      _com0_RadioBtn->_BalloonHelpStr
                      ("맷돌의 통신포트 COM0 를 사용하여 제어기와 통신합니다.\r\n"
                       "단, 이 경우는 제어기가 맷돌의 COM0 에 연결되 있어야 합니다."
                      );

                  //}

              //}

              //[제목]
              //{
                  _com0_Label          = new Tgui_Label_Form(this);
                  _com0_Label->Parent  = this;
                  _com0_Label->Visible = true;

                  _com0_Label->_Width(9*4);
                  _com0_Label->_Left(_com0_RadioBtn->Left + _com0_RadioBtn->Width + 2);
                  _com0_Label->_Top(_comText_Label->Top);
                  _com0_Label->_FontColor(_ide_option->color_0);
                  _com0_Label->_Caption("COM0");
                  _com0_Label->_Border(false);

              //}

          //}

          //[COM1]
          //{
              //[라디오 버튼]
              //{
                  _com1_RadioBtn          = new Tgui_radio_button_Form(this);
                  _com1_RadioBtn->Parent  = this;
                  _com1_RadioBtn->Visible = true;

                  _com1_RadioBtn->_Left(_com0_Label->Left + _com0_Label->Width + 2);
                  _com1_RadioBtn->_Top(_comText_Label->Top + 2);
                  _com1_RadioBtn->_Checked(false);

                  _com1_RadioBtn->_EVENT_Click = _EVENT_Click_com1_RadioBtn;

                  //[풍선 도움말 설정]
                  //{
                      //[2009.11.29.일][추가!!!]
                      _com1_RadioBtn->_BalloonHelpUse(true);
                      _com1_RadioBtn->_BalloonHelpStr
                      ("맷돌의 통신포트 COM1 를 사용하여 제어기와 통신합니다.\r\n"
                       "단, 이 경우는 제어기가 맷돌의 COM1 에 연결되 있어야 합니다."
                      );

                  //}

              //}

              //[제목]
              //{
                  _com1_Label          = new Tgui_Label_Form(this);
                  _com1_Label->Parent  = this;
                  _com1_Label->Visible = true;

                  _com1_Label->_Width(9*4);
                  _com1_Label->_Left(_com1_RadioBtn->Left + _com1_RadioBtn->Width + 2);
                  _com1_Label->_Top(_comText_Label->Top);
                  _com1_Label->_FontColor(_ide_option->color_0);
                  _com1_Label->_Caption("COM1");
                  _com1_Label->_Border(false);

              //}

          //}

      //}

      //[기능설명]
      //{
          _text_Label          = new Tgui_Label_Form(this);
          _text_Label->Parent  = this;
          _text_Label->Visible = true;

          _text_Label->_Left(_comText_Label->Left - 1);
          _text_Label->_Top(_comText_Label->Top + _comText_Label->Height + 6);

          _text_Label->_Width(this->Width - 17);
          _text_Label->_Height(this->Height - _text_Label->Top - 8);
          //_text_Label->_FontColor(_ide_option->color_0);
          _text_Label->_Border(false);
          _text_Label->_Caption
          ("맷돌 통신포트에 G.M.RC.BASiC 을 연결하고\r\n"
           "해당 설정을 맷돌을 통하여 수행할수 있습니다.\r\n"
           "설정할 제어기의 [제어기 번호], [서보 번호]\r\n"
           "를 먼저 설정해 주십시요.\r\n"
           "이 경우 맷돌은 [통신 중계기] 역활을 합니다.\r\n"
           "G.M.RC.BASiC 의 보다  자세한 설정은 전용\r\n"
           "통합개발환경을 사용하시면 됩니다.");

      //}

  //}

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

  //}

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

  //}

  return;

}

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

  //[VAR]
  //{
      int  i;

  //}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  for(i = 0; i < 8; i++)
  {
    if(_sv_Label[i] != NULL) { delete _sv_Label[i]; _sv_Label[i] = NULL; }

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

  }

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

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

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

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

}

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

void __fastcall Tgmrcbasic_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 Tgmrcbasic_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 Tgmrcbasic_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 Tgmrcbasic_DialogBox_Form::_Draw(void)
{
  BitBlt(this->Canvas->Handle, 0, 0,
         this->Width, this->Height,
         _bmp_->Canvas->Handle, 0, 0, SRCCOPY);

  return;

}

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

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

      this->Width  = pWidth;

  //}

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

  //}

  return;

}

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

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

      this->Height  = pHeight;

  //}

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

  //}

  return;

}

//------------------------------------------------------------------------------
//[대화상자 처리 관련 함수]-----------------------------------------------------
//------------------------------------------------------------------------------

unsigned char __fastcall Tgmrcbasic_DialogBox_Form::Dlg_Did(void)
{
  //[2009.11.28.토][생성!!!]{---------------------------
  //현재 문자열 형태의 [DID] 를 값으로 바꾸어 반환한다.
  //}---------------------------------------------------

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

  //}

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

  //}

  return(tempVal);

}

unsigned char __fastcall Tgmrcbasic_DialogBox_Form::Dlg_SvNum(void)
{
  //[2009.11.28.토][생성!!!]{---------------------------
  //현재 문자열 형태의 [DID] 를 값으로 바꾸어 반환한다.
  //}---------------------------------------------------

   //[VAR]
  //{
      int  i;

  //}

  //[모두 해제]
  //{
      for(i = 0; i < 8; i++)
      {
        if(_sv_RadioBtn[i]->_checked == true) return(i);

      }

  //}

  //아무것도 선택되지 않은 경우는 0 을 반환한다.
  return(0);

}

unsigned char __fastcall Tgmrcbasic_DialogBox_Form::Dlg_ComPortNum(void)
{
  //[2009.11.28.토][생성!!!]{-------------------------------
  //현재 맷돌 중계기에서 사용할 맷돌의 통신포트를 지정한다.
  //}-------------------------------------------------------


  if     (_com0_RadioBtn->_checked == true) return(0);
  else if(_com1_RadioBtn->_checked == true) return(1);

}

void __fastcall Tgmrcbasic_DialogBox_Form::Dlg_ValueBtn_Caption(int  pValue)
{
  //[2009.11.29.일][생성!!!]{------------------------------------------
  //<_value_Btn> 에 해당 값을 3자리 10진수 값으로 변환하여 표시해준다.
  //}------------------------------------------------------------------

  //[VAR]
  //{
      char  tempStr[256];

  //}

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

  //}

  //[표시]
  //{
      _value_Btn->_Caption(tempStr);

  //}

  return;

}

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

  this->Close();

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_did_Btn(void)
{
  //[2009.11.26.목][생성!!!]{---
  //[제어기번호] 를 설정한다.
  //
  //[2018.03.06.화][수정!!!]----
  //}---------------------------

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

  //}

  //[현재 설정값 보여주기]
  //{
      //현재 설정되 있는 값을 다시 대화상자에 표시해 준다.

      ide_msgbox_Form->_edit_Edit->_EDIT_TextOut(_did_Btn->_caption);

  //}

  //[wine 모달유사 지원][2018.03.06.화][추가!!!]{----------
  //if(_ide_option->wine == true) { this->Enabled = false; }
  //}------------------------------------------------------
  
  if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
                                   "제어기번호(DID)는 [10진수] 로 설정하고\r\n"
                                   "0 - 63 사이의 값을 가져야 합니다.") == true)
  {
    //이 경우는 설정을 반영해 주어야 한다.

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

          goto lbEnd;

        }

    //}

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

    //}

    //[값 범위 확인]
    //{
        if((0 <= tempVal) && (tempVal <= 63))
        {


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

          goto lbEnd;                         

        }

    //}

    //[값 => 문자열로 변환]
    //{
        CONV_LongVal_To_Str(tempVal, 2, false, tempStr);

    //}

    //[문자열 합성/표시]
    //{
        _did_Btn->_Caption(tempStr);

    //}

  }

  lbEnd:

  //[wine 모달유사 지원][2018.03.06.화][추가!!!]{---------
  //if(_ide_option->wine == true) { this->Enabled = true; }
  //}-----------------------------------------------------

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Down_sv_RadioBtn(void)
{
  //[2009.11.26.목][생성!!!]{------------------------------------------------
  //배타적인 속성을 가지므로 선택된 여기서는 일단 선택된 것을 모두 지워준다.
  //}------------------------------------------------------------------------

  //[VAR]
  //{
      int  i;

  //}

  //[모두 해제]
  //{
      for(i = 0; i < 8; i++) { _sv_RadioBtn[i]->_Checked(false); }

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_sv_RadioBtn(void)
{
  //[2009.11.26.목][생성!!!]{----------------------------------------------------
  //선택된 서보를 찾고, 선택된 서보의 현재 선택된 [항목] 에 해당하는 값을 읽어서
  //표시해주고, PWM, A/D 는 무조건 읽어서 설정해 주어야 한다.
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      char  tempStr[OPT_lineStrSize] = {""};

      int   i, svNum;

      DTU1  tempVal;

  //}

  //[선택된 것 찾기]
  //{
      //현재 어떤 것이 선택된 것인지 확인한다.
      for(i = 0; i < 8; i++)
      {
        if(_sv_RadioBtn[i]->_checked == true) { svNum = i; break; }

      }

  //}

  //[설정값 읽어서 표시]
  //{
      //[!]{-----------------------------------------------------
      //현재 선택된 서보의 해당 설정값을 읽어서 각각 표시해준다.
      //}--------------------------------------------------------

      //[PWM 설정값 표시]
      //{
          //[PWM ON/OFF] 설정값을 읽어서 표시한다.

          //값 읽어 들이기.
          if(GMRCBASiC_MSG_PwmRead(Dlg_Did(), &tempVal) != true) return;

          //해당 서보의 설정상태 설정.
          _pwm_CheckBtn->_Checked((tempVal >> Dlg_SvNum()) & 0x01);

      //}

      //[A/D 설정값 표시]
      //{
          //[A/D] 설정값을 읽어서 표시한다.

          //값 읽어 들이기.
          if(GMRCBASiC_MSG_AdRead(Dlg_Did(), &tempVal) != true) return;

          //해당 서보의 설정상태 설정.
          if((tempVal >> Dlg_SvNum()) & 0x01)
          {
            //1 인 경우는 [아날로그 서보] 설정이 된다.
            _ad_Btn->_BackColor(IDE_COLOR_2);
            _ad_Btn->_FontColor(IDE_COLOR_1);
            _ad_Btn->_Caption("A");

          }
          else
          {
            //0 인 경우는 [디지탈 서보] 설정이 된다.
            _ad_Btn->_BackColor(_ide_option->color_0);
            _ad_Btn->_FontColor(IDE_COLOR_3);
            _ad_Btn->_Caption("D");

          }

      //}

      //[항목 설정값 표시]
      //{
          //[!]{----------------------------------------------------------
          //각도/속도/주기/영점0도/영점180도 중 어떤 것이 선택된 상태인지
          //구분하여 해당 값을 읽어서 표시해준다.
          //}-------------------------------------------------------------

          if     (_itemDeg_RadioBtn->_checked == true)
          {
            //[각도] 를 읽어서 표시한다.

            //[2009.11.29.일][추가!!!]
            _EVENT_Click_itemDeg_RadioBtn();

          }
          else if(_itemSpd_RadioBtn->_checked == true)
          {
            //[속도] 를 읽어서 표시한다.

            //[2009.11.29.일][추가!!!]
            _EVENT_Click_itemSpd_RadioBtn();

          }
          else if( _itemPrd_RadioBtn->_checked == true)
          {
            //[주기] 를 읽어서 표시한다.

            //[2009.11.29.일][추가!!!]
            _EVENT_Click_itemPrd_RadioBtn();

          }
          else if(_itemZero0_RadioBtn->_checked == true)
          {
            //[영점0도] 를 읽어서 표시한다.

            //[2009.11.29.일][추가!!!]
            _EVENT_Click_itemZero0_RadioBtn();

          }
          else if(_itemZero180_RadioBtn->_checked == true)
          {
            //[영점180도] 를 읽어서 표시한다.

            //[2009.11.29.일][추가!!!]
            _EVENT_Click_itemZero180_RadioBtn();

          }

      //}

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_pwm_CheckBtn(void)
{
  //[2009.11.26.목][생성!!!]{--------------------------------------------------
  //현재 설정대로 다시 G.M.RC.BASiC 에 설정해 준다.
  //
  //[2009.11.29.일][수정!!!]---------------------------------------------------
  //PWM 설정값은 1바이트값의 각각의 비트가 각각의 서보에 대응하므로
  //일단 해당 설정 바이트를 읽어서 해당 비트를 처리후 다시 기록해 주어야 한다.
  //
  //1 : 해당 서보 PWM 켜기.
  //0 : 해당 서보 PWM 크기.
  //}--------------------------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.29.일][추가!!!]
      unsigned char  pwm;

  //}

  //[현재 설정값 읽기]
  //{
      //[2009.11.29.일][추가!!!]{------
      //먼저 해당 설정값을 읽어들인다.
      //}------------------------------

      if(GMRCBASiC_MSG_PwmRead(Dlg_Did(), &pwm) != true) return;

  //}

  if(_pwm_CheckBtn->_checked == true)
  {
    //해당 비트를 1로 만들어 PWM 을 켠다.

    //[비트 처리]
    //{
        pwm |= (1 << Dlg_SvNum());

    //}

    //[맷돌로 전송]
    //{
        //[2009.11.29.일][추가!!!]
        if(GMRCBASiC_MSG_PwmSet(Dlg_Did(), pwm) != true) return;

    //}

  }
  else
  {
    //해당 비트를 0으로 만들어 PWM 을 끈다.

    //[비트 처리]
    //{
        pwm &= (~(1 << Dlg_SvNum()));

    //}

    //[맷돌로 전송]
    //{
        //[2009.11.29.일][추가!!!]
        if(GMRCBASiC_MSG_PwmSet(Dlg_Did(), pwm) != true) return;

    //}

  }

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_ad_Btn(void)
{
  //[2009.11.26.목][생성!!!]{--------------------------------------------------
  //A/D 을 전환한다.
  //
  //[2009.11.29.일][수정!!!]---------------------------------------------------
  //A/D 설정값은 1바이트값의 각각의 비트가 각각의 서보에 대응하므로
  //일단 해당 설정 바이트를 읽어서 해당 비트를 처리후 다시 기록해 주어야 한다.
  //
  //1 : 해당 서보는 아날로그 설정.
  //0 : 해당 서보는 디지탈 설정.
  //}--------------------------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.29.일][추가!!!]
      unsigned char  ad;

  //}

  //[현재 설정값 읽기]
  //{
      //[2009.11.29.일][추가!!!]{------
      //먼저 해당 설정값을 읽어들인다.
      //}------------------------------

      if(GMRCBASiC_MSG_AdRead(Dlg_Did(), &ad) != true) return;

  //}

  if(STR_Match(_ad_Btn->_caption, "A") == true)
  {
    //해당 서보를 [디지탈] 로 설정한다.

    _ad_Btn->_BackColor(_ide_option->color_0);
    _ad_Btn->_FontColor(IDE_COLOR_3);
    _ad_Btn->_Caption("D");

    //[비트 처리]
    //{
        ad &= (~(1 << Dlg_SvNum()));

    //}

    //[맷돌로 전송]
    //{
        //[2009.11.29.일][추가!!!]
        if(GMRCBASiC_MSG_AdSet(Dlg_Did(), ad) != true) return;

    //}

  }
  else
  {
    //해당 서보를 [아날로그] 로 설정한다.

    _ad_Btn->_BackColor(IDE_COLOR_2);
    _ad_Btn->_FontColor(IDE_COLOR_1);
    _ad_Btn->_Caption("A");

    //[비트 처리]
    //{
        ad |= (1 << Dlg_SvNum());

    //}

    //[맷돌로 전송]
    //{
        //[2009.11.29.일][추가!!!]
        if(GMRCBASiC_MSG_AdSet(Dlg_Did(), ad) != true) return;

    //}

  }

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_value_Btn(void)
{
  //[2009.11.26.목][생성!!!]{--------------------------------------------------------------
  //줄이동자의 값을 설정한다.
  //줄이동자는 현재 선택된 [설정항목] 에 따라 다른 범위를 갖으므로 이를 구분하여 처리한다.
  //
  //[2018.03.06.화][수정!!!]---------------------------------------------------------------
  //}--------------------------------------------------------------------------------------

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

  //}

  //[현재 설정값 보여주기]{-----------------------------------------
  //현재 설정되 있는 값을 다시 대화상자에 표시해 준다.
  ide_msgbox_Form->_edit_Edit->_EDIT_TextOut(_value_Btn->_caption);
  //}---------------------------------------------------------------

  //[wine 모달유사 지원][2018.03.06.화][추가!!!]{----------
  //if(_ide_option->wine == true) { this->Enabled = false; }
  //}------------------------------------------------------

  //[항목 종류 구분]
  //{
      if     (_itemDeg_RadioBtn->_checked == true)
      {
        //[각도] 설정인 경우.

        if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
                                         "각도는 [10진수] 로 설정하고\r\n"
                                         "0 - 180 사이의 값을 가져야 합니다.") == true)
        {
          //[10진수 인가?]{-------------------------------------------------------
          if(STR_Is_Dec(ide_msgbox_Form->_edit_Edit->_editbuf) != true) goto lbEnd;
          //
          //[문자열 => 값 으로 변환]----------------------------------------------
          CONV_DecStr_To_IntVal(ide_msgbox_Form->_edit_Edit->_editbuf, &tempVal);
          //
          //[값 범위 확인]--------------------------------------------------------
          if(!((0 <= tempVal) && (tempVal <= 180)))
          {
            ide_msgbox_Form->_MsgBox(d_MSGBOX_error,
                                     "0 - 180 사이의 값만 사용할수 있습니다.");

            goto lbEnd;

          }
          //[값 => 문자열로 변환]-------------------------------------------------
          CONV_LongVal_To_Str(tempVal, 3, false, tempStr);
          //
          //[문자열 합성/표시]----------------------------------------------------
          _value_Btn->_Caption(tempStr);
          //}---------------------------------------------------------------------

          //[줄이동자 수정]
          //{
              _value_ScrollH->_Position(tempVal);

          //}

          //[맷돌 대상 처리]
          //{
              //무조건 [등속] 으로 기동시킨다-----------------v
              if(GMRCBASiC_MSG_DegSet(Dlg_Did(), Dlg_SvNum(), 1, _value_ScrollH->_position) != true) goto lbEnd;

          //}

        }

      }
      else if(_itemSpd_RadioBtn->_checked == true)
      {
        //[속도] 설정인 경우.

        if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
                                         "속도는 [10진수] 로 설정하고\r\n"
                                         "0 - 255 사이의 값을 가져야 합니다.") == true)
        {
          //[10진수 인가?]{-------------------------------------------------------
          if(STR_Is_Dec(ide_msgbox_Form->_edit_Edit->_editbuf) != true) goto lbEnd;
          //
          //[문자열 => 값 으로 변환]----------------------------------------------
          CONV_DecStr_To_IntVal(ide_msgbox_Form->_edit_Edit->_editbuf, &tempVal);
          //
          //[값 범위 확인]--------------------------------------------------------
          if(!((0 <= tempVal) && (tempVal <= 255)))
          {
            ide_msgbox_Form->_MsgBox(d_MSGBOX_error,
                                     "0 - 255 사이의 값만 사용할수 있습니다.");

            goto lbEnd;

          }
          //[값 => 문자열로 변환]-------------------------------------------------
          CONV_LongVal_To_Str(tempVal, 3, false, tempStr);
          //
          //[문자열 합성/표시]----------------------------------------------------
          _value_Btn->_Caption(tempStr);
          //}---------------------------------------------------------------------

          //[줄이동자 수정]
          //{
              _value_ScrollH->_Position(tempVal);

          //}

          //[맷돌 대상 처리]
          //{
              //[2009.11.29.일][추가!!!]
              //간단하게 설정까지 해당함수로 수행한다.
              //_EVENT_Click_itemSpd_Btn();

          //}

        }

      }
      else if( _itemPrd_RadioBtn->_checked == true)
      {
        //[주기] 설정인 경우.

        if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
                                         "주기는 [10진수] 로 설정하고\r\n"
                                         "0 - 30 사이의 값을 가져야 합니다.") == true)
        {
          //[10진수 인가?]{-------------------------------------------------------
          if(STR_Is_Dec(ide_msgbox_Form->_edit_Edit->_editbuf) != true) goto lbEnd;
          //
          //[문자열 => 값 으로 변환]----------------------------------------------
          CONV_DecStr_To_IntVal(ide_msgbox_Form->_edit_Edit->_editbuf, &tempVal);
          //
          //[값 범위 확인]--------------------------------------------------------
          if(!((0 <= tempVal) && (tempVal <= 30)))
          {
            ide_msgbox_Form->_MsgBox(d_MSGBOX_error,
                                     "0 - 30 사이의 값만 사용할수 있습니다.");

            goto lbEnd;

          }
          //[값 => 문자열로 변환]-------------------------------------------------
          CONV_LongVal_To_Str(tempVal, 3, false, tempStr);
          //
          //[문자열 합성/표시]----------------------------------------------------
          _value_Btn->_Caption(tempStr);
          //}---------------------------------------------------------------------

          //[줄이동자 수정]
          //{
              _value_ScrollH->_Position(tempVal);

          //}

          //[맷돌 대상 처리]
          //{
              //[2009.11.29.일][추가!!!]
              //간단하게 설정까지 해당함수로 수행한다.
              //_EVENT_Click_itemPrd_Btn();

          //}

        }

      }
      else if(_itemZero0_RadioBtn->_checked == true)
      {
        //[영점0도] 설정인 경우.

        if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
                                         "영점값은 [10진수] 로 설정하고\r\n"
                                         "0 - 500 사이의 값을 가져야 합니다.") == true)
        {
          //[10진수 인가?]{-------------------------------------------------------
          if(STR_Is_Dec(ide_msgbox_Form->_edit_Edit->_editbuf) != true) goto lbEnd;
          //
          //[문자열 => 값 으로 변환]----------------------------------------------
          CONV_DecStr_To_IntVal(ide_msgbox_Form->_edit_Edit->_editbuf, &tempVal);
          //
          //[값 범위 확인]--------------------------------------------------------
          if(!((0 <= tempVal) && (tempVal <= 500)))
          {
            ide_msgbox_Form->_MsgBox(d_MSGBOX_error,
                                     "0 - 500 사이의 값만 사용할수 있습니다.");

            goto lbEnd;

          }
          //[값 => 문자열로 변환]-------------------------------------------------
          CONV_LongVal_To_Str(tempVal, 3, false, tempStr);
          //
          //[문자열 합성/표시]----------------------------------------------------
          _value_Btn->_Caption(tempStr);
          //}---------------------------------------------------------------------

          //[줄이동자 수정]
          //{
              _value_ScrollH->_Position(tempVal);

          //}

          //[맷돌 대상 처리]
          //{
              //[2009.11.29.일][추가!!!]

              //무조건 [등속] 으로 기동시킨다------------------v
              if(GMRCBASiC_MSG_TickSet(Dlg_Did(), Dlg_SvNum(), 1, _value_ScrollH->_position) != true) goto lbEnd;

              //간단하게 설정까지 해당함수로 수행한다.
              //_EVENT_Click_itemZero0_Btn();

          //}

        }

      }
      else if(_itemZero180_RadioBtn->_checked == true)
      {
        //[영점180도] 설정인 경우.

        if(ide_msgbox_Form->_MsgBox_Edit(d_MSGBOX_default,
                                         "영점값은 [10진수] 로 설정하고\r\n"
                                         "0 - 500 사이의 값을 가져야 합니다.") == true)
        {
          //[10진수 인가?]{-------------------------------------------------------
          if(STR_Is_Dec(ide_msgbox_Form->_edit_Edit->_editbuf) != true) goto lbEnd;
          //
          //[문자열 => 값 으로 변환]----------------------------------------------
          CONV_DecStr_To_IntVal(ide_msgbox_Form->_edit_Edit->_editbuf, &tempVal);
          //
          //[값 범위 확인]--------------------------------------------------------
          if(!((0 <= tempVal) && (tempVal <= 500)))
          {
            ide_msgbox_Form->_MsgBox(d_MSGBOX_error,
                                     "0 - 500 사이의 값만 사용할수 있습니다.");

            goto lbEnd;

          }
          //[값 => 문자열로 변환]-------------------------------------------------
          CONV_LongVal_To_Str(tempVal, 3, false, tempStr);
          //
          //[문자열 합성/표시]----------------------------------------------------
          _value_Btn->_Caption(tempStr);
          //}---------------------------------------------------------------------

          //[줄이동자 수정]
          //{
              _value_ScrollH->_Position(tempVal);

          //}

          //[맷돌 대상 처리]
          //{
              //[2009.11.29.일][추가!!!]

              //무조건 [등속] 으로 기동시킨다------------------v
              if(GMRCBASiC_MSG_TickSet(Dlg_Did(), Dlg_SvNum(), 1, _value_ScrollH->_position) != true) goto lbEnd;

              //간단하게 설정까지 해당함수로 수행한다.
              //_EVENT_Click_itemZero180_Btn();

          //}

        }

      }

  //}

  lbEnd:

  //[wine 모달유사 지원][2018.03.06.화][추가!!!]{---------
  //if(_ide_option->wine == true) { this->Enabled = true; }
  //}-----------------------------------------------------

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Scroll_value_ScrollH(void)
{
  //[2009.11.26.목][생성!!!]{--------
  //줄이동자 이동시 처리를 수행한다.
  //}--------------------------------

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

  //[중복 확인]
  //{
      //현재 표시 문자열을 값으로 바꾼다.
      CONV_DecStr_To_IntVal(_value_Btn->_caption, &tempVal);

      //값에 변화가 없는 경우는 처리하지 않는다.
      if(_value_ScrollH->_position == tempVal) return;

  //}

  //[값 표시]
  //{
      //값을 문자열로 변환한다.
      CONV_LongVal_To_Str(_value_ScrollH->_position, 3, false, tempStr);

      _value_Btn->_Caption(tempStr);

  //}

  //[항목 종류 구분]
  //{
      if     (_itemDeg_RadioBtn->_checked == true)
      {
        //[각도] 설정인 경우.

        //현재 [각도] 를 바로 전송하여 G.M.RC.BASiC 을 동작 시킨다.

        //[맷돌로 전송]
        //{
            //무조건 [등속] 으로 기동시킨다-----------------v
            if(GMRCBASiC_MSG_DegSet(Dlg_Did(), Dlg_SvNum(), 1, _value_ScrollH->_position) != true) return;

        //}

      }
      else if(_itemSpd_RadioBtn->_checked == true)
      {
        //[속도] 설정인 경우.

        //현재 [속도] 값만 줄이동자 상에 만들어 놓기만 한다.
        //실제 여기서 처리할 것은 없다.

      }
      else if( _itemPrd_RadioBtn->_checked == true)
      {
        //[주기] 설정인 경우.

        //현재 [주기] 값만 줄이동자 상에 만들어 놓기만 한다.
        //실제 여기서 처리할 것은 없다.

      }
      else if(_itemZero0_RadioBtn->_checked == true)
      {
        //[영점0도] 설정인 경우.

        //현재 [듀티값] 을 바로 전송하여 G.M.RC.BASiC 을 동작 시킨다.

        //[맷돌로 전송]
        //{
            //무조건 [등속] 으로 기동시킨다------------------v
            if(GMRCBASiC_MSG_TickSet(Dlg_Did(), Dlg_SvNum(), 1, _value_ScrollH->_position) != true) return;

        //}

      }
      else if(_itemZero180_RadioBtn->_checked == true)
      {
        //[영점180도] 설정인 경우.

        //현재 [듀티값] 을 바로 전송하여 G.M.RC.BASiC 을 동작 시킨다.

        //[맷돌로 전송]
        //{
            //무조건 [등속] 으로 기동시킨다------------------v
            if(GMRCBASiC_MSG_TickSet(Dlg_Did(), Dlg_SvNum(), 1, _value_ScrollH->_position) != true) return;

        //}

      }

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemDeg_RadioBtn(void)
{
  //[2009.11.26.목][생성!!!]{--------------------------------------------
  //[각도] 항목이 선택된 경우를 처리한다.
  //
  //1) 줄이동자 제목 설정.
  //
  //2) [각도] 값 읽어 들여 해당값 저장.
  //   => 읽어들이다가 오류가 발생한 경우는 현재 선택을 해제한다.
  //      항목은 꼭 선택되 있을 필요는 없다.
  //      줄이동자 제목은 "[선택항목없음]" 으로 만든다.
  //
  //3) 줄이동자 범위 설정.
  //
  //4) 줄이동자 가운데에 값 표시.
  //   =>이 것을 먼저 처리하는 것은 다음에 줄이동자 설정시 이벤트 동작이
  //     수행되어 다시 설정되는 것을 막기 위한 것이다.
  //
  //5) 줄이동자 위치를 1) 에서 읽어 들인 값으로 설정한다.
  //}--------------------------------------------------------------------

  //[VAR]
  //{
      char  tempStr[OPT_wordStrSize];
      DTU1  val = 0;

  //}

  //[다른 선택 해제]
  //{
      _itemDeg_RadioBtn->_Checked(true);
      _itemSpd_RadioBtn->_Checked(false);
      _itemPrd_RadioBtn->_Checked(false);
      _itemZero0_RadioBtn->_Checked(false);
      _itemZero180_RadioBtn->_Checked(false);

      //다른 버튼 무효화.
      _itemSpd_Btn->Enabled     = false;
      _itemPrd_Btn->Enabled     = false;
      _itemZero0_Btn->Enabled   = false;
      _itemZero180_Btn->Enabled = false;

  //}

  //[제목설정]
  //{
      _title_Label->_Caption("[각도]");

  //}

  //[현재 값 읽기]
  //{
      //val = 현재값;
      if(GMRCBASiC_MSG_DegRead(Dlg_Did(), Dlg_SvNum(), &val) != true) return;

  //}

  //[줄이동자 범위 설정]
  //{
      _min_Label->_Caption("0");
      _max_Label->_Caption("180");

      _value_ScrollH->_Min(0);
      _value_ScrollH->_Max(180);
      _value_ScrollH->_DesignSize(_value_ScrollH->_max/4);

  //}

  //[값 표시]
  //{
      //값을 문자열로 변환한다.
      CONV_LongVal_To_Str(val, 3, false, tempStr);

      _value_Btn->_Caption(tempStr);

  //}

  //[현재 위치 설정]
  //{
      _value_ScrollH->_Position(val);

  //}
  
  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemSpd_RadioBtn(void)
{
  //[2009.11.26.목][생성!!!]{--------------------------------------------
  //[속도] 항목이 선택된 경우를 처리한다.
  //
  //1) 줄이동자 제목 설정.
  //
  //2) [속도] 값 읽어 들여 해당값 저장.
  //   => 읽어들이다가 오류가 발생한 경우는 현재 선택을 해제한다.
  //      항목은 꼭 선택되 있을 필요는 없다.
  //      줄이동자 제목은 "[선택항목없음]" 으로 만든다.
  //
  //3) 줄이동자 범위 설정.
  //
  //4) 줄이동자 가운데에 값 표시.
  //   =>이 것을 먼저 처리하는 것은 다음에 줄이동자 설정시 이벤트 동작이
  //     수행되어 다시 설정되는 것을 막기 위한 것이다.
  //
  //5) 줄이동자 위치를 1) 에서 읽어 들인 값으로 설정한다.
  //}--------------------------------------------------------------------

  //[VAR]
  //{
      char  tempStr[OPT_wordStrSize];
      DTU1  val = 0;

  //}

  //[다른 선택 해제]
  //{
      _itemDeg_RadioBtn->_Checked(false);
      _itemSpd_RadioBtn->_Checked(true);
      _itemPrd_RadioBtn->_Checked(false);
      _itemZero0_RadioBtn->_Checked(false);
      _itemZero180_RadioBtn->_Checked(false);

      //다른 버튼 무효화.
      _itemSpd_Btn->Enabled     = true;
      _itemPrd_Btn->Enabled     = false;
      _itemZero0_Btn->Enabled   = false;
      _itemZero180_Btn->Enabled = false;

  //}

  //[제목설정]
  //{
      _title_Label->_Caption("[속도]");

  //}

  //[현재 값 읽기]
  //{
      //val = 현재값;
      if(GMRCBASiC_MSG_SpdRead(Dlg_Did(), Dlg_SvNum(), &val) != true) return;

  //}

  //[줄이동자 범위 설정]
  //{
      _min_Label->_Caption("0");
      _max_Label->_Caption("255");

      _value_ScrollH->_Min(0);
      _value_ScrollH->_Max(255);
      _value_ScrollH->_DesignSize(_value_ScrollH->_max/4);

  //}

  //[값 표시]
  //{
      //값을 문자열로 변환한다.
      CONV_LongVal_To_Str(val, 3, false, tempStr);

      _value_Btn->_Caption(tempStr);

  //}

  //[현재 위치 설정]
  //{
      _value_ScrollH->_Position(val);

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemSpd_Btn(void)
{
  //[2009.11.26.목][생성!!!]{------------------
  //현재 [속도] 값을 G.M.RC.BASiC 에 설정한다.
  //}------------------------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.29.일][추가!!!]
      if(GMRCBASiC_MSG_SpdSet(Dlg_Did(), Dlg_SvNum(), _value_ScrollH->_position) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemPrd_RadioBtn(void)
{
  //[2009.11.26.목][생성!!!]{-------------------------------------------
  //[주기] 항목이 선택된 경우를 처리한다.
  //
  //1) 줄이동자 제목 설정.
  //
  //2) [주기] 값 읽어 들여 해당값 저장.
  //   => 읽어들이다가 오류가 발생한 경우는 현재 선택을 해제한다.
  //      항목은 꼭 선택되 있을 필요는 없다.
  //      줄이동자 제목은 "[선택항목없음]" 으로 만든다.
  //
  //3) 줄이동자 범위 설정.
  //
  //4) 줄이동자 가운데에 값 표시.
  //   =>이 것을 먼저 처리하는 것은 다음에 줄이동자 설정시 이벤트 동작이
  //     수행되어 다시 설정되는 것을 막기 위한 것이다.
  //
  //5) 줄이동자 위치를 1) 에서 읽어 들인 값으로 설정한다.
  //}--------------------------------------------------------------------

  //[VAR]
  //{
      char  tempStr[OPT_wordStrSize];
      DTU1  val = 0;

  //}

  //[다른 선택 해제]
  //{
      _itemDeg_RadioBtn->_Checked(false);
      _itemSpd_RadioBtn->_Checked(false);
      _itemPrd_RadioBtn->_Checked(true);
      _itemZero0_RadioBtn->_Checked(false);
      _itemZero180_RadioBtn->_Checked(false);

      //다른 버튼 무효화.
      _itemSpd_Btn->Enabled     = false;
      _itemPrd_Btn->Enabled     = true;
      _itemZero0_Btn->Enabled   = false;
      _itemZero180_Btn->Enabled = false;

  //}

  //[제목설정]
  //{
      _title_Label->_Caption("[주기]");

  //}

  //[현재 값 읽기]
  //{
      //val = 현재값;
      if(GMRCBASiC_MSG_PeriodRead(Dlg_Did(), &val) != true) return;

  //}

  //[줄이동자 범위 설정]
  //{
      _min_Label->_Caption("0");
      _max_Label->_Caption("030");

      _value_ScrollH->_Min(0);
      _value_ScrollH->_Max(30);
      _value_ScrollH->_DesignSize(_value_ScrollH->_max/4);

  //}

  //[값 표시]
  //{
      //값을 문자열로 변환한다.
      CONV_LongVal_To_Str(val, 3, false, tempStr);

      _value_Btn->_Caption(tempStr);

  //}

  //[현재 위치 설정]
  //{
      _value_ScrollH->_Position(val);

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemPrd_Btn(void)
{
  //[2009.11.26.목][생성!!!]{------------------
  //현재 [주기] 값을 G.M.RC.BASiC 에 설정한다.
  //}------------------------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.29.일][추가!!!]
      if(GMRCBASiC_MSG_PeriodSet(Dlg_Did(), _value_ScrollH->_position) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemZero0_RadioBtn(void)
{
  //[2009.11.26.목][생성!!!]{-------------------------------------------
  //[영점0도] 항목이 선택된 경우를 처리한다.
  //
  //1) 줄이동자 제목 설정.
  //
  //2) [영점0도] 값 읽어 들여 해당값 저장.
  //   => 읽어들이다가 오류가 발생한 경우는 현재 선택을 해제한다.
  //      항목은 꼭 선택되 있을 필요는 없다.
  //      줄이동자 제목은 "[선택항목없음]" 으로 만든다.
  //
  //3) 줄이동자 범위 설정.
  //
  //4) 줄이동자 가운데에 값 표시.
  //   =>이 것을 먼저 처리하는 것은 다음에 줄이동자 설정시 이벤트 동작이
  //     수행되어 다시 설정되는 것을 막기 위한 것이다.
  //
  //5) 줄이동자 위치를 1) 에서 읽어 들인 값으로 설정한다.
  //}--------------------------------------------------------------------

  //[VAR]
  //{
      char  tempStr[OPT_wordStrSize];
      DTU2  val = 0;

  //}

  //[다른 선택 해제]
  //{
      _itemDeg_RadioBtn->_Checked(false);
      _itemSpd_RadioBtn->_Checked(false);
      _itemPrd_RadioBtn->_Checked(false);
      _itemZero0_RadioBtn->_Checked(true);
      _itemZero180_RadioBtn->_Checked(false);

      //다른 버튼 무효화.
      _itemSpd_Btn->Enabled     = false;
      _itemPrd_Btn->Enabled     = false;
      _itemZero0_Btn->Enabled   = true;
      _itemZero180_Btn->Enabled = false;

  //}

  //[제목설정]
  //{
      _title_Label->_Caption("[영점0°]");

  //}
  //[현재 값 읽기]
  //{
      //val = 현재값;
      if(GMRCBASiC_MSG_Pos0TickRead(Dlg_Did(), Dlg_SvNum(), &val) != true) return;

  //}

  //[줄이동자 범위 설정]
  //{
      _min_Label->_Caption("0");
      _max_Label->_Caption("500");

      _value_ScrollH->_Min(0);
      _value_ScrollH->_Max(500);
      _value_ScrollH->_DesignSize(_value_ScrollH->_max/4);

  //}

  //[값 표시]
  //{
      //값을 문자열로 변환한다.
      CONV_LongVal_To_Str(val, 3, false, tempStr);

      _value_Btn->_Caption(tempStr);

  //}

  //[현재 위치 설정]
  //{
      _value_ScrollH->_Position(val);

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemZero0_Btn(void)
{
  //[2009.11.26.목][생성!!!]{------------------------------
  //현재 위치를 [영점0도] 위치로 G.M.RC.BASiC 에 설정한다.
  //}------------------------------------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.29.일][추가!!!]
      if(GMRCBASiC_MSG_Pos0TickSet(Dlg_Did(), Dlg_SvNum(), _value_ScrollH->_position) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemZero180_RadioBtn(void)
{
  //[2009.11.26.목][생성!!!]{-------------------------------------------
  //[영점180도] 항목이 선택된 경우를 처리한다.
  //
  //1) 줄이동자 제목 설정.
  //
  //2) [영점180도] 값 읽어 들여 해당값 저장.
  //   => 읽어들이다가 오류가 발생한 경우는 현재 선택을 해제한다.
  //      항목은 꼭 선택되 있을 필요는 없다.
  //      줄이동자 제목은 "[선택항목없음]" 으로 만든다.
  //
  //3) 줄이동자 범위 설정.
  //
  //4) 줄이동자 가운데에 값 표시.
  //   =>이 것을 먼저 처리하는 것은 다음에 줄이동자 설정시 이벤트 동작이
  //     수행되어 다시 설정되는 것을 막기 위한 것이다.
  //
  //5) 줄이동자 위치를 1) 에서 읽어 들인 값으로 설정한다.
  //}--------------------------------------------------------------------

  //[VAR]
  //{
      char  tempStr[OPT_wordStrSize];
      DTU2  val = 0;

  //}

  //[다른 선택 해제]
  //{
      _itemDeg_RadioBtn->_Checked(false);
      _itemSpd_RadioBtn->_Checked(false);
      _itemPrd_RadioBtn->_Checked(false);
      _itemZero0_RadioBtn->_Checked(false);
      _itemZero180_RadioBtn->_Checked(true);

      //다른 버튼 무효화.
      _itemSpd_Btn->Enabled     = false;
      _itemPrd_Btn->Enabled     = false;
      _itemZero0_Btn->Enabled   = false;
      _itemZero180_Btn->Enabled = true;

  //}

  //[제목설정]
  //{
      _title_Label->_Caption("[영점180°]");

  //}

  //[현재 값 읽기]
  //{
      //val = 현재값;
      if(GMRCBASiC_MSG_Pos180TickRead(Dlg_Did(), Dlg_SvNum(), &val) != true) return;

  //}

  //[줄이동자 범위 설정]
  //{
      _min_Label->_Caption("0");
      _max_Label->_Caption("500");

      _value_ScrollH->_Min(0);
      _value_ScrollH->_Max(500);
      _value_ScrollH->_DesignSize(_value_ScrollH->_max/4);

  //}

  //[값 표시]
  //{
      //값을 문자열로 변환한다.
      CONV_LongVal_To_Str(val, 3, false, tempStr);

      _value_Btn->_Caption(tempStr);

  //}

  //[현재 위치 설정]
  //{
      _value_ScrollH->_Position(val);

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_itemZero180_Btn(void)
{
  //[2009.11.26.목][생성!!!]{--------------------------------
  //현재 위치를 [영점180도] 위치로 G.M.RC.BASiC 에 설정한다.
  //}--------------------------------------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.29.일][추가!!!]
      if(GMRCBASiC_MSG_Pos180TickSet(Dlg_Did(), Dlg_SvNum(), _value_ScrollH->_position) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_cntReset_BmpBtn(void)
{
  //[2009.11.26.목][생성!!!]{---
  //제어기를 재기동 한다.
  //}---------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.28.토][추가!!!]
      if(GMRCBASiC_MSG_CtrlReset(Dlg_Did()) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_cntStart_BmpBtn(void)
{
  //[2009.11.26.목][생성!!!]{----------
  //제어기의 PWM 출력을 다시 재개한다.
  //}----------------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.28.토][추가!!!]
      if(GMRCBASiC_MSG_PwmStart(Dlg_Did()) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_cntStop_BmpBtn(void)
{
  //[2009.11.26.목][생성!!!]{-------
  //제어기의 PWM 출력을 정지시킨다.
  //}-------------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.28.토][추가!!!]
      if(GMRCBASiC_MSG_PwmStop(Dlg_Did()) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_cntFix_Btn(void)
{
  //[2009.11.26.목][생성!!!]{--------------------------
  //현재 제어기의 설정상태를 [시작상태] 로 고정시킨다.
  //}--------------------------------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.28.토][추가!!!]
      if(GMRCBASiC_MSG_Save(Dlg_Did()) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_cntFormat_Btn(void)
{
  //[2009.11.26.목][생성!!!]{-----------
  //현재 제어기를 [완전 초기화] 시킨다.
  //}-----------------------------------

  //[맷돌로 전송]
  //{
      //[2009.11.28.토][추가!!!]
      if(GMRCBASiC_MSG_EepromInit(Dlg_Did()) != true) return;

  //}

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_com0_RadioBtn(void)
{
  //[2009.11.27.금][생성!!!]

  _com0_RadioBtn->_Checked(true);
  _com1_RadioBtn->_Checked(false);

  return;

}

void __fastcall Tgmrcbasic_DialogBox_Form::_EVENT_Click_com1_RadioBtn(void)
{
  //[2009.11.27.금][생성!!!]

  _com0_RadioBtn->_Checked(false);
  _com1_RadioBtn->_Checked(true);

  return;

}

//------------------------------------------------------------------------------
//[BCB 자체 동작함수]-----------------------------------------------------------
//------------------------------------------------------------------------------

void __fastcall Tgmrcbasic_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 Tgmrcbasic_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 Tgmrcbasic_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 Tgmrcbasic_DialogBox_Form::FormShow(TObject *Sender)
{
  //[2009.05.08.금][생성!!!]{---------
  //[찾을 문자열] 에 촛점을 맞춰준다.
  //}---------------------------------


  return;

}

//------------------------------------------------------------------------------
//[G.M.RC.BASiC 제어용]---------------------------------------------------------
//------------------------------------------------------------------------------

bool __fastcall Tgmrcbasic_DialogBox_Form::Mtdl_VarAdrTable_Read(void)
{
  //[2009.11.27.금][생성!!!]{---------------------------------------------
  //[맷돌] 에 설치된 가상기계의 중요 [변수주소목록] 을 읽어들여 각 변수의
  //[VMOS:절대주소] 를 읽어 들여 해당 변수에 할당한다.
  //}---------------------------------------------------------------------

  //[@DATA 읽기]
  //{
      //전역변수 시작위치인 @DATA 를 읽어 들인다.

      //8Byte 수신-------------------------v
      if(ComBus_Read(d_CB_TS_S, d_CB_AK_B, 3, d_Map_Vmos_RegDATA, (DTU1 *)(&_regDATA)) != true) return(false);

  //}

  //[<포트번호> 변수 VMOS:절대주소 읽기]------------------------------------------------------------------------------
  //[@DATA + 8*0] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*0, (DTU1 *)(&_tableComPortNum_1)) != true) return(false);
  //
  //[<이벤트발생수신개수설정요청> 변수 VMOS:절대주소 읽기]------------------------------------------------------------
  //[@DATA + 8*1] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*1, (DTU1 *)(&_tableEventRxCountExe_1)) != true) return(false);
  //
  //[<이벤트발생수신개수> 변수 VMOS:절대주소 읽기]--------------------------------------------------------------------
  //[@DATA + 8*2] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*2, (DTU1 *)(&_tableEventRxCount_2)) != true) return(false);
  //
  //[<전송처리요청> 변수 VMOS:절대주소 읽기]--------------------------------------------------------------------------
  //[@DATA + 8*3] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*3, (DTU1 *)(&_tableTxExe_1)) != true) return(false);
  //
  //[<전송크기> 변수 VMOS:절대주소 읽기]------------------------------------------------------------------------------
  //[@DATA + 8*4] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*4, (DTU1 *)(&_tableTxSize_2)) != true) return(false);
  //
  //[<전송저장소> 변수 VMOS:절대주소 읽기]----------------------------------------------------------------------------
  //[@DATA + 8*5] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*5, (DTU1 *)(&_tableTxBuf_x)) != true) return(false);
  //
  //[<수신처리요청> 변수 VMOS:절대주소 읽기]--------------------------------------------------------------------------
  //[@DATA + 8*6] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*6, (DTU1 *)(&_tableRxExe_1)) != true) return(false);
  //
  //[<수신크기> 변수 VMOS:절대주소 읽기]------------------------------------------------------------------------------
  //[@DATA + 8*7] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*7, (DTU1 *)(&_tableRxSize_2)) != true) return(false);
  //
  //[<수신저장소> 변수 VMOS:절대주소 읽기]----------------------------------------------------------------------------
  //[@DATA + 8*8] 위치.
  if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 3, _regDATA + 8*8, (DTU1 *)(&_tableRxBuf_x)) != true) return(false);
  //}-----------------------------------------------------------------------------------------------------------------

  //여기까지 현재 맷돌에 설치된 <gmrcbasic_set.gprj> 안의 필요한 전역변수 주소 목록을 얻었다.

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::Mtdl_ComPortNum_Set(unsigned char  pComPortNum)
{
  //[2009.11.28.토][생성!!!]{---------------------------------------------------
  //연결된 맷돌에 설치된 통신중계기가 사용할 통신포트를 선택한다.
  //이는 해당 변수에 바로 기록하는 것으로 <처리요청> 이나 <확인> 이 불칠요하다.
  //}---------------------------------------------------------------------------

  //[기록]
  //{
      //[직렬버스:V] 를 사용하여 해당 변수에 직접 기록한다.
      //1 바이트 크기-----------------------v
      if(ComBus_Write(d_CB_TS_S, d_CB_AK_V, 0, _tableComPortNum_1, (DTU1 *)(&pComPortNum)) != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::Mtdl_EventRxCount_Set(unsigned short  pEventRxCount)
{
  //[2009.11.28.토][생성!!!]{--------------------------------------------------------------------
  //연결된 맷돌에 설치된 통신중계기의 [수신이벤트발생개수] 를 설정하고 [처리요청] 까지 수행한다.
  //<처리요청> 후에는 반드시 맷돌이 완전히 처리했다는 <확인> 을 수신해야 한다.
  //}--------------------------------------------------------------------------------------------

  //[VAR]
  //{
      unsigned char  temp = true;

  //}

  //[기록]
  //{
      //[직렬버스:V] 를 사용하여 해당 변수에 직접 기록한다.
      //2 바이트 크기-----------------------v
      if(ComBus_Write(d_CB_TS_S, d_CB_AK_V, 1, _tableEventRxCount_2, (DTU1 *)(&pEventRxCount)) != true) return(false);

  //}

  //[처리요청]
  //{
      //[직렬버스:V] 를 사용하여 해당 변수에 직접 기록한다.
      //1 바이트 크기-----------------------v
      if(ComBus_Write(d_CB_TS_S, d_CB_AK_V, 0, _tableEventRxCountExe_1, (DTU1 *)(&temp)) != true) return(false);

  //}

  //[<ACK> 확인]
  //{
      if(ComBus_TimeOut_FwByte(d_CBFW_ACK, 3000) != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::Mtdl_Txd(//전송할 자료.
                                                    unsigned char   *pStream,
                                                    //실제 유효자료 크기.
                                                    unsigned short   pSize,
                                                    //직렬버스상 크기(2^지수 표현).
                                                    //항상 pSize 보다 큰 크기여야 한다.
                                                    unsigned int     pCBSize)
{
  //[2009.11.24.화][생성!!!]{------------------------------------------------------
  //[2009.11.28.토][수정!!!]
  //맷돌에 설치된 [통신중계기] 의 해당 변수에 직접 기록하고 완료까지 확인한다.
  //단, [직렬버스] 는 2^x 로 크기가 지정되므로 이 규칙에 적합하게 넉넉하게 보낸다.
  //}------------------------------------------------------------------------------

  //[VAR]
  //{
      unsigned char  temp;

  //}

  //[자료전송]
  //{
      //[직렬버스:V] 를 사용하여 해당 위치에 직접 기록한다.
      if(ComBus_Write(d_CB_TS_S, d_CB_AK_V, pCBSize, _tableTxBuf_x, (DTU1 *)pStream) != true) return(false);

  //}

  //[크기지정]
  //{
      //[직렬버스:V] 를 사용하여 해당 위치에 직접 기록한다.
      //2바이트 값--------------------------v
      if(ComBus_Write(d_CB_TS_S, d_CB_AK_V, 1, _tableTxSize_2, (DTU1 *)(&pSize)) != true) return(false);

  //}

  //[처리요청]
  //{
      //[직렬버스:V] 를 사용하여 해당 변수에 직접 기록한다.
      temp = true;
      //1 바이트 크기-----------------------v
      if(ComBus_Write(d_CB_TS_S, d_CB_AK_V, 0, _tableTxExe_1, (DTU1 *)(&temp)) != true) return(false);

  //}

  //[<ACK> 확인]
  //{
      if(ComBus_TimeOut_FwByte(d_CBFW_ACK, 3000) != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::Mtdl_Rxd(//수신된 자료.
                                                    unsigned char   *rStream,
                                                    //실제 유효자료 크기.
                                                    unsigned short  *rSize,
                                                    //직렬버스상 크기(2^지수 표현).
                                                    //항상 pSize 보다 큰 크기여야 한다.
                                                    unsigned int     pCBSize)
{
  //[2009.11.24.화][생성!!!]{---------------------------------------------------------
  //[2009.11.28.토][수정!!!]
  //맷돌에 설치된 [통신중계기] 에서 수신처리를 확인하고 맷돌의 [통신중계기] 에 저장된
  //ㅜ신자료를 읽어들인다.
  //단, [직렬버스] 는 2^x 로 크기가 지정되므로 이 규칙에 적합하게 설정한다.
  //}---------------------------------------------------------------------------------

  //[VAR]
  //{
      unsigned char  temp;

  //}

  //[<ACK> 확인]
  //{
      //먼저 [맷돌중계기] 가 [수신완료] 했다는 통보를 할때까지 대기한다.
      if(ComBus_TimeOut_FwByte(d_CBFW_ACK, 3000) != true) return(false);

  //}

  //[실제 맷돌에 수신된 크기읽기]
  //{
      //[직렬버스:V] 를 사용하여 해당 위치에 직접 기록한다.
      //2 바이트 값------------------------v
      if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, 1, _tableRxSize_2, (DTU1 *)rSize) != true) return(false);

  //}

  //[자료수신]
  //{
      //[직렬버스:V] 를 사용하여 해당 위치서 직접 읽어들인다.
      if(ComBus_Read(d_CB_TS_S, d_CB_AK_V, pCBSize, _tableRxBuf_x, (DTU1 *)rStream) != true) return(false);

  //}

  //[처리 요청 지우기(모두 읽어들였음)]
  //{
      //[직렬버스:V] 를 사용하여 해당 변수에 직접 기록한다.
      temp = false;
      //1 바이트 크기-----------------------v
      if(ComBus_Write(d_CB_TS_S, d_CB_AK_V, 0, _tableRxExe_1, (DTU1 *)(&temp)) != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_Ack(void)
{
  //[2009.04.21.화][변환!!!]{---------------------------
  //<ACK> 를 수신할 때까지 대기한다.
  //수신 인터럽트를 사용하지 않고 직접 읽어서 처리한다.
  //}---------------------------------------------------

  //[VAR]
  //{
      unsigned char   rxBuf[256];

      unsigned short  rxCount;

  //}

  //[ACK 확인]
  //{
      //1 바이트(2^0)--------------v
      if(Mtdl_Rxd(rxBuf, &rxCount, 0) != true) return(false);

      if(rxBuf[0] != d_ACK) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_DegSet(unsigned char  pDid,
                                                                unsigned char  pSid,
                                                                unsigned char  pAccel,
                                                                unsigned char  pDegree)
{
  //[2007.10.04.목][생성!!!]{---------------------------------------
  //<5> + { <DID> + (MSG_DegSet) + (SID) + (등속/가감속) + (각도) }
  //
  //[2008.01.27.일][수정!!!]----------------------------------------
  //[가감속] 사용 유무 인수가 추가 되었다.
  //0 : 등속
  //1 : 가감속
  //}---------------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 5;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_DegSet;
      combuf[comindex++] = pSid;
      combuf[comindex++] = pAccel;
      combuf[comindex++] = pDegree;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //8(2^3)---------------v
      if(Mtdl_Txd(combuf, 6, 3) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_SpdSet(unsigned char  pDid,
                                                                unsigned char  pSid,
                                                                unsigned char  pSpeed)
{
  //[2007.10.04.목][생성!!!]{-----------------------
  //<4> + { <DID> + (MSG_SpdSet) + (SID) + (속도) }
  //}-----------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 4;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_SpdSet;
      combuf[comindex++] = pSid;
      combuf[comindex++] = pSpeed;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //8(2^3)---------------v
      if(Mtdl_Txd(combuf, 5, 3) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_TickSet(unsigned char   pDid,
                                                                 unsigned char   pSid,
                                                                 unsigned char   pAccel,
                                                                 unsigned short  pTick)
{
  //[2007.10.04.목][생성!!!]{-------------------------------------------------
  //<6> + { <DID> + (MSG_TickSet) + (SID) + (속도종류) +(tick-h) + (tick-l) }
  //[2008.02.09.토][수정!!!]--------------------------------------------------
  //[가감속] 인수가 추가 되었다.
  //}-------------------------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 6;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_TickSet;
      combuf[comindex++] = pSid;
      combuf[comindex++] = pAccel;
      combuf[comindex++] = pTick>>8;
      combuf[comindex++] = pTick;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //8(2^3)---------------v
      if(Mtdl_Txd(combuf, 7, 3) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_Pos0TickSet(unsigned char   pDid,
                                                                     unsigned char   pSid,
                                                                     unsigned short  pTick)
{
  //[2007.10.04.목][생성!!!]{-----------------------------------------
  //<5> + { <DID> + (MSG_Pos0Tickset) + (SID) + (tick-h) + (tick-l) }
  //}-----------------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 5;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_Pos0TickSet;
      combuf[comindex++] = pSid;
      combuf[comindex++] = pTick>>8;
      combuf[comindex++] = pTick;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //8(2^3)---------------v
      if(Mtdl_Txd(combuf, 6, 3) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_Pos180TickSet(unsigned char   pDid,
                                                                       unsigned char   pSid,
                                                                       unsigned short  pTick)
{
  //[2007.10.04.목][생성!!!]{-------------------------------------------
  //<5> + { <DID> + (MSG_Pos180TickSet) + (SID) + (tick-h) + (tick-l) }
  //}-------------------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 5;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_Pos180TickSet;
      combuf[comindex++] = pSid;
      combuf[comindex++] = pTick>>8;
      combuf[comindex++] = pTick;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //8(2^3)---------------v
      if(Mtdl_Txd(combuf, 6, 3) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_PeriodSet(unsigned char  pDid,
                                                                   unsigned char  pPeriod)
{
  //[2007.10.04.목][생성!!!]{-------------------
  //<3> + { <DID> + (MSG_period_set) + (주기) }
  //}-------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 3;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_PeriodSet;
      combuf[comindex++] = pPeriod;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //4(2^2)---------------v
      if(Mtdl_Txd(combuf, 4, 2) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_PwmSet(unsigned char  pDid,
                                                                unsigned char  pPwm)
{
  //[2007.10.04.목][생성!!!]{-------------------
  //<3> + { <DID> + (MSG_PwmSet) + (on/off값) }
  //}-------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 3;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_PwmSet;
      combuf[comindex++] = pPwm;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //4(2^2)---------------v
      if(Mtdl_Txd(combuf, 4, 2) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_AdSet(unsigned char  pDid,
                                                               unsigned char  pAD)
{
  //[2007.10.04.목][생성!!!]{---------------
  //<3> + { <DID> + (MSG_AdSet) + (A/D값) }
  //}---------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 3;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_AdSet;
      combuf[comindex++] = pAD;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //4(2^2)---------------v
      if(Mtdl_Txd(combuf, 4, 2) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_Save(unsigned char  pDid)
{
  //[2007.10.04.목][생성!!!]{----
  //<2> + { <DID> + (MSG_save) }
  //}----------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 2;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_Save;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //4(2^2)---------------v
      if(Mtdl_Txd(combuf, 3, 2) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_PwmStart(unsigned char  pDid)
{
  //[2007.10.08.월][생성!!!]{----------------
  //<2> + { <DID> + (MSG_PwmStart) }
  //                                 + <ACK>
  //}----------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 2;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_PwmStart;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //4(2^2)---------------v
      if(Mtdl_Txd(combuf, 3, 2) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_PwmStop(unsigned char  pDid)
{
  //[2007.10.08.월][생성!!!]{---------------
  //<2> + { <DID> + (MSG_PwmStop) }
  //                                + <ACK>
  //}---------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 2;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_PwmStop;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //4(2^2)---------------v
      if(Mtdl_Txd(combuf, 3, 2) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_CtrlReset(unsigned char  pDid)
{
  //[2007.10.08.월][생성!!!]{-----------------
  //<2> + { <DID> + (MSG_CtrlReset) }
  //                                  + <ACK>
  //}-----------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 2;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_CtrlReset;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //4(2^2)---------------v
      if(Mtdl_Txd(combuf, 3, 2) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_EepromInit(unsigned char  pDid)
{
  //[2007.10.08.월][생성!!!]{------------------
  //<2> + { <DID> + (MSG_EepromInit) }
  //                                   + <ACK>
  //}------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

  //}

  //[조합]
  //{
      //[2007.10.22.월][추가!!!]
      //일단 임시버퍼에 모두 정리한다.
      combuf[comindex++] = 2;
      combuf[comindex++] = pDid;
      combuf[comindex++] = d_MSG_EepromInit;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //<ACK> 한개만 수신한다.
  if(Mtdl_EventRxCount_Set(1) != true) return(false);
  //}--------------------------------------------------------------

  //[출력]
  //{
      //한꺼번에 일괄 출력한다.
      //4(2^2)---------------v
      if(Mtdl_Txd(combuf, 3, 2) != true) return(false);

  //}

  //[ACK 확인]
  //{
      if(GMRCBASiC_Ack() != true) return(false);

  //}

  return(true);

}

//------------------------------------------------------------------------------
//[읽기관련]--------------------------------------------------------------------
//------------------------------------------------------------------------------

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_SpdRead(unsigned char   pDid,
                                                                 unsigned char   pSid,
                                                                 unsigned char  *rSpeed)
{
  //[2007.10.10.수][생성!!!]{----------------------------------
  //<3> + { <DID> + (MSG_SpdRead) + (SID) }
  //                                        + (속도값) + <ACK>
  //}----------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

      DTU1    rxBuf[256];
      DTU2    rxCount;

  //}
  
  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //(속도값) + <ACK> 2 바이트를 수신한다.
  if(Mtdl_EventRxCount_Set(2) != true) return(false);
  //}--------------------------------------------------------------

  //[명령 전달]
  //{
      //[조합]
      //{
          //[2007.10.22.월][추가!!!]
          //일단 임시버퍼에 모두 정리한다.
          combuf[comindex++] = 3;
          combuf[comindex++] = pDid;
          combuf[comindex++] = d_MSG_SpdRead;
          combuf[comindex++] = pSid;

      //}

      //[출력]
      //{
          //한꺼번에 일괄 출력한다.
          //4(2^2)---------------v
          if(Mtdl_Txd(combuf, 4, 2) != true) return(false);

      //}

  //}

  //[읽어들이기]
  //{
      //일단 2 바이트를 읽어들인다.

      //2 바이트(2^1)--------------v
      if(Mtdl_Rxd(rxBuf, &rxCount, 1) != true) return(false);

      //[속도]
      //{
          (*rSpeed) = rxBuf[0];

      //}

      //[ACK]
      //{
          if(rxBuf[1] != d_ACK) return(false);

      //}

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_DegRead(unsigned char   pDid,
                                                                 unsigned char   pSid,
                                                                 unsigned char  *rDegree)
{
  //[2007.10.10.수][생성!!!]{----------------------------------
  //<3> + { <DID> + (MSG_DegRead) + (SID) }
  //                                        + (각도값) + <ACK>
  //}----------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

      DTU1    rxBuf[256];
      DTU2    rxCount;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //(각도값) + <ACK> 2 바이트를 수신한다.
  if(Mtdl_EventRxCount_Set(2) != true) return(false);
  //}--------------------------------------------------------------

  //[명령 전달]
  //{
      //[조합]
      //{
          //[2007.10.22.월][추가!!!]
          //일단 임시버퍼에 모두 정리한다.
          combuf[comindex++] = 3;
          combuf[comindex++] = pDid;
          combuf[comindex++] = d_MSG_DegRead;
          combuf[comindex++] = pSid;

      //}

      //[출력]
      //{
          //한꺼번에 일괄 출력한다.
          //4(2^2)---------------v
          if(Mtdl_Txd(combuf, 4, 2) != true) return(false);

      //}

  //}

  //[읽어들이기]
  //{
      //일단 2 바이트를 읽어들인다.

      //2 바이트(2^1)--------------v
      if(Mtdl_Rxd(rxBuf, &rxCount, 1) != true) return(false);

      //[각도]
      //{
          (*rDegree) = rxBuf[0];

      //}

      //[ACK]
      //{
          if(rxBuf[1] != d_ACK) return(false);

      //}

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_PwmRead(unsigned char   pDid,
                                                                 unsigned char  *rPwm)
{
  //[2007.10.10.수][생성!!!]{-------------------------------
  //<2> + { <DID> + (MSG_PwmRead) }
  //                                + (pwm 설정 값) + <ACK>
  //}-------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

      DTU1    rxBuf[256];
      DTU2    rxCount;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //(pwm 설정 값) + <ACK> 2 바이트를 수신한다.
  if(Mtdl_EventRxCount_Set(2) != true) return(false);
  //}--------------------------------------------------------------

  //[명령 전달]
  //{
      //[조합]
      //{
          //[2007.10.22.월][추가!!!]
          //일단 임시버퍼에 모두 정리한다.
          combuf[comindex++] = 2;
          combuf[comindex++] = pDid;
          combuf[comindex++] = d_MSG_PwmRead;

      //}

      //[출력]
      //{
          //한꺼번에 일괄 출력한다.
          //4(2^2)---------------v
          if(Mtdl_Txd(combuf, 3, 2) != true) return(false);

      //}

  //}

  //[읽어들이기]
  //{
      //일단 2 바이트를 읽어들인다.

      //2 바이트(2^1)--------------v
      if(Mtdl_Rxd(rxBuf, &rxCount, 1) != true) return(false);

      //[PWM 설정 값]
      //{
          (*rPwm) = rxBuf[0];

      //}

      //[ACK]
      //{
          if(rxBuf[1] != d_ACK) return(false);

      //}

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_AdRead(unsigned char   pDid,
                                                                unsigned char  *rAD)
{
  //[2007.10.10.수][생성!!!]{------------------------------
  //<2> + { <DID> + (MSG_AdRead) }
  //                               + (A/D 설정 값) + <ACK>
  //}------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

      DTU1    rxBuf[256];
      DTU2    rxCount;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //(A/D 설정 값) + <ACK> 2 바이트를 수신한다.
  if(Mtdl_EventRxCount_Set(2) != true) return(false);
  //}--------------------------------------------------------------

  //[명령 전달]
  //{
      //[조합]
      //{
          //[2007.10.22.월][추가!!!]
          //일단 임시버퍼에 모두 정리한다.
          combuf[comindex++] = 2;
          combuf[comindex++] = pDid;
          combuf[comindex++] = d_MSG_AdRead;

      //}

      //[출력]
      //{
          //한꺼번에 일괄 출력한다.
          //4(2^2)---------------v
          if(Mtdl_Txd(combuf, 3, 2) != true) return(false);

      //}

  //}

  //[읽어들이기]
  //{
      //일단 2 바이트를 읽어들인다.

      //2 바이트(2^1)--------------v
      if(Mtdl_Rxd(rxBuf, &rxCount, 1) != true) return(false);

      //[A/D 설정 값]
      //{
          (*rAD) = rxBuf[0];

      //}

      //[ACK]
      //{
          if(rxBuf[1] != d_ACK) return(false);

      //}

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_PeriodRead(unsigned char   pDid,
                                                                    unsigned char  *rPeriod)
{
  //[2007.10.10.수][생성!!!]{-----------------------------------
  //<2> + { <DID> + (MSG_PeriodRead) }
  //                                   + (주기 설정 값) + <ACK>
  //}-----------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

      DTU1    rxBuf[256];
      DTU2    rxCount;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //(주기 설정 값) + <ACK> 2 바이트를 수신한다.
  if(Mtdl_EventRxCount_Set(2) != true) return(false);
  //}--------------------------------------------------------------

  //[명령 전달]
  //{
      //[조합]
      //{
          //[2007.10.22.월][추가!!!]
          //일단 임시버퍼에 모두 정리한다.
          combuf[comindex++] = 2;
          combuf[comindex++] = pDid;
          combuf[comindex++] = d_MSG_PeriodRead;

      //}

      //[출력]
      //{
          //한꺼번에 일괄 출력한다.
          //4(2^2)---------------v
          if(Mtdl_Txd(combuf, 3, 2) != true) return(false);

      //}

  //}

  //[읽어들이기]
  //{
      //일단 2 바이트를 읽어들인다.

      //2 바이트(2^1)--------------v
      if(Mtdl_Rxd(rxBuf, &rxCount, 1) != true) return(false);

      //[주기]
      //{
          (*rPeriod) = rxBuf[0];

      //}

      //[ACK]
      //{
          if(rxBuf[1] != d_ACK) return(false);

      //}

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_Pos0TickRead(unsigned char    pDid,
                                                                      unsigned char    pSid,
                                                                      unsigned short  *rTick)
{
  //[2007.10.10.수][생성!!!]{--------------------------------------------------
  //<3> + { <DID> + (MSG_Pos0TickRead) + (SID) }
  //                                             + (TICK-H) + (TICK-L) + <ACK>
  //}--------------------------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

      DTU1    rxBuf[256];
      DTU2    rxCount;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //(TICK-H) + (TICK-L) + <ACK> 3 바이트를 수신한다.
  if(Mtdl_EventRxCount_Set(3) != true) return(false);
  //}--------------------------------------------------------------

  //[명령 전달]
  //{
      //[조합]
      //{
          //[2007.10.22.월][추가!!!]
          //일단 임시버퍼에 모두 정리한다.
          combuf[comindex++] = 3;
          combuf[comindex++] = pDid;
          combuf[comindex++] = d_MSG_Pos0TickRead;
          combuf[comindex++] = pSid;

      //}

      //[출력]
      //{
          //한꺼번에 일괄 출력한다.
          //4(2^2)---------------v
          if(Mtdl_Txd(combuf, 4, 2) != true) return(false);

      //}

  //}

  //[읽어들이기]
  //{
      //일단 3 바이트를 읽어들인다.

      //4 바이트(2^2)--------------v
      if(Mtdl_Rxd(rxBuf, &rxCount, 2) != true) return(false);

      //[영점 0도 값]
      //{
          (*rTick) = (rxBuf[0] << 8) | rxBuf[1];

      //}

      //[ACK]
      //{
          if(rxBuf[2] != d_ACK) return(false);

      //}

  //}

  return(true);

}

bool __fastcall Tgmrcbasic_DialogBox_Form::GMRCBASiC_MSG_Pos180TickRead(unsigned char    pDid,
                                                                        unsigned char    pSid,
                                                                        unsigned short  *rTick)
{
  //[2007.10.10.수][생성!!!]{----------------------------------------------------
  //<3> + { <DID> + (MSG_Pos180TickRead) + (SID) }
  //                                               + (TICK-H) + (TICK-L) + <ACK>
  //}----------------------------------------------------------------------------

  //[VAR]
  //{
      //[2009.11.28.토][수정!!!]{----------------------------------------
      //[직렬버스] 의 전송 크기는 2^X 형식이므로 아예 넉넉하게 설정한다.
      DTU1    combuf[256];
      //}----------------------------------------------------------------

      int     comindex = 0;

      DTU1    rxBuf[256];
      DTU2    rxCount;

  //}

  //[통신포트 설정]{-----------------------------------------------
  if(Mtdl_ComPortNum_Set(Dlg_ComPortNum()) != true) return(false);
  //
  //[수신이벤트 개수 지정]-----------------------------------------
  //(TICK-H) + (TICK-L) + <ACK> 3 바이트를 수신한다.
  if(Mtdl_EventRxCount_Set(3) != true) return(false);
  //}--------------------------------------------------------------

  //[명령 전달]
  //{
      //[조합]
      //{
          //[2007.10.22.월][추가!!!]       //일단 임시버퍼에 모두 정리한다.
          combuf[comindex++] = 3;
          combuf[comindex++] = pDid;
          combuf[comindex++] = d_MSG_Pos180TickRead;
          combuf[comindex++] = pSid;

      //}

      //[출력]
      //{
          //한꺼번에 일괄 출력한다.
          //4(2^2)---------------v
          if(Mtdl_Txd(combuf, 4, 2) != true) return(false);

      //}

  //}

  //[읽어들이기]
  //{
      //일단 3 바이트를 읽어들인다.

      //4 바이트(2^2)--------------v
      if(Mtdl_Rxd(rxBuf, &rxCount, 2) != true) return(false);

      //[영점 180도 값]
      //{
          (*rTick) = (rxBuf[0] << 8) | rxBuf[1];

      //}

      //[ACK]
      //{
          if(rxBuf[2] != d_ACK) return(false);

      //}

  //}

  return(true);

}

void __fastcall Tgmrcbasic_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;

      //}

  //}

}






