『MSS(経営支援システム)のためのインタフェース (界面)』の設計
『MSS(経営支援システム)のためのインタフェース(界面)』がどのようになる のかを考えてみましょう。

 
【参考資料1】

MDI 界面。

企画名 MSS

表示クラスの形式は、「CFormView」
 

1)別々の作業をする窓(対話箱)を3つ 「Describe」、「Run」、「Goalseek」作成する。

(※)但し、作業は未だ始めないで、まず、以下の説明を読んで下さい。
「DESCRIBE」 について次のような対話箱を作成し、図のような「制御」(「ボタン」、「編集箱」(edit box)、「文字列」(static edit box)など)を配置する。

(※)『「Vc.d」ファイルの内容が、「変数→モデル」編集箱に表示される』と言う質問があ りました。原因は「編集箱識別番号」の指定の仕方にあります。後述してあるプログラムの修正の関係で、「編集箱識別番号」の指定は以下のように指定して下 さい。

 
「編集箱の属性(property)」対話箱を開いて、「編集箱識別番号」を指定します。

「コモン → 変数」編集箱の場合の例

同様にして、
編集箱識別番号
副メニュー見出し
編集箱識別番号
コモン → 変数
IDC_EDIT1
変数→モデル
IDC_EDIT2
ナリオ番号→データファイル名
IDC_EDIT3
(1/11/2001追加)
 

「RUN」 についても、対話箱を作成する。
「GOALSEEK」 についても、対話箱を作成する。

2)資源窓では、各種の「資源」(「対話箱」、 「絵文字」、「メニュー」、「文字列」など)を用意します。

(注意)「子供枠」のうち、1番目の「子供枠」 (Describe用)のための各種「資源」は、「MDI界面(インタフェース)」の場合には、標準処理として、自動的に用意されている。
  従って、2番目の「子供枠」(Run用)と、 3番目の「子供枠」(Goalseek用)のための、「メニュー」、「絵文字」、「文字列」を用意すれば 良い。

(※)「用意する」と言っても、この段階での用意は、各種「資源」の「雛形」 だけを用意することを言います。それぞれの「対話箱」独自の「資源の作成」は、この段階の「雛形」を用意した後に、作成することになります。
3)ここから具体的な作業に入ります。
    3.0)企画「MSS」の生成

    Visual C++ 起動する

    Visual C++ [メニュー]→[ファイル]→[新規作成]を選択。以下の指定をする。


     

    この新規企画情報を複写して、「XXXMemo.txt」として、フォルダ「MSS」に保存 しておく。
     

    3.1)既に出来上がっている「「標準的な」(1番目の)子供枠」の対話箱を利 用して「2番目の対話箱」を用意する。
     

  1. 「「標準的な」(1番目の)子供枠」: (「DESCRIBE」用)で自動的に用意されている「対話箱」に、識別名「IDD_MSS_FORM」が既に付されていることを確認しよう。

  2.  
  3. 「2番目の子供枠」:(「RUN」用)の 「対話箱」を以下の手順で用意する。

  4.  
    1. 「資源窓」を開き、「対話箱」をクリックする。
    2. [+]印を開くと、既に用意されている「対話箱」が表示されている。
    3. IDD_MSS_FORM」の「対話箱」を確認したら、その「対話箱」をクリックする。
    4. そのまま、[「Visual C++」メニュー]→[編集]→[複写](或は、「複製」([Ctrl]+C))
    5. そのまま、[「Visual C++」メニュー]→[編集]→[貼付け](或は、「貼付け」([Ctrl]+V)に)
    6. 「2番目の子供枠」(「RUN」用)の 「対話箱」が生成され、識別名「IDD_MSS_FORM1」発行された事を確認しよう。

    7.  
  5. 同様にして「3番目の子供枠」: (「GOALSEEK」用)のを用意し、識別名がIDD_MSS_FORM2」となっていることを確認しよう。
  1. 1)別々の作業をする窓(対話箱) に示されている図に従って、対話箱を設計して行こう。

  2.  
    1. 「資源窓」を開き、識別名「IDD_MSS_FORM」の「対話箱」をダブ ルクリックする。

    2.  
    3. 図に従って、各種「制御」を配置して行く。
  3. 同様にして、他の2つの「対話箱」も設計する。
4)資源窓の「メニュー」を開き、3)のやり方と同様に 「子供枠」用の3つの「メニュー」識別番号IDR_MSSTYPE」「IDR_MSSTYPE1」「IDR_MSSTYPE2を用意する。
        識別番号は、IDR_MSSTYPE
                         IDR_MSSTYPE1
                         IDR_MSSTYPE2

    (※)「メニュー」の設計は、次例に従う。

    IDR_MSSTYPEの識別番号のメニューでは、後の例題のために、dropdown menuの中の項目「コモン → 変数」に対して「副メニュー識別番号」(「IDM_COMMON_TO_VAR」)を与えておいて下さい。(「属性窓」を開いてこの設定を行ないます。)
    同様にして、項目「変数→モデル」、「シナリオ番号→データファイル名」に対してそれぞれ、 「IDM_VAR_TO_MODEL」、「IDM_COM_SCENARIO_TO_DATAFILE」なる「副メニュー識別番号」を与える。
メニュー識別番号
副メニュー見出し
副メニュー識別番号
コモン → 変数
IDM_COMMON_TO_VAR
変数→モデル
IDM_VAR_TO_MODEL
ナリオ番号→データファイル名
IDM_COM_SCENARIO_TO_DATAFILE
 
5)資源窓の「絵文字」を開き、3)のやり方と同様に 「子供枠」用の3つの「絵文字」識別番号IDR_MSSTYPE」「IDR_MSSTYPE1」「IDR_MSSTYPE2を用意する。
        識別番号は、IDR_MSSTYPE
                         IDR_MSSTYPE1
                         IDR_MSSTYPE2

    (※)「絵文字」の図柄、図案は、各自の美意識で行う。
     

6)資源窓の「文字列」を開き、[String Table]をダブルクリックする。表が表示されるので、識別番号IDR_MSSTYPEを探してクリックする。3)のやり方と同様に「子供枠」用の他の2つの「文字列」識別番号IDR_MSSTYPE1」「IDR_MSSTYPE2を用意する。
(※)文字列の編集は以下のようにする。
(※)「IDR_MSSTYPE」(Describe用)文字列の編集は以下のようにする。
文字列
資源識別番号
文字列
IDR_MSSTYPE
\nDescribe\nDescribe\nFile (*.d)\n.d\nMSS.Document\nMSS Document
IDR_MSSTYPE1
\nRun\nRun\nCfin1 File (*.dat)\n.dat\nCfin1.dat\nCfin1 data
IDR_MSSTYPE2
\nGoalseek\nGoalseek\nCfin1 File (*.pro)\n.pro\nMSS2.Document\nMSS2 Document
 
7)「組(class)」を生成する。
7-1)「Run」用の「対話箱」から、「ClassWizard」を呼び出 し、「View」のクラスを選択し、基底組を「CFormView」として、「CMSS1View」を生成する。

7-2)「Goalseek」用の「対話箱」から、「ClassWizard」を呼び出し、 「View」のクラスを選択し、基底組を「CFormView」として、「CMSS2View」を生成する。
 


8)これ以降は、「MSS.cpp」の中の「命令地図」 に、追加・修正をすれば良い。
 

// MSS.cpp : アプリケーション用クラスの機能定義を行います。
//

#include "stdafx.h"
#include "MSS.h"

#include "MainFrm.h"
#include "ChildFrm.h"
#include "MSSDoc.h"
#include "MSSView.h"

***** 追加はじめ *****

#include "MSS1View.h"
#include "MSS2View.h"

***** 追加終わり *****

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMSSApp

BEGIN_MESSAGE_MAP(CMSSApp, CWinApp)
 //{{AFX_MSG_MAP(CMSSApp)
 ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
  //    この位置に生成されるコードを編集しないでください。
 //}}AFX_MSG_MAP
 // 標準のファイル基本ドキュメント コマンド
 ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
 ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
 // 標準の印刷セットアップ コマンド
 ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMSSApp クラスの構築

CMSSApp::CMSSApp()
{
 // TODO: この位置に構築用コードを追加してください。
 // ここに InitInstance 中の重要な初期化処理をすべて記述してください。
}

/////////////////////////////////////////////////////////////////////////////
// 唯一の CMSSApp オブジェクト

CMSSApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CMSSApp クラスの初期化

BOOL CMSSApp::InitInstance()
{
 AfxEnableControlContainer();

 // 標準的な初期化処理
 // もしこれらの機能を使用せず、実行ファイルのサイズを小さく
 //  したければ以下の特定の初期化ルーチンの中から不必要なもの
 //  を削除してください。

#ifdef _AFXDLL
 Enable3dControls();   // 共有 DLL の中で MFC を使用する場合にはここを呼び出してください。
#else
 Enable3dControlsStatic(); // MFC と静的にリンクしている場合にはここを呼び出してください。
#endif

 // 設定が保存される下のレジストリ キーを変更します。
 // 会社名または所属など、適切な文字列に
 // 変更してください。
 SetRegistryKey(_T("Local AppWizard-Generated Applications"));

 LoadStdProfileSettings();  // 標準の INI ファイルのオプションをロー爪します (MRU を含む)

 // アプリケーション用のドキュメント テンプレートを登録します。ドキュメント テンプレート
 //  はドキュメント、フレーム ウィンドウとビューを結合するために機能します。

 CMultiDocTemplate* pDocTemplate;
 pDocTemplate = new CMultiDocTemplate(
  IDR_MSSTYPE,
  RUNTIME_CLASS(CMSSDoc),
  RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム
  RUNTIME_CLASS(CMSSView));
 AddDocTemplate(pDocTemplate);

// CMultiDocTemplate* pDocTemplate;

***** 修正はじめ *****
 pDocTemplate = new CMultiDocTemplate(
  IDR_MSSTYPE1,
  RUNTIME_CLASS(CMSSDoc),
  RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム
  RUNTIME_CLASS(CMSS1View));
 AddDocTemplate(pDocTemplate);

 pDocTemplate = new CMultiDocTemplate(
  IDR_MSSTYPE2,
  RUNTIME_CLASS(CMSSDoc),
  RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム
  RUNTIME_CLASS(CMSS2View));
 AddDocTemplate(pDocTemplate);
***** 修正終わり *****
 

【参考資料2】
 

対話箱の中にファイルを入力。

「連続の方法」を使用する。

[A]「頭書き(header)ファイル」の変更
 

1)CMSSViewクラスに、メンバ変数を定義する。
メンバ変数は、「編集箱(editbox)」で使用する「書類 (Document)」としての「文書」や「画像」と、それらの中身を表示したものである「表示(view)」とを結び付けるために、「編集箱 (editbox)」に付随させる、対話箱特有のメンバ変数である

これを用いると、「書類」と「表示」との連携が簡単に行なえるのと、いろいろの「検査・ 確認」作業がシステムによって系統的に誂えられる。

「ClassWizard」を開き、見出し「メンバ変数」を選択する。

クラス名:「CMSSView」
制御識別番号: 「IDC_EDIT1」
を指定したら、[変数の追加]ボタンを押す。

「変数の追加」対話箱が現れるので、
 

メンバ変数: 「m_vc_d」
範疇: 「値」
変数の型: 「CString」


を設定して[OK]ボタンを押す。

一つ前の「変数の追加」対話箱に戻り、「IDC_EDIT1」に付随するもう1つの「メ ンバ変数」を追加する。

メンバ変数: 「m_vc_focus」
範疇: 「コントロール」
変数の型: 「CEdit」
同様にして、「IDC_EDIT2」、「IDC_EDIT3」にも付随する「メンバ変数」を以 下のように定義する。

このようにして、ClassWizard の

クラス名:「CMSSView」
制御識別番号: 「IDC_EDIT1」
の下に、今定義した「制御識別番号」、「変数の型」、「メンバ変数名」が一覧表示されている事 が分かる。

 

2)CMSSDoc クラスの宣言およびインターフェイスの定義
// MSSDoc.h : CMSSDoc クラスの宣言およびインターフェイスの定義をします。
ファイルに、以下を挿入する。

// アトリビュート
public:

***** 挿入はじめ **************
 CString m_vc_d;
***** 挿入終わり **************
 
 

[B]実装ファイルの変更
1)// MSS.cpp : アプリケーション用クラスの機能定義を行います。

1-1)以下を挿入する

***** 挿入はじめ **************
#include "MSS1View.h"
#include "MSS2View.h"
***** 挿入終わり **************

/////////////////////////////////////////////////////////////////////////////
// CMSSApp コマンド

1-2)以下を挿入する。ただし、挿入は、次の2段階で行う。
1)「ClassWizard」を開き、見出し「伝言地図」を選択する。

クラス名:「CMSSApp」
対象識別番号: 「IDM_COMMON_TO_VAR」
伝言:「COMMAND」


を指定したら、[関数の追加]ボタンを押す。
次に、[命令の編集]ボタンを押す。
編集画面に2)に示されている「クラスメンバ関数OnCommonToVar」の個所が表示されてい る。

2)「クラスメンバ関数OnCommonToVar」に以下の個所を挿入する。
void CMSSApp::OnCommonToVar()
{

 // TODO: この位置にコマンド ハンドラ用のコードを追加してください
***** 挿入はじめ **************
 OnFileOpen();

或は、

 CString strFileName="S:\\演習1\\Vc.d";
 CWinApp::OpenDocumentFile(strFileName);
***** 挿入終わり **************
  }

2)// MSSDoc.cpp : CMSSDoc クラスの動作の定義を行います。
ファイル読込みのための「連続化用メンバ関数」「CMSSDoc::Serialize (CArchive& ar)」
に、以下の個所を挿入しなさい。

/////////////////////////////////////////////////////////////////////////////
// CMSSDoc シリアライゼーション

void CMSSDoc::Serialize(CArchive& ar)
{
 if (ar.IsStoring())
 {
  // TODO: この位置に保存用のコードを追加してください。
 }
 else
 {
  // TODO: この位置に読み込み用のコードを追加してください。
***** 挿入はじめ **************
  CString buf;
  while(ar.ReadString(buf)){
  if (buf.GetLength()>0 && buf[0] == '\x1a') break;
  m_vc_d = m_vc_d + buf + "\x0d\x0a";
  }
***** 挿入終わり **************

 }
}

3)CMSSView クラスの修正
/////////////////////////////////////////////////////////////////////////////
// CMSSView クラスのメッセージ ハンドラ

3-1)以下を挿入する。ただし、挿入は、次の2段階で行う。
1)「ClassWizard」を開き、見出し「伝言地図」を選択する。
 

クラス名:「CMSSView」
対象識別番号: 「CMSSView」
伝言:「OnUpdate」


を指定したら、[関数の追加]ボタンを押す。
次に、[命令の編集]ボタンを押す。
編集画面に2)に示されている「クラスメンバ関数OnUpdate」の個所が表示されている。

2)「クラスメンバ関数OnUpdate」に以下の個所を挿入する。

void CMSSView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
 // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
***** 挿入はじめ **************
 OnUpdateEdit1();
***** 挿入はじめ **************

}

3-2)以下を挿入する。ただし、挿入は、次の2段階で行う。
1)「ClassWizard」を開き、見出し「伝言地図」を選択する。
 

クラス名:「CMSSView」
対象識別番号: 「IDC_EDIT1」
伝言:「EnUpdate」


を指定したら、[関数の追加]ボタンを押す。
次に、[命令の編集]ボタンを押す。
編集画面に2)に示されている「クラスメンバ関数OnUpdateEdit1」の個所が表示されてい る。

2)「クラスメンバ関数OnUpdateEdit1」に以下の個所を挿入する。
 

void CMSSView::OnUpdateEdit1()
{
 // TODO: これが RICHEDIT コントロールの場合、コントロールは、 lParam マスク
 // 内での論理和の ENM_UPDATE フラグ付きで EM_SETEVENTMASK
 // メッセージをコントロールへ送るために CFormView::OnInitDialog() 関数をオーバー
 // ライドしない限りこの通知を送りません。

 // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください

***** 挿入はじめ **************
    CMSSDoc* myDoc = (CMSSDoc*)GetDocument();
 m_vc_d = myDoc->m_vc_d;
 UpdateData(FALSE);

***** 挿入終わり **************

}

void CMSSView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
 // TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
 OnUpdateEdit1();

}

伝言地図によって生成される関数
 ON_COMMAND(IDM_COMMON_TO_VAR, OnCommonToVar)

以下のメンバ関数は、後続の演習時に手掛けます。

 ON_COMMAND(IDM_VAR_TO_MODEL, OnVarToModel)
 ON_COMMAND(IDM_COM_SCENARIO_TO_DATAFILE, OnComScenarioToDatafile)