Grid Control 2
- ◆プログラム作成ガイド
- ◆プログラムの開始
- ◆初期表示のデザイン
- ◆データの入力方法
- ◆クラスの作り方
- ◆データをメモリーに
- ◆ファイル読み書き
- ◆データの保存方法
- ◆ツリービューマウス右
- ◆画面表示インプリメント
- ◆複数のページ印字
- ◆DLL化する
- ◆エクセル似の入力
サブメニュー
ここに紹介するプログラムは、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