Grid Control 2

  

サブメニュー


ここに紹介するプログラムは、WIN XP 2003/Windows 7 (32bits) - OS 環境でマイクロソフトのVisual Studio 2010 で作ったものです。

Windows XP/ Windows 7(32bits) での動作は確認済みですが…


 

非表示のEditBoxを貼り付け、GridControlとLinkさせる。

 

下図のようにEditBoxを貼り付け、ClassWizardでメンバー変数をコントロールのm_ctrWallDataInputにします。

Gridは、メンバー変数をm_gridとします。

次にClassWizardでEditBoxのUpDateData関数をオーバーライドさせます。

この関数は、EditBoxの内容が変わった時 呼び出される関数です。  

この関数内にキーボードで入力されたデータの判断や加工のコードを書きます。下は、サンプルです。

 

////////////////////////////////////////
// データの入力
void CWallDlg::OnUpdateWalldataInput()
{
  CString szData, szEtd, szDnsty, szUv, szD;
  CGridControl gc;
  CCheckData cd;
  BOOL ret2=FALSE, ret = FALSE;

  m_ctrWallDataInput.GetWindowText( szData ); // EditBoxの入力データを取得する
  long row = m_rc.y;    // 着目しているGridの行を取得する
  long col  = m_rc.x;    // 着目しているGridの列を取得する


    switch( col ){ // Colの個数で必要なだけ条件を書く

     case 1:
 条件判断 1(条件に合えばret = TRUEを代入)

     break;
     case 2:
     条件判断 2
     break;
     case 3:
     条件判断 3
     break;
     case 4:
     条件判断 4
     break;
     case 5:
     条件判断 
     break;
   }

   if( ret == FALSE && !szData.IsEmpty( )) {   // 条件に合わない時に再入力や修正を促す

   gc.SetTextMatrixRight(&m_grid, row, col, szData ); // 入力したデータをGridの所定の位置に表示
   AfxMessageBox( "Not Correct Data ! ",MB_OK | MB_ICONEXCLAMATION, 0 );
    int n = str.GetLength( ); 
    m_ctrWallDataInput.SetSel( n, n, FALSE );
    m_ctrWallDataInput.SetFocus( );                 // フォーカスをEditBoxに強制的に移動します。

    }
   else {
   RecordData( m_pt );   // 条件に合ったときは、データを保存するルーチンに飛ぶ

    }
}

 

この様に、EditBoxのデータを読み込み 判断の上、所定のGridに書き込んだ後、すぐに強制的にフォーカスをEditBoxに戻すことでLinkが取れるのです。入力データをアレーに書き込む関数は以下の通りです。

 

////////////////////////////////////////
// グリッドのデータをメモリーに記録する
void CWallDlg::RecordData(int pt)
{
  CString szData;
  CWallData wd;

    CCheckData cd;

   BOOL br = FALSE;

    BOOL nRet = TRUE;


   long cols = m_grid.GetCols();

    long col = 0;

    double area = 0.0;

    double uv    = 0.0;
      str = m_grid.GetTextMatrix( pt, col );

     if( !str.IsEmpty( )){
       br = TRUE;
       switch( col ){ // 各Col に対応したWallData Classに代入する
          case 1:
           wd.m_orient = str;
           break;
         case 2:
           wd.m_type = str;
           break;
         case 3:
           wd.m_wallarea = str;
           break;
         case 4:
           wd.m_uf = str;
           break;
         case 5:
           wd.m_tempdeff = str;
           break;
           case 6:
           wd.m_dnsty = str;
           break;
        }
        col++;
    }
    else {
      br = FALSE;
      col++;
      break;
    }
  }
  if( br == TRUE ) {                   // WallData Classのアレーに代入する

       // 全てのデータが入力されないとTRUEにならない。
    int nIdx = m_grid.GetRow() - m_fixedrows;
    int nData = m_ArrayWall.GetSize(); 
    if ( nIdx < nData )              // 既存データアレーの修正
      m_ArrayWall[nIdx] = wd;
    if ( nIdx == nData    )          // 新規アレー追加
      m_ArrayWall.Add( wd );
  }
}

 

プログラムでは、一行のデータ(すべてのCol)がすべて入力されないと アレーに書き込み出来なくしています。

このRecordData関数により、各Colに有効なデータがEditBoxより入力されれば、保存のアレーに自動的に書き込まれます。

更に、行を変えればアレーも自動的に増加します。 

WallData クラスについて

複数のデータをアレーにまとめるためにWallDataクラスを下のように作りました。

  

class CWallData : public CObject
{
   public:

   CWallData() {
      m_orient = "";
      m_type = "";
      m_wallarea = "";
      m_uf = "";
      m_tempdeff = "";
      m_dnsty = _T("M");
   };
   CWallData( const CWallData& s ) { *this = s; };
   ~CWallData() {};

    const CWallData& operator = ( const CWallData& s ) {
       m_orient = s.m_orient;
       m_type = s.m_type;
       m_wallarea = s.m_wallarea;
       m_uf = s.m_uf;
       m_tempdeff = s.m_tempdeff;
       m_dnsty = s.m_dnsty;
       return *this;
    };

    CString m_orient; // すべて文字変数としています
    CString m_type;
    CString m_wallarea;
    CString m_uf;
    CString m_tempdeff;
    CString m_dnsty;
}; 

 

前ページに戻る

次のページへ


ページ先頭に戻る
最終更新日: 2020/02/04