
半年以上 経ってしまいました。
それでも、毎週 だいたい 100人 くらい の方から アクセスしていただいております。 ありがとうございます。
ここらへんがわかりにくい とか ここをもっとくわしく とか 簡単すぎる とか ご意見 いただけたら と 思います。 待ってます。
それでは、開始します。
ファイルを読み込みの部分を 書いていく途中でした。 前回は CStringArrayの変数を DeleteContent で クリア するところまで 書いています。
この ドキュメントクラスの DeleteContent は 呼び出して やらなくても起動時と終了時に 1回 走ってくれます。便利です。
本題に 入る前に ドキュメントクラス に 変数2つ 追加してください。
CString m_sDataF1;
CString m_sMsg;
それでは ドキュメントクラスに OnFileOpen 関数 を 追加します。
1 Ctrl + W で MFC ClassWizard ダイアログ を 表示させます。
2 クラス名 を CUri201Doc に 変更して
3 オブジェクトID から ID_FILE_OPEN を クリック
4 メッセージ から COMMAND を クリック
5 関数の追加 ボタン を クリック
6 メンバ関数名 が OnFileOpen になっていることを確認して OK
7 コード編集 ボタンを クリック
です。
すると
void CURI201Doc::OnFileOpen()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
}
↑ こんなの が できます。
ここに、次のように 書きます。
void CURI201Doc::OnFileOpen()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CStdioFile dataf;
CFileException fex;
BOOL success;
CString sbuf, stky, smky, swk, swk0, swk1, swk2;
int iitem, icount, ierr;
if ( !dataf.Open( m_sDataF1, CFile::modeRead, &fex ) )
{
m_sMsg.Format( "新規作成 です。 %s", m_sDataF1 );
return;
}
smky = "000000000000"; // 日付 6 桁 + レジNo 3 桁 + 区分 3 桁
icount = 0;
ierr = 0;
BeginWaitCursor();
while( 1 )
{
success = dataf.ReadString( sbuf );
if ( success == NULL || success == FALSE )
{
break;
}
icount++;
iitem = dt.DivItem( sbuf );
swk = dt.m_sItem[ 0 ]; // 日付
swk.TrimLeft();
swk0.Format( "%06s", swk );
swk = dt.m_sItem[ 1 ]; // レジNo
swk.TrimLeft();
swk1.Format( "%03s", swk );
swk = dt.m_sItem[ 2 ]; // 区分
swk.TrimLeft();
swk2.Format( "%03s", swk );
stky = swk0 + swk1 + swk2;
if ( stky > smky )
{
m_saData.Add( sbuf );
m_saDatakey.Add( stky );
smky = stky;
}
else
{
m_sMsg.Format( "データ Seq おかしい。 終了します。 %s, seq = %d", stky, icount );
ierr = 1;
break;
}
} // while( 1 )
dataf.Close();
EndWaitCursor();
m_iData = m_saData.GetSize();
icount = m_saDatakey.GetSize();
if ( m_iData != icount )
{
m_sMsg.Format( "データ と キィー の数が違います。読み込みデータ 破棄します。" );
ierr = 1;
}
if ( ierr != 0 )
{
DeleteContents();
return;
}
m_sMsg.Format( "データ %d 件 読込ました。", m_iData );
return;
}
リビルド して エラー が でなかったら OK です。
今日は ここで 終了です。