Grid Control 7

  

サブメニュー


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

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


行の削除

編集の時、行の削除機能は必要不可欠の機能です。 

この機能にはデータ保持しているアレーの削除や行番号の書き換えなどを併せて持たせる必要があります。

更に削除確認のダイアログ表示などを持たせなければなりません。 また、FlexGridの初期最大表示行以上の時と、以下の時を判断しなければなりません。この機能は、削除したい行をマウスで選定し、ダブルクリックで行うようにしました。

以下が、サンプルです。

 

///////////////////////////////////////////////

// データの削除

void CWallDlg::OnDblClickWalldataGrid()

{

  CGridControl gc;

  CString szMess = _T("");

  long row = m_grid.GetMouseRow();

  long col = m_grid.GetMouseCol();

  int nRow = row - m_nFixedRows;

  int nLine = m_nData;

  int nTop = 0;

  if(nRow>=0 && nLine>nRow && col==0)

  {

     szMess.Format(IDS_NOTE_DELETE, nRow + 1);

     m_ctrWallDataInput.ShowWindow(SW_HIDE); // EditBox を非表示にする

     if( AfxMessageBox(szMess, MB_YESNO, 0) == IDYES)

     {

        m_grid.SetRedraw(FALSE);

        m_ArrayWall.RemoveAt(nRow);// 記録アレーより指定行を削除

        m_nData--;

       m_grid.RemoveItem(row);// グリッドよりデータの削除

       m_rc.y = SetPt(nLine);

       // 削除の最小制限

       m_nMaxRow--;

       nTop = m_nMaxRow - m_nViewRow + 1;

       if(nTop <= 1) nTop = 1;

       else nTop--;

       m_grid.SetTopRow(nTop); // 着目行にスクロール

       // 入力データ数が初期最小行より少ない場合、行の数は初期値とする

       if(nLine < m_nInitia_maxrow)

       m_grid.SetRows(m_nInitia_maxrow);

       gc.SetTitle_N(&m_grid, m_nFixedRows, m_nFixedCols);

       m_rc = gc.SetCurrentCel(&m_grid, m_nMaxRow, nLine, 1);

       m_grid.SetRedraw(TRUE);

       m_ctrWallDataInput.SetWindowText(_T(""));

       m_ctrWallDataInput.SetFocus();

       m_ctrWallDataInput.ShowWindow(SW_SHOW); // EditBox を表示にする

       EditBoxRedraw(&m_grid, &m_rc);

     }

     else

     {

        m_rc = gc.SetCurrentCel(&m_grid, m_nMaxRow, nLine+1, 1);

        m_ctrWallDataInput.SetFocus();

        EditBoxRedraw(&m_grid, &m_rc);

     }

  }

}

 

入力データの確定

 

入力したデータは、リターンキーで確定する動作を追加していないと、行の管理や削除などの機能上都合が良くありません。

そこで以下の関数を追加しました。

 

//////////////////////////////////////
// Set Room Data
void CWallDlg::SetWallData(int pt)
{

   CGridControl gc;

   CString szData;
   int n = m_ArrayWall.GetSize();
   long pt = m_nFixedRows + n;

   if( n > m_nRows ){ // アレーが増えている場合のみ

      m_nRows++;     // 確定アレー数を増加させる
      if( m_nMaxRow < m_nInitia_maxrow )
         m_nMaxRow = m_nInitia_maxrow; // 削除の場合最小値制限

      if( pt >= ( m_nMaxRow - m_nFixedRows )) { // 初期設定の行数を超えた場合
         m_nMaxRow = pt + 1;
         gc.SetGridStyle( m_grid, m_nMaxRow, m_nCols ); // 行を自動で増やす

         m_rc.y = SetPt( pt );
         m_nTopRow++;
         m_grid.SetTopRow( m_nTopRow ); // 着目行を自動でスクロール
      }
   }
 

   m_rc = gc.SetCurrentCel( &m_grid, m_nMaxRow, pt, 1 );

   szData = m_grid.GetTextMatrix( m_rc.y, 1 );

 

   // 新規追加行にスクロール

   int row = m_nMaxRow - m_nInitia_maxrow + m_nFixedRows + 1;

   if(m_nMaxRow > m_nInitia_maxrow )

      m_nTopRow = row;

   m_grid.SetTopRow( m_nTopRow );

 

   if( szData == _T("") )

         m_ctrWallDataInput.SetWindowText( _T(""));

    EditBoxRedraw( &m_grid, &m_rc );
}

 

 

前ページに戻る

次のページへ


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