goo blog サービス終了のお知らせ 

Visual C# 2005で仕事しよう

Visual C# 2005 を使って小売業で 使えるプログラムを作成する

MFC VC++6.0 で仕事しよう!No.27

2005年03月31日 16時38分12秒 | Weblog

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



 どのような企業でも、自分のところで入力する「入力フォーム」というのがあります。

商品マスター、従業員マスター、資産マスター・・・

とにかく、始めにだれかが入力しないと仕事になりません。

 この、ブログで よく使用した 郵便番号住所データ KEN_ALL.txt も 誰かが、入力してくれたのです。入力してくれた方、ありがとうございます。



 来年度から、MFCを使って、入力フォームを作成していきます。どのような、入力フォームを作るかは今から考えます。



 エクセルやデータベースで入力フォームを作成されている企業の担当者必見です。



 今日は、棚卸しなのでここまでにします。

MFC VC++6.0 で仕事しよう!No.26

2005年03月25日 14時37分32秒 | Weblog
条件で抽出するプログラムも もうすぐ完成です。

後は、セットフォーカスを記述すれば出来上がりです。ウィザードから各セットフォーカスを追加します。

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

ここまで書いたら、保存してダブルクリックです!!


デスクトップに、香川県がでてきたら 大成功 です。



今日は、ここまでです。

MFC VC++6.0 で仕事しよう!No.25

2005年03月24日 09時32分49秒 | Weblog
関数作成の続きをやります。

まずは、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 で ブリーフケースに入れておきます。使ってみましょう。


ダウンロードはこちら

MFC VC++6.0 で仕事しよう!No.24

2005年03月18日 15時25分00秒 | Weblog
 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();
}



今日は、ここまでです。