『MSS(経営支援システム)のためのインタフェース(界面)』がどのようになる のかを考えてみましょう。
【参考資料1】MDI 界面。
企画名 MSS
表示クラスの形式は、「CFormView」
1)別々の作業をする窓(対話箱)を3つ 「Describe」、「Run」、「Goalseek」作成する。
(※)但し、作業は未だ始めないで、まず、以下の説明を読んで下さい。「DESCRIBE」 について次のような対話箱を作成し、図のような「制御」(「ボタン」、「編集箱」(edit box)、「文字列」(static edit box)など)を配置する。
(※)『「Vc.d」ファイルの内容が、「変数→モデル」編集箱に表示される』と言う質問があ りました。原因は「編集箱識別番号」の指定の仕方にあります。後述してあるプログラムの修正の関係で、「編集箱識別番号」の指定は以下のように指定して下 さい。
「編集箱の属性(property)」対話箱を開いて、「編集箱識別番号」を指定します。「コモン → 変数」編集箱の場合の例
同様にして、
(1/11/2001追加)
編集箱識別番号 副メニュー見出し 編集箱識別番号 コモン → 変数 IDC_EDIT1 変数→モデル IDC_EDIT2 ナリオ番号→データファイル名 IDC_EDIT3
「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番目の)子供枠」: (「DESCRIBE」用)で自動的に用意されている「対話箱」に、識別名「IDD_MSS_FORM」が既に付されていることを確認しよう。
- 「2番目の子供枠」:(「RUN」用)の 「対話箱」を以下の手順で用意する。
- 「資源窓」を開き、「対話箱」をクリックする。
- [+]印を開くと、既に用意されている「対話箱」が表示されている。
- 「IDD_MSS_FORM」の「対話箱」を確認したら、その「対話箱」をクリックする。
- そのまま、[「Visual C++」メニュー]→[編集]→[複写](或は、「複製」([Ctrl]+C))
- そのまま、[「Visual C++」メニュー]→[編集]→[貼付け](或は、「貼付け」([Ctrl]+V)に)
- 「2番目の子供枠」(「RUN」用)の 「対話箱」が生成され、識別名「IDD_MSS_FORM1」発行された事を確認しよう。
- 同様にして「3番目の子供枠」: (「GOALSEEK」用)のを用意し、識別名が「IDD_MSS_FORM2」となっていることを確認しよう。
4)資源窓の「メニュー」を開き、3)のやり方と同様に 「子供枠」用の3つの「メニュー」識別番号「IDR_MSSTYPE」「IDR_MSSTYPE1」「IDR_MSSTYPE2」を用意する。
- 1)別々の作業をする窓(対話箱) に示されている図に従って、対話箱を設計して行こう。
- 「資源窓」を開き、識別名「IDD_MSS_FORM」の「対話箱」をダブ ルクリックする。
- 図に従って、各種「制御」を配置して行く。
- 同様にして、他の2つの「対話箱」も設計する。
IDR_MSSTYPE1
識別番号は、IDR_MSSTYPE
IDR_MSSTYPE2(※)「メニュー」の設計は、次例に従う。
IDR_MSSTYPEの識別番号のメニューでは、後の例題のために、dropdown menuの中の項目「コモン → 変数」に対して「副メニュー識別番号」(「IDM_COMMON_TO_VAR」)を与えておいて下さい。(「属性窓」を開いてこの設定を行ないます。)
同様にして、項目「変数→モデル」、「シナリオ番号→データファイル名」に対してそれぞれ、 「IDM_VAR_TO_MODEL」、「IDM_COM_SCENARIO_TO_DATAFILE」なる「副メニュー識別番号」を与える。
|
|
|
|
|
|
|
|
5)資源窓の「絵文字」を開き、3)のやり方と同様に 「子供枠」用の3つの「絵文字」識別番号「IDR_MSSTYPE」「IDR_MSSTYPE1」「IDR_MSSTYPE2」を用意する。6)資源窓の「文字列」を開き、[String Table]をダブルクリックする。表が表示されるので、識別番号「IDR_MSSTYPE」を探してクリックする。3)のやり方と同様に「子供枠」用の他の2つの「文字列」識別番号「IDR_MSSTYPE1」「IDR_MSSTYPE2」を用意する。
IDR_MSSTYPE1
識別番号は、IDR_MSSTYPE
IDR_MSSTYPE2(※)「絵文字」の図柄、図案は、各自の美意識で行う。
(※)文字列の編集は以下のようにする。
(※)「IDR_MSSTYPE」(Describe用)文字列の編集は以下のようにする。
- 表中の識別番号をダブルクリックして、編集対話箱を開く。
- 「キャプション」に表示されている各「子供枠」用の「文字列」を以下のように修正する。
- 修正が終わったら、対話箱右上の[x]ボタンをクリックする。
[修正内容]
- IDR_MSSTYPE → Describe 「\nDescribe\nDescribe\n\n\nMSS.Document\nMSS 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/////////////////////////////////////////////////////////////////////////////
// CMSSAppBEGIN_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」同様にして、「IDC_EDIT2」、「IDC_EDIT3」にも付随する「メンバ変数」を以 下のように定義する。
範疇: 「コントロール」
変数の型: 「CEdit」このようにして、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_VAR_TO_MODEL, OnVarToModel)
ON_COMMAND(IDM_COM_SCENARIO_TO_DATAFILE, OnComScenarioToDatafile)