明日から、新しい年度です。ダイアログベースのプログラムは、処理内容が異なっても作り方は同じなので、次のステップに進みたいと思います。

どのような企業でも、自分のところで入力する「入力フォーム」というのがあります。
商品マスター、従業員マスター、資産マスター・・・
とにかく、始めにだれかが入力しないと仕事になりません。
この、ブログで よく使用した 郵便番号住所データ KEN_ALL.txt も 誰かが、入力してくれたのです。入力してくれた方、ありがとうございます。
来年度から、MFCを使って、入力フォームを作成していきます。どのような、入力フォームを作るかは今から考えます。
エクセルやデータベースで入力フォームを作成されている企業の担当者必見です。
今日は、棚卸しなのでここまでにします。
条件で抽出するプログラムも もうすぐ完成です。
後は、セットフォーカスを記述すれば出来上がりです。ウィザードから各セットフォーカスを追加します。
void CMVC503Dlg::OnSetfocusEinputf()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData( TRUE );
if ( m_sMinputF != "" && m_iDisp == 0 )
{
ShowWindow( SW_SHOW );
UpdateWindow();
NextDlgCtrl();
}
}
void CMVC503Dlg::OnSetfocusEincludef()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData( TRUE );
if ( m_sMincludeF != "" && m_iDisp == 0 )
{
NextDlgCtrl();
}
}
void CMVC503Dlg::OnSetfocusEomitf()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData( TRUE );
if ( m_sMomitF != "" && m_iDisp == 0 )
{
NextDlgCtrl();
OnBstart();
}
}
これで、完成です。
連続技に 挑戦!!
今までに、3つのアプリケーションを作成しました。
1つは「項目抽出」・・・MVC501
1つは「ダブルクォーテーション削除」・・・MVC502
1つは「条件項目抽出」・・・MVC503
です。これらを組み合わせて仕事にしていきましょう。
例では、Eドライブにken_all.txtがあるとしてやります。
まず、デスクトップ上に yuubin.bat バッチファイルを用意して次のように書いていきます。
rem 郵便番号抽出 yuubin.bat
rem ダブルクォーテーション削除
e:/MVC502.exe 0,e:/ken_all.txt,e:/k01.txt
IF ERRORLEVEL 1 GOTO ERREND
rem 指定地域 抽出
e:/MVC503.exe 0,e:/k01.txt,e:/k02.txt,e:/k00.txt,"2,>,7600000,2,<,7619999"
IF ERRORLEVEL 1 GOTO ERREND
rem 項目抽出
e:/MVC501.exe 0,e:/k02.txt,e:/k03.txt,"2,6,7,8"
IF ERRORLEVEL 1 GOTO ERREND
rem 表示
notepad.exe e:/k03.txt
GOTO ALLEND
:ERREND
pause "yuubin.bat ERROR "
:ALLEND
ここまで書いたら、保存してダブルクリックです!!
デスクトップに、香川県がでてきたら 大成功 です。
今日は、ここまでです。
後は、セットフォーカスを記述すれば出来上がりです。ウィザードから各セットフォーカスを追加します。
void CMVC503Dlg::OnSetfocusEinputf()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData( TRUE );
if ( m_sMinputF != "" && m_iDisp == 0 )
{
ShowWindow( SW_SHOW );
UpdateWindow();
NextDlgCtrl();
}
}
void CMVC503Dlg::OnSetfocusEincludef()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData( TRUE );
if ( m_sMincludeF != "" && m_iDisp == 0 )
{
NextDlgCtrl();
}
}
void CMVC503Dlg::OnSetfocusEomitf()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
UpdateData( TRUE );
if ( m_sMomitF != "" && m_iDisp == 0 )
{
NextDlgCtrl();
OnBstart();
}
}
これで、完成です。



今までに、3つのアプリケーションを作成しました。
1つは「項目抽出」・・・MVC501
1つは「ダブルクォーテーション削除」・・・MVC502
1つは「条件項目抽出」・・・MVC503
です。これらを組み合わせて仕事にしていきましょう。
例では、Eドライブにken_all.txtがあるとしてやります。
まず、デスクトップ上に yuubin.bat バッチファイルを用意して次のように書いていきます。
rem 郵便番号抽出 yuubin.bat
rem ダブルクォーテーション削除
e:/MVC502.exe 0,e:/ken_all.txt,e:/k01.txt
IF ERRORLEVEL 1 GOTO ERREND
rem 指定地域 抽出
e:/MVC503.exe 0,e:/k01.txt,e:/k02.txt,e:/k00.txt,"2,>,7600000,2,<,7619999"
IF ERRORLEVEL 1 GOTO ERREND
rem 項目抽出
e:/MVC501.exe 0,e:/k02.txt,e:/k03.txt,"2,6,7,8"
IF ERRORLEVEL 1 GOTO ERREND
rem 表示
notepad.exe e:/k03.txt
GOTO ALLEND
:ERREND
pause "yuubin.bat ERROR "
:ALLEND
ここまで書いたら、保存してダブルクリックです!!
デスクトップに、香川県がでてきたら 大成功 です。
今日は、ここまでです。
関数作成の続きをやります。
まずは、UsParaChk()です。
void CMVC503Dlg::UsParaChk()
{
if ( m_sMinputF == "" )
{
CFileDialog dlg( TRUE, "txt", "*.txt", OFN_EXPLORER, "Simple WP ( *.txt ) | *.txt | *.*" );
if ( dlg.DoModal() == IDOK )
{
m_sMinputF = dlg.GetPathName();
}
else
{
m_iErr = 1;
return;
}
}
if ( m_sMincludeF == "" )
{
CFileDialog dlg( TRUE, "txt", "*.txt", OFN_EXPLORER, "Simple WP ( *.txt ) | *.txt | *.*" );
if ( dlg.DoModal() == IDOK )
{
m_sMincludeF = dlg.GetPathName();
}
else
{
m_iErr = 1;
return;
}
}
if ( m_sMomitF == "" )
{
CFileDialog dlg( TRUE, "txt", "*.txt", OFN_EXPLORER, "Simple WP ( *.txt ) | *.txt | *.*" );
if ( dlg.DoModal() == IDOK )
{
m_sMomitF = dlg.GetPathName();
}
else
{
m_iErr = 1;
return;
}
}
CString s1;
int i, iitem, ichk1, ichk2;
m_iKeymax = 0;
m_iAnd = 0;
for ( i = 0; i < 8; i++ )
{
m_iKeypos[ i ] = -1;
m_sKub[ i ] = "";
m_sKey[ i ] = "";
}
iitem = dt.DivItem( m_sMkeys );
if ( iitem < 1 && iitem > 24 )
{
m_sMmsg.Format( "パラメータ おかしい %s", m_sMkeys );
m_iErr = 1;
return;
}
s1 = dt.m_sItem[ 0 ].GetAt( 0 );
if ( s1 == '-' )
{
m_iAnd = 1;
dt.m_sItem[ 0 ].TrimLeft( '-' );
}
ichk1 = iitem / 3;
ichk1 = ichk1 * 3;
if ( ichk1 != iitem )
{
m_sMmsg = "パラメーター 項目数 おかしい ";
m_iErr = 2;
return;
}
ichk2 = 0;
for ( i = 0; i < iitem; i = i + 3 )
{
m_iKeypos[ ichk2 ] = atoi( dt.m_sItem[ i ] );
m_sKub[ ichk2 ] = dt.m_sItem[ i + 1 ];
m_sKey[ ichk2 ] = dt.m_sItem[ i + 2 ];
if ( m_sKub[ ichk2 ] == '=' || m_sKub[ ichk2 ] == '!' ||
m_sKub[ ichk2 ] == '>' || m_sKub[ ichk2 ] == '<' )
{
// 何もしません
}
else
{
m_sMmsg = "条件式 間違い =, !, >, < ";
m_iErr = 1;
}
ichk2++;
} // for ( i = 0; i < iitem; i = i + 3 )
m_iKeymax = ichk2;
}
次に OnBreenterをこう書きます。
void CMVC503Dlg::OnBreenter()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
m_iDisp = 1;
m_iErr = 0;
m_sMinputD = "";
m_sMincludeD = "";
m_sMomitD = "";
m_sMmsg = "再 入力";
UpdateData( FALSE );
}
今までの、OnBreenterはクリックすると入力した内容まで消えていたのでそれをやめました。
最後に、UsMainを作成したら完成です。
void CMVC503Dlg::UsMain()
{
int iinput, iinclude, iomit, icount, ichk1, ix, i;
CString sbuf1, sbuf2, sk, ss, sCR;
BOOL success;
char c1;
CStdioFile inputf, includef, omitf;
CFileException fex;
sCR = 0x0a;
iinput = 0;
iinclude = 0;
iomit = 0;
if ( !inputf.Open( m_sMinputF, CFile::modeRead, &fex ) )
{
m_sMmsg.Format( "inputf.Open Error = %s : cause = %d ", m_sMinputF, fex.m_cause );
m_iErr = 11;
return;
}
if ( !includef.Open( m_sMincludeF, CFile::modeWrite | CFile::modeCreate, &fex ) )
{
m_sMmsg.Format( "includef.Open Error = %s : cause = %d ", m_sMincludeF, fex.m_cause );
m_iErr = 12;
return;
}
if ( !omitf.Open( m_sMomitF, CFile::modeWrite | CFile::modeCreate, &fex ) )
{
m_sMmsg.Format( "omitf.Open Error = %s : cause = %d ", m_sMomitF, fex.m_cause );
m_iErr = 13;
return;
}
while ( 1 )
{
success = inputf.ReadString( sbuf1 );
if ( success == NULL || success == FALSE )
{
break;
}
iinput++;
dt.DivItem( sbuf1 );
ichk1 = 0;
for ( i = 0; i < m_iKeymax; i++ )
{
ix = m_iKeypos[ i ];
sk = dt.m_sItem[ ix ];
c1 = m_sKub[ i ].GetAt( 0 );
ss = m_sKey[ i ];
switch( c1 )
{
case '=':
if ( sk == ss )
{
ichk1++;
}
break;
case '!':
if ( sk != ss )
{
ichk1++;
}
break;
case '>':
if ( sk >= ss )
{
ichk1++;
}
break;
case '<':
if ( sk <= ss )
{
ichk1++;
}
break;
default:
break;
} // switch( c1 )
} // for ( i = 0; i <m_iKmax; i++ )
sbuf2 = "";
sbuf2 = sbuf1 + sCR;
if ( ( m_iAnd == 0 && ichk1 == m_iKeymax ) || ( m_iAnd != 0 && ichk1 > 0 ) )
{
includef.WriteString( sbuf2 );
iinclude++;
}
else
{
omitf.WriteString( sbuf2 );
iomit++;
}
icount = iinput % 10000;
if ( icount == 0 )
{
m_sMinputD.Format( "%d", iinput );
m_sMincludeD.Format( "%d", iinclude );
m_sMomitD.Format( "%d", iomit );
SetDlgItemText( IDC_EINPUTD, m_sMinputD );
SetDlgItemText( IDC_EINCLUDED, m_sMincludeD );
SetDlgItemText( IDC_EOMITD, m_sMomitD );
UpdateWindow();
}
} // while ( 1 )
inputf.Close();
includef.Close();
omitf.Close();
m_sMinputD.Format( "%d", iinput );
m_sMincludeD.Format( "%d", iinclude );
m_sMomitD.Format( "%d", iomit );
UsSetMsg( IDC_SINPUTD, m_sMinputD );
UsSetMsg( IDC_SINCLUDED, m_sMincludeD );
UsSetMsg( IDC_SOMITD, m_sMomitD );
icount = iinclude + iomit;
if ( iinput != icount )
{
m_sMmsg.Format( "件数 合わず IN=%d, INCLUDE=%d, OMIT=%d", iinput, iinclude, iomit );
m_iErr = 40;
}
}
これで、だいたい完成です。リビルドして実行しましょう。
MVC503.exe で ブリーフケースに入れておきます。使ってみましょう。
ダウンロードはこちら
まずは、UsParaChk()です。
void CMVC503Dlg::UsParaChk()
{
if ( m_sMinputF == "" )
{
CFileDialog dlg( TRUE, "txt", "*.txt", OFN_EXPLORER, "Simple WP ( *.txt ) | *.txt | *.*" );
if ( dlg.DoModal() == IDOK )
{
m_sMinputF = dlg.GetPathName();
}
else
{
m_iErr = 1;
return;
}
}
if ( m_sMincludeF == "" )
{
CFileDialog dlg( TRUE, "txt", "*.txt", OFN_EXPLORER, "Simple WP ( *.txt ) | *.txt | *.*" );
if ( dlg.DoModal() == IDOK )
{
m_sMincludeF = dlg.GetPathName();
}
else
{
m_iErr = 1;
return;
}
}
if ( m_sMomitF == "" )
{
CFileDialog dlg( TRUE, "txt", "*.txt", OFN_EXPLORER, "Simple WP ( *.txt ) | *.txt | *.*" );
if ( dlg.DoModal() == IDOK )
{
m_sMomitF = dlg.GetPathName();
}
else
{
m_iErr = 1;
return;
}
}
CString s1;
int i, iitem, ichk1, ichk2;
m_iKeymax = 0;
m_iAnd = 0;
for ( i = 0; i < 8; i++ )
{
m_iKeypos[ i ] = -1;
m_sKub[ i ] = "";
m_sKey[ i ] = "";
}
iitem = dt.DivItem( m_sMkeys );
if ( iitem < 1 && iitem > 24 )
{
m_sMmsg.Format( "パラメータ おかしい %s", m_sMkeys );
m_iErr = 1;
return;
}
s1 = dt.m_sItem[ 0 ].GetAt( 0 );
if ( s1 == '-' )
{
m_iAnd = 1;
dt.m_sItem[ 0 ].TrimLeft( '-' );
}
ichk1 = iitem / 3;
ichk1 = ichk1 * 3;
if ( ichk1 != iitem )
{
m_sMmsg = "パラメーター 項目数 おかしい ";
m_iErr = 2;
return;
}
ichk2 = 0;
for ( i = 0; i < iitem; i = i + 3 )
{
m_iKeypos[ ichk2 ] = atoi( dt.m_sItem[ i ] );
m_sKub[ ichk2 ] = dt.m_sItem[ i + 1 ];
m_sKey[ ichk2 ] = dt.m_sItem[ i + 2 ];
if ( m_sKub[ ichk2 ] == '=' || m_sKub[ ichk2 ] == '!' ||
m_sKub[ ichk2 ] == '>' || m_sKub[ ichk2 ] == '<' )
{
// 何もしません
}
else
{
m_sMmsg = "条件式 間違い =, !, >, < ";
m_iErr = 1;
}
ichk2++;
} // for ( i = 0; i < iitem; i = i + 3 )
m_iKeymax = ichk2;
}
次に OnBreenterをこう書きます。
void CMVC503Dlg::OnBreenter()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
m_iDisp = 1;
m_iErr = 0;
m_sMinputD = "";
m_sMincludeD = "";
m_sMomitD = "";
m_sMmsg = "再 入力";
UpdateData( FALSE );
}
今までの、OnBreenterはクリックすると入力した内容まで消えていたのでそれをやめました。
最後に、UsMainを作成したら完成です。
void CMVC503Dlg::UsMain()
{
int iinput, iinclude, iomit, icount, ichk1, ix, i;
CString sbuf1, sbuf2, sk, ss, sCR;
BOOL success;
char c1;
CStdioFile inputf, includef, omitf;
CFileException fex;
sCR = 0x0a;
iinput = 0;
iinclude = 0;
iomit = 0;
if ( !inputf.Open( m_sMinputF, CFile::modeRead, &fex ) )
{
m_sMmsg.Format( "inputf.Open Error = %s : cause = %d ", m_sMinputF, fex.m_cause );
m_iErr = 11;
return;
}
if ( !includef.Open( m_sMincludeF, CFile::modeWrite | CFile::modeCreate, &fex ) )
{
m_sMmsg.Format( "includef.Open Error = %s : cause = %d ", m_sMincludeF, fex.m_cause );
m_iErr = 12;
return;
}
if ( !omitf.Open( m_sMomitF, CFile::modeWrite | CFile::modeCreate, &fex ) )
{
m_sMmsg.Format( "omitf.Open Error = %s : cause = %d ", m_sMomitF, fex.m_cause );
m_iErr = 13;
return;
}
while ( 1 )
{
success = inputf.ReadString( sbuf1 );
if ( success == NULL || success == FALSE )
{
break;
}
iinput++;
dt.DivItem( sbuf1 );
ichk1 = 0;
for ( i = 0; i < m_iKeymax; i++ )
{
ix = m_iKeypos[ i ];
sk = dt.m_sItem[ ix ];
c1 = m_sKub[ i ].GetAt( 0 );
ss = m_sKey[ i ];
switch( c1 )
{
case '=':
if ( sk == ss )
{
ichk1++;
}
break;
case '!':
if ( sk != ss )
{
ichk1++;
}
break;
case '>':
if ( sk >= ss )
{
ichk1++;
}
break;
case '<':
if ( sk <= ss )
{
ichk1++;
}
break;
default:
break;
} // switch( c1 )
} // for ( i = 0; i <m_iKmax; i++ )
sbuf2 = "";
sbuf2 = sbuf1 + sCR;
if ( ( m_iAnd == 0 && ichk1 == m_iKeymax ) || ( m_iAnd != 0 && ichk1 > 0 ) )
{
includef.WriteString( sbuf2 );
iinclude++;
}
else
{
omitf.WriteString( sbuf2 );
iomit++;
}
icount = iinput % 10000;
if ( icount == 0 )
{
m_sMinputD.Format( "%d", iinput );
m_sMincludeD.Format( "%d", iinclude );
m_sMomitD.Format( "%d", iomit );
SetDlgItemText( IDC_EINPUTD, m_sMinputD );
SetDlgItemText( IDC_EINCLUDED, m_sMincludeD );
SetDlgItemText( IDC_EOMITD, m_sMomitD );
UpdateWindow();
}
} // while ( 1 )
inputf.Close();
includef.Close();
omitf.Close();
m_sMinputD.Format( "%d", iinput );
m_sMincludeD.Format( "%d", iinclude );
m_sMomitD.Format( "%d", iomit );
UsSetMsg( IDC_SINPUTD, m_sMinputD );
UsSetMsg( IDC_SINCLUDED, m_sMincludeD );
UsSetMsg( IDC_SOMITD, m_sMomitD );
icount = iinclude + iomit;
if ( iinput != icount )
{
m_sMmsg.Format( "件数 合わず IN=%d, INCLUDE=%d, OMIT=%d", iinput, iinclude, iomit );
m_iErr = 40;
}
}
これで、だいたい完成です。リビルドして実行しましょう。
MVC503.exe で ブリーフケースに入れておきます。使ってみましょう。
ダウンロードはこちら
UsParaSet と OnBstart 編集できましたか?
今回は、その回答を載せます。
UsParaSetの答え
void CMVC503Dlg::UsParaSet()
{
CString swk;
int iitem;
m_iErr = 0;
m_iDisp = 1;
m_sMinputF = "";
m_sMincludeF = "";
m_sMomitF = "";
m_sMkeys = "";
swk = AfxGetApp()->m_lpCmdLine;
swk.TrimRight();
iitem = dt.DivItem( swk );
if ( iitem > 5 )
{
iitem = 5;
}
switch( iitem )
{
case 5:
m_sMkeys = dt.m_sItem[ 4 ];
m_sMkeys.TrimLeft( '"' );
m_sMkeys.TrimRight( '"' );
case 4:
m_sMomitF = dt.m_sItem[ 3 ];
m_sMomitF.TrimLeft( '"' );
m_sMomitF.TrimRight( '"' );
case 3:
m_sMincludeF = dt.m_sItem[ 2 ];
m_sMincludeF.TrimLeft( '"' );
m_sMincludeF.TrimRight( '"' );
case 2:
m_sMinputF = dt.m_sItem[ 1 ];
m_sMinputF.TrimLeft( '"' );
m_sMinputF.TrimRight( '"' );
case 1:
m_iDisp = atoi( dt.m_sItem[ 0 ] );
default:
break;
} // switch( iitem )
}
OnBstartの答え
void CMVC503Dlg::OnBstart()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString swk;
int iwk;
UpdateData( TRUE );
UsParaChk();
if ( m_iErr != 0 )
{
UsEndChk();
return;
}
iwk = GetDlgItemText( IDC_STITLE, swk );
so.SysSet( swk );
UsSetMsg( IDC_SINPUTF, m_sMinputF );
UsSetMsg( IDC_SINCLUDEF, m_sMincludeF );
UsSetMsg( IDC_SOMITF, m_sMomitF );
UsSetMsg( IDC_SKEYS, m_sMkeys );
m_sMmsg = "メイン処理 開始";
SetDlgItemText( IDC_EMSG, m_sMmsg );
m_pCurpos = GetDlgItem( IDC_EMSG );
GotoDlgCtrl( m_pCurpos );
UsMain();
UsEndChk();
}
今日は、ここまでです。
今回は、その回答を載せます。
UsParaSetの答え
void CMVC503Dlg::UsParaSet()
{
CString swk;
int iitem;
m_iErr = 0;
m_iDisp = 1;
m_sMinputF = "";
m_sMincludeF = "";
m_sMomitF = "";
m_sMkeys = "";
swk = AfxGetApp()->m_lpCmdLine;
swk.TrimRight();
iitem = dt.DivItem( swk );
if ( iitem > 5 )
{
iitem = 5;
}
switch( iitem )
{
case 5:
m_sMkeys = dt.m_sItem[ 4 ];
m_sMkeys.TrimLeft( '"' );
m_sMkeys.TrimRight( '"' );
case 4:
m_sMomitF = dt.m_sItem[ 3 ];
m_sMomitF.TrimLeft( '"' );
m_sMomitF.TrimRight( '"' );
case 3:
m_sMincludeF = dt.m_sItem[ 2 ];
m_sMincludeF.TrimLeft( '"' );
m_sMincludeF.TrimRight( '"' );
case 2:
m_sMinputF = dt.m_sItem[ 1 ];
m_sMinputF.TrimLeft( '"' );
m_sMinputF.TrimRight( '"' );
case 1:
m_iDisp = atoi( dt.m_sItem[ 0 ] );
default:
break;
} // switch( iitem )
}
OnBstartの答え
void CMVC503Dlg::OnBstart()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString swk;
int iwk;
UpdateData( TRUE );
UsParaChk();
if ( m_iErr != 0 )
{
UsEndChk();
return;
}
iwk = GetDlgItemText( IDC_STITLE, swk );
so.SysSet( swk );
UsSetMsg( IDC_SINPUTF, m_sMinputF );
UsSetMsg( IDC_SINCLUDEF, m_sMincludeF );
UsSetMsg( IDC_SOMITF, m_sMomitF );
UsSetMsg( IDC_SKEYS, m_sMkeys );
m_sMmsg = "メイン処理 開始";
SetDlgItemText( IDC_EMSG, m_sMmsg );
m_pCurpos = GetDlgItem( IDC_EMSG );
GotoDlgCtrl( m_pCurpos );
UsMain();
UsEndChk();
}

