[目次]

 1.概要 ----------------------------------------------------------------- 1

 2.C++言語ソースファイル   2.1 派生クラス宣言ファイル (mfdb_cls.h) ---------------------- 2
  2.2 メンバ関数定義ファイル (mfdb .cpp) -------------------- 5
  2.3 シンボル定義ファイル (mfdb_def.h) ---------------------- 26
  2.4 将来の拡張用関数定義ファイル (mfdb_ft .cpp) -------------------- 30

 3.その他のファイル
  3.1 実行形式定義ファイル (mfdb.def) ------------------------ 31
  3.2 リソース定義ファイル (mrdb.rc )-------------------------- 31

 4.データファイル (failures.txt) -------------------- 32

 参考文献 ----------------------------------------------------------------- 35


1.概要

 MIRS障害データベースは、1994年度の卒業研究1)〜2)において、BORLAND 社の Turbo C++ for Windows ver 3.13)〜5) で作成された。

 この「MIRS障害データベースのソースファイル」は、以下の各ファイルを収録する。

 MIRS障害データベースを構築するには、上のファイルのほかに、

が必要であるが、バイナリ形式であるため、ここには収録しない。

 これらのファイルは、3月22日現在、以下のディレクトリに収められている。
  sun:/home3/sawa/project/grd_rep/list/mfdb/
moon:/mirs/mirs94/vpro94/tp/mfdb/



2.C++言語ソースファイル

2.1 派生クラス宣言ファイル (mfdb_cls.h )

//	mfdb_cls.h  MIRS障害データベース 派生クラス宣言ファイル

//									Mar. 22, 1995

#ifndef	__MFDB_CLASS_H
# define	__MFDB_CLASS_H

#pragma		hdrfile	"mfdb.sym"

#include	
#include	
#include	
#include	

#pragma		hdrstop
#include	"mfdb_def.h"



//			派生クラスの宣言


class	MfdbBaseWindow : public TWindow			/*	メインウィンドウ1	*/
{
 public:
	int	BaseMax;		/*	メインウィンドウで 選べる項目の数		*/
	BOOL	NoneData;		/*  何も表示するべきものがないことを示すフラグ	*/

	MfdbBaseWindow(PTWindowsObject , LPSTR) ;
	~MfdbBaseWindow();

 private:
	virtual LPSTR	GetClassName();		/*	オーバーロードした仮想関数	*/
	virtual void	Paint(HDC,PAINTSTRUCT&) ;

	int		GetCircuitName() ;   /*	回路・ボード名を配列に格納する	*/

	int		y_Circuit(int);
		/*	マウスのクリック位置から、選択された項目の番号を計算する	*/

	virtual void	WMLButtonDown(RTMessage Msg) = [WM_FIRST + WM_LBUTTONDOWN];
	 	/*	マウスをクリックした時呼び出される関数		*/

	virtual void	EndButtonDown(RTMessage Msg) = [ID_FIRST + BaseBtn + EndButton];
		/*	 終了 ボタンを押した時 呼び出される関数	*/
} ;
class	MfdbSel1Window : public TWindow			/*	選択ウィンドウ1	*/
{
 public:
	int	Sel1Max;		/*	選択ウィンドウ1で 選べる項目の数		*/
	BOOL	NoneData;		/*  何も表示するべきものがないことを示すフラグ	*/

	MfdbSel1Window(PTWindowsObject , LPSTR) ;
	~MfdbSel1Window() ;

 private:

	virtual LPSTR	GetClassName();		/*	オーバーロードした仮想関数	*/
	virtual BOOL	CanClose();
    virtual void	CloseWindow();
	virtual void	Paint(HDC,PAINTSTRUCT&) ;

	int		GetPartName();			/*	部分名を配列に格納する	*/

	int		y_Part(int);
		/*	マウスのクリック位置から、選択された項目の番号を計算する	*/

	virtual void	WMLButtonDown(RTMessage Msg) = [WM_FIRST + WM_LBUTTONDOWN];
		/*	マウスをクリックした時呼び出される関数		*/

	virtual void	Sel1Close(RTMessage Msg)     = [ID_FIRST + Sel1Btn + EndButton];
		/*	 戻る ボタンを押した時 呼び出される関数	*/
} ;


class	MfdbSel2Window : public TWindow			/*	選択ウィンドウ2	*/
{
 public:
	MfdbSel2Window(PTWindowsObject , LPSTR) ;
	~MfdbSel2Window() ;

 private:
	int		Sel2Max;	/*	選択ウィンドウ2で 選べる項目の数		*/
	BOOL	NoneData;		/*  何も表示するべきものがないことを示すフラグ	*/

	virtual LPSTR	GetClassName();		/*	オーバーロードした仮想関数	*/
	virtual BOOL	CanClose();
	virtual void	CloseWindow();
	virtual void	Paint(HDC,PAINTSTRUCT&);

	int		GetFailureName();		/*	症状名を配列に格納する	*/
 
	int		y_Failure(int);
		/*	マウスのクリック位置から、選択された項目の番号を計算する	*/

	virtual void	AllButtonDown(RTMessage Msg) = [ID_FIRST + Sel2Btn + AllButton];
		/*	全部表示ボタンを押した時 呼び出される関数	*/

	virtual void	WMLButtonDown(RTMessage Msg) = [WM_FIRST + WM_LBUTTONDOWN];
		/*	マウスをクリックした時  呼び出される関数	*/

	virtual void	Sel2Close(RTMessage Msg)     = [ID_FIRST + Sel2Btn + EndButton];	
		/*	 戻る ボタンを押した時 呼び出される関数	*/
} ;


class	MfdbDispWindow : public TWindow			/*	説明ウィンドウ	*/
{
 public:
	int		DispMax;			/*	通常表示で 表示する行の数	*/

	MfdbDispWindow(PTWindowsObject , LPSTR) ;
	~MfdbDispWindow() ;

 private:

	int		CheckDispText();										/*	表示するテキストの行数を数える	*/

	virtual LPSTR	GetClassName();		/*	オーバーロードした仮想関数	*/
	virtual BOOL	CanClose();
	virtual void	CloseWindow();
	virtual void	Paint(HDC,PAINTSTRUCT&);

	virtual void	DispClose(RTMessage Msg)      = [ID_FIRST + DispBtn + EndButton];
		/*	 戻る ボタンを押した時 呼び出される関数	*/

} ;


class PushButton : public TButton                   	/*	押しボタン	*/
{
 public:
	PushButton(PTWindowsObject, int, LPSTR, int, int, int, int, BOOL, PTModule) ;	
} ;


class MfdbApply : public TApplication		/*	アプリケーションモジュール	*/
{
 public:
	MfdbApply(LPSTR , HINSTANCE , HINSTANCE , LPSTR , int) ;

 private:

	virtual void	InitApplication();		/*	オーバーロードした仮想関数	*/
	virtual void	InitInstance();
	virtual void	InitMainWindow();
	virtual BOOL	CanClose();
} ;


#endif	/*  __MFDB_CLASS_H  */


2.2 メンバ関数定義ファイル (mfdb .cpp)

//	mfdb.cpp  MIRS障害データベース メインプログラム

//									Mar. 22, 1995

#pragma		hdrfile	"mfdb.sym"

#include	
#include	
#include	
#include	

#pragma		hdrstop
#include	"mfdb_def.h"
#include	"mfdb_cls.h"


//	グローバル変数の定義


int		Circuit,		/*	現在注目しているボード・回路の番号	*/
		Part,           	/*	現在注目している    部分    の番号	*/
		Failure;		/*	現在注目している    症状  の番号	*/


	/*	ウィンドウを指すポインタ		*/

MfdbSel1Window		*Sel1Win;
MfdbSel2Window		*Sel2Win;
MfdbDispWindow		*DispWin;


	/*	アプリケーションモジュールを指すポインタ	*/

PTApplication		Sel1Apply,
			Sel2Apply,
			DispApply;


	/*	ウィンドウの存在を示すフラグ	*/

BOOL		BeSel1Win = FALSE,		       /*	選択ウィンドウ1	*/
		BeSel2Win = FALSE,			/*	選択ウィンドウ2	*/
		BeDispWin = FALSE;			/*	説明ウィンドウ		*/

char	ModulePath[MoPathLen];		/*	MFDBの実行形式のパス	*/

ifstream 	fpFail;			/*	症状データファイルの ストリーム		*/

char	DispFlg = dNormal;	/*	表示状態を表すフラグ	*/
BOOL	DispAll  = FALSE;	/*	全部表示ボタンが押されたか	*/
BOOL	NowBasic = TRUE;	/*	最初の注意を表示しているか	*/
/*	データ格納用の配列	*/

char	CircuitName[cFirstCirct+ CircMax][CiNameLen],   /*	回路・ボード名		*/
		PartName[PartMax][PaNameLen],            /*		部分名		*/
		FailureName[FailMax][FaNameLen],         /*		症状名      	*/
		DispText[DispTextLen];                   /*		説明文1行	*/


/*	ファイルポインタの登録のための配列	*/
												 
long	FPCircuit[CircMax],                      		/*	回路・ボード	*/
		FPPart[PartMax],                         	/*	部分		*/
		FPFailure[FailMax];                      	/*	症状 		*/



//	コンストラクタ と デストラクタ の定義


MfdbBaseWindow::
MfdbBaseWindow(PTWindowsObject agParent , LPSTR agTitle)
 : TWindow(agParent , agTitle)
{
	/*	ウィンドウの位置・大きさ	*/
	Attr.X = Base_X ; Attr.Y = Base_Y ; Attr.W = Base_W ; Attr.H = Base_H ;	

	/*	まだ下位のウィンドウは存在しない	*/
	BeSel1Win = FALSE ; BeSel2Win = FALSE ; BeDispWin = FALSE ;

		
    /*	最初に基本的な注意を表示する	*/

	Circuit = cFirstMsg;
	NowBasic = TRUE;

		/*	終了ボタンの構築	*/
	new PushButton(this, BaseBtn + EndButton, "終了",
			 EndButton_X, EndButton_Y, EndButton_W, EndButton_H, FALSE,NULL  );

              /*	選択ウィンドウ1の構築		*/
	Sel1Win = new MfdbSel1Window(this, "MFDB − 選択1");
	Sel1Apply = GetApplication();
	Sel1Apply-> MakeWindow(Sel1Win);

	BaseMax = GetCircuitName();		/*	回路・ボード名を配列に格納	*/

		/*	選択ウィンドウ1を最前面に出す	*/
	SetWindowPos(Sel1Win -> HWindow, HWND_TOPMOST, FALSE, FALSE, FALSE, FALSE,
			SWP_SHOWWINDOW );
}


MfdbBaseWindow::~MfdbBaseWindow()
{
	fpFail.close();
}
MfdbSel1Window::
MfdbSel1Window(PTWindowsObject agParent , LPSTR agTitle)
 : TWindow(agParent , agTitle)
{
	BeSel1Win = TRUE;

	Attr.X = Sel1_X ; Attr.Y = Sel1_Y ; Attr.W = Sel1_W ; Attr.H = Sel1_H ;
	Attr.Style = WS_OVERLAPPEDWINDOW | WS_VISIBLE ;

		/*	終了ボタンの構築	*/
	new PushButton(this, Sel1Btn + EndButton, EndBtnTxt,
			 EndButton_X, EndButton_Y, EndButton_W, EndButton_H, FALSE,NULL);

	Sel1Max = GetPartName();		/*	部分名を配列に格納	*/
}


MfdbSel1Window::~MfdbSel1Window()
{
	if(NowBasic)
		NowBasic = FALSE;

	BeSel1Win = FALSE;
}


MfdbSel2Window::
MfdbSel2Window(PTWindowsObject agParent , LPSTR agTitle)
 : TWindow(agParent , agTitle)
{
	BringWindowToTop(HWindow);	/*	このウィンドウを1番前に持ってくる	*/

	BeSel2Win = TRUE;

	Attr.X = Sel2_X ; Attr.Y = Sel2_Y ; Attr.W = Sel2_W ; Attr.H = Sel2_H ;
	Attr.Style = WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL;

		/*	全部表示ボタンの構築	*/
	new PushButton(this, Sel2Btn + AllButton, AllBtnTxt,
			 AllButton_X, AllButton_Y, AllButton_W, AllButton_H, FALSE,NULL);

		/*	終了ボタンの構築	*/
	new PushButton(this, Sel2Btn + EndButton, EndBtnTxt,
			 EndButton_X, EndButton_Y, EndButton_W, EndButton_H, FALSE,NULL);

	Sel2Max = GetFailureName();		/*	症状名を配列に格納	*/
}


MfdbSel2Window::~MfdbSel2Window()
{
	BeSel2Win = FALSE;
}

MfdbDispWindow::
MfdbDispWindow(PTWindowsObject agParent , LPSTR agTitle)
 : TWindow(agParent , agTitle)
{
	BringWindowToTop(HWindow);	/*	このウィンドウを1番前に持ってくる	*/

	BeDispWin = TRUE;

	Attr.X = Disp_X ; Attr.Y = Disp_Y ; Attr.W = Disp_W ; Attr.H = Disp_H ;
	Attr.Style = 	  WS_OVERLAPPED  | WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZEBOX 
			| WS_MINIMIZEBOX | WS_VISIBLE    | WS_VSCROLL	 ;

	        /*	縦方向のスクロールバー	*/
	Scroller = new TScroller(this, 0, ScrollUnit_Y, 0, ScrollRange_Y0 );
	Scroller->AutoMode = FALSE;


		/*	終了ボタンの構築	*/
	new PushButton(this, DispBtn + EndButton, EndBtnTxt,
			 EndButton_X, EndButton_Y, EndButton_W, EndButton_H, FALSE,NULL);


	if (DispAll)			/*	表示フラグのセット	*/

		DispFlg = dAll;
	else
		DispFlg = dNormal;

	DispMax = CheckDispText();	/*	症状の説明の行数を獲得	*/

	if (DispMax == 0)
		DispFlg = dNone;
}


MfdbDispWindow::~MfdbDispWindow()
{
	BeDispWin = FALSE;

	DispFlg = dNormal;		/*	フラグを既定値に戻しておく	*/
	if (DispAll)
		DispAll = FALSE;	
}


PushButton::
PushButton(PTWindowsObject AParent , int AnId , LPSTR AText , int X, int Y, int W, int H,
		 BOOL IsDefault , PTModule AModule)
 : TButton(AParent , AnId , AText , X , Y , W , H , IsDefault , AModule)
{
}

MfdbApply::
MfdbApply(LPSTR agName, HINSTANCE aghInst, HINSTANCE aghPrevInst, LPSTR aglpCmd,
		 int agnCmdShow)
 : TApplication(agName , aghInst , aghPrevInst , aglpCmd , agnCmdShow)
{
}
//	メンバ関数の定義


/*
						クラス MfdbBaseWindow のメンバ関数
*/

LPSTR MfdbBaseWindow::GetClassName()
{
	return "MfdbBaseWindow" ;
}


void MfdbBaseWindow::Paint(HDC PaintDC,PAINTSTRUCT&)
{
	POINT	point[tKind] = {	/*	文字の表示座標	*/
	  {Base_W /2 , Title_Y },		/*	タイトルの   (x , y) 座標		*/
	  {  Msg_X   , Msg_Y   }		/*	メッセージの (x , y) 座標		*/
	};

	RECT		TitleRect;		/*	タイトルを書く長方形	*/
	int		Sel, SelY;
	HGDIOBJ		hbr, hbrOld;		/*	変更するブラシ,元のブラシ	*/
	int		BkModOld;		/*	元の背景モード			*/


		/*	タイトルの描画	*/
	GetClientRect(HWindow, &TitleRect);		/*	現在のウィンドウの幅を獲得	*/
	TitleRect.top = point[tTitle].y ;
	DrawText(PaintDC, WelcomMsg, strlen(WelcomMsg), &TitleRect, DT_CENTER );

		/*	メッセージの描画	*/
	SetTextAlign(PaintDC, TA_LEFT);
	TextOut(PaintDC, point[tMsg].x, point[tMsg].y, SelectMsg,  strlen(SelectMsg)  );



		/*	ボタンの描画	*/

	SetTextAlign(PaintDC, TA_LEFT);

	hbr = GetStockObject(LTGRAY_BRUSH);
	hbrOld = SelectObject(PaintDC, hbr);
	BkModOld = SetBkMode(PaintDC, TRANSPARENT); 	/*  背景を透過モードにする  */

	for ( Sel= cFirstMsg; Sel < BaseMax; Sel++){
		SelY = BaseBtn_Y0+(BaseButton_H + Button_spc)*Sel;

		Rectangle( PaintDC, BaseButton_X, SelY ,
				 BaseButton_X + BaseButton_W, SelY + BaseButton_H );
		TextOut(PaintDC, BaseButton_X+8, SelY + 2,
				 CircuitName[Sel], strlen(CircuitName[Sel]) );
	}

	SelectObject(PaintDC, hbrOld);
	DeleteObject(hbr);
	SetBkMode(PaintDC,BkModOld);
}
int MfdbBaseWindow::GetCircuitName()		/*	ボード・回路名を配列に格納	*/
{
	int	No;				/*	ボード・回路の数	*/
	char	CiName[DispTextLen];
	BOOL	SearchEnd = FALSE;		/*	ボード・回路名の検索を終わるか	*/


	fpFail.seekg(0);			/*	ファイルポインタを先頭に移動	*/

	No = cFirstCirct;
	while(!SearchEnd){

		if (No >= CircMax){
			MessageBox(NULL, CountOver, DataReading CannotRun, MB_ICONSTOP);
			exit(1);
        	}

		fpFail.getline(CiName,DispTextLen);

		switch(*CiName){

			case FstAttBegin:
						/*	最初の注意 表示のための準備	*/
				strcpy(CircuitName[cFirstMsg], CiName);
				FPFailure[cFirstMsg] = fpFail.tellg();
				break;

			case FileEnd:
				SearchEnd = TRUE;
				break;

			case CiBrac:
				strcpy(CircuitName[No],CiName);
                		FPCircuit[No] = fpFail.tellg();
				No++;
				break;

			default:
				break;
        	}
	}

	return No;            
}
void MfdbBaseWindow::WMLButtonDown(RTMessage Msg)
{
	int	xPos = Msg.LP.Lo,		/*	マウスのボタンが押された座標		*/
		yPos = Msg.LP.Hi;


	if( !BeSel1Win){
		if( BaseButton_X <= xPos  &&  xPos <= BaseButton_X + BaseButton_W){
			Circuit = y_Circuit(yPos);
			if( cFirstMsg <= Circuit && Circuit < BaseMax){
				if (Circuit == cFirstMsg)
                			NowBasic = TRUE;
				Sel1Win = new MfdbSel1Window(this, "MFDB − 選択1");
				Sel1Apply = GetApplication();
				Sel1Apply-> MakeWindow(Sel1Win);
			}
    		}
	}
	else {
		SetWindowPos(HWindow, Sel1Win ->HWindow, FALSE, FALSE, FALSE, FALSE,
				 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE );
		MessageBeep(-1);
	}
}


int MfdbBaseWindow::y_Circuit(int yPos)
{
	int	CirNo;

	if ( yPos > BaseBtn_Y0){
		CirNo = (yPos - BaseBtn_Y0) / (BaseButton_H + Button_spc);
		if ( (yPos- BaseBtn_Y0) % (BaseButton_H + Button_spc) > BaseButton_H )
			CirNo = -1;
	}
	else{
		CirNo = -1;
	}

	return CirNo;
}


void MfdbBaseWindow::EndButtonDown(RTMessage)
{
	if(BeSel1Win)
		SetWindowPos(Sel1Win->HWindow, HWND_NOTOPMOST, FALSE, FALSE, FALSE, FALSE,
				 SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE );

	CloseWindow();
}
/*
						クラス MfdbSel1Window のメンバ関数
*/




LPSTR MfdbSel1Window::GetClassName()
{
	return "MfdbSel1Window" ;
}



BOOL MfdbSel1Window::CanClose()
{
	return TRUE;
}


void MfdbSel1Window::CloseWindow()
{
	SetWindowPos(Parent ->HWindow, HWND_TOP, FALSE, FALSE, FALSE, FALSE,
					 SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );

	TWindowsObject::CloseWindow();
}



void MfdbSel1Window::Sel1Close(RTMessage)
{
	CloseWindow();
}



void MfdbSel1Window::Paint(HDC PaintDC,PAINTSTRUCT&)
{
	POINT	point[tKind] = {	/*	文字の表示座標	*/
	  {Sel1_W /2 , Title_Y },		/*	タイトルの   (x , y) 座標	*/
	  {    Msg_X , Msg_Y   },		/*	メッセージの (x , y) 座標	*/
	};

	RECT	TitleRect;		/*	タイトルを書く長方形	*/
    
	int		Sel, SelY;
	HGDIOBJ		hbr, hbrOld;	/*	変更するブラシ,元のブラシ	*/
	int		BkModOld;	/*	元の背景モード			*/




	if (NoneData){
		MessageBox(HWindow,NoExplain,"警告",MB_ICONEXCLAMATION);
 	       CloseWindow();
	}
		/*	タイトルの描画	*/

	GetClientRect(HWindow, &TitleRect);		/*	現在のウィンドウの幅を獲得	*/
	TitleRect.top = point[tTitle].y ;
	DrawText(PaintDC, CircuitName[Circuit], strlen(CircuitName[Circuit]),
			 &TitleRect, DT_CENTER );
		/*	メッセージの描画	*/
	SetTextAlign(PaintDC, TA_LEFT);
	if (Circuit == cFirstMsg){
		TextOut(PaintDC, point[tMsg].x ,     point[tMsg].y,
						 FirstMsg1, strlen(FirstMsg1) );
		TextOut(PaintDC, point[tMsg].x + 70, point[tMsg].y + 22,
						 FirstMsg2, strlen(FirstMsg2) );
    }
	else
		TextOut(PaintDC, point[tMsg].x,      point[tMsg].y,
						 SelectMsg,  strlen(SelectMsg)  );

		/*	ボタンの描画	*/

	SetTextAlign(PaintDC, TA_LEFT);

	hbr = GetStockObject(LTGRAY_BRUSH);
	hbrOld = SelectObject(PaintDC, hbr);
	BkModOld = SetBkMode(PaintDC, TRANSPARENT);   /*	背景を透過モードにする   */

	for ( Sel= 0; Sel < Sel1Max; Sel++){
		SelY = SelBtn_Y0+(SelButton_H + Button_spc)*Sel;

		Rectangle( PaintDC, SelButton_X, SelY ,
				 SelButton_X + Sel1Button_W, SelY + SelButton_H );
		TextOut(PaintDC, SelButton_X+8, SelY + 2,
				 PartName[Sel], strlen(PartName[Sel]) );
	}


	if(Sel1Max == 0){
		Rectangle( PaintDC, SelButton_X, SelBtn_Y0 ,
				 SelButton_X + Sel1Button_W, SelBtn_Y0 + SelButton_H );
		TextOut(PaintDC, SelButton_X+8, SelBtn_Y0 + 2,
				 GoToSel2Msg, strlen(GoToSel2Msg) );
	}


	SelectObject(PaintDC, hbrOld);
	DeleteObject(hbr);
   	SetBkMode(PaintDC,BkModOld);
}


int MfdbSel1Window::GetPartName()		/*	部分名を配列に格納	*/
{
	int		PartCt;             	/*	部分の数	*/
	char	PartText[DispTextLen];
	BOOL	SearchEnd = FALSE;		/*	部分名の検索を終わるか	*/
	BOOL	BePaBrac = FALSE ,		/*	部分名 が存在するかどうかのフラグ	*/
		BeFaBrac = FALSE ,		/*	症状名 が存在するかどうかのフラグ	*/
		BeDisp   = FALSE;		/*	説明文 が存在するかどうかのフラグ	*/
	fpFail.seekg(FPCircuit[Circuit]);

	NoneData = FALSE;
	PartCt = 0;

	while(!SearchEnd){
		if (PartCt >= PartMax){
			MessageBox(NULL, CountOver, DataReading CannotRun, MB_ICONSTOP);
			exit(1);
	       }
        	
		fpFail.getline(PartText, DispTextLen);
		switch(*PartText){
			case	Comnt:
            		case	FstAttBegin:
				break;

			case	CiBrac:
            		case	FstAttEnd:
			case	CiEnd:
			case	FileEnd:
				SearchEnd = TRUE;
				break;

			case	PaBrac:
				strcpy(PartName[PartCt], PartText);
                		FPPart[PartCt] = fpFail.tellg();
				PartCt++;
				BePaBrac = TRUE;
				break;

			case	FaBrac:
				BeFaBrac=TRUE;
				break;

			default:
                		BeDisp = TRUE;
				break;
		}
	}

	if(!BePaBrac){
		FPPart[0] = FPCircuit[Circuit];

		if(!BeFaBrac){
			FPFailure[0] = FPCircuit[Circuit];

			if(!BeDisp){
				NoneData = TRUE;
			}
        	}
	}

	return PartCt;
}
void MfdbSel1Window::WMLButtonDown(RTMessage Msg)
{
	int	xPos = Msg.LP.Lo,          /*	マウスのボタンが押された座標		*/
		yPos = Msg.LP.Hi;


	if( (!BeSel2Win) && (!BeDispWin) ){
		if( SelButton_X <= xPos  &&  xPos <= SelButton_X + Sel1Button_W){

			/*	何番目の項目を選択したのかを y 座標より計算	*/
			Part = y_Part(yPos);			
			if ( ( (Sel1Max == 0) && (Part == 0 )     )  ||  
				 (    0 <= Part   &&  Part < Sel1Max  )     ){
            	
				SetWindowPos(HWindow,   HWND_NOTOPMOST, FALSE, FALSE,
				   FALSE, FALSE, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE );
				SetWindowPos(Parent ->HWindow, HWindow, FALSE, FALSE,
				   FALSE, FALSE, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE );

				if(NowBasic){

				/*	説明ウィンドウの構築	*/

				   DispWin = new MfdbDispWindow(this, "MFDB − 説明");
				   DispApply = GetApplication();
				   DispApply-> MakeWindow(DispWin);
				}
				else {

				/*	選択ウィンドウ2の構築	*/

				  Sel2Win = new MfdbSel2Window(this,"MFDB − 選択2");
				  Sel2Apply = GetApplication();
				  Sel2Apply-> MakeWindow(Sel2Win);
            			}
            		}
		}
	}
	else {
		MessageBeep(-1);
    }
}

int MfdbSel1Window::y_Part(int yPos)
{
	int	SelNo;


	if ( (yPos - SelBtn_Y0) < 0)
    		SelNo = -1;
    	else{
		SelNo = (yPos- SelBtn_Y0) / (SelButton_H + Button_spc);
		if ( (yPos- SelBtn_Y0) % (SelButton_H +Button_spc) > SelButton_H )
    		SelNo = -1;
	}

    return SelNo ;
}
/*
						クラス MfdbSel2Window のメンバ関数
*/







LPSTR MfdbSel2Window::GetClassName()
{
	return "MfdbSel2Window" ;
}




BOOL MfdbSel2Window::CanClose()
{
	return TRUE;
}




void MfdbSel2Window::CloseWindow()
{
	SetWindowPos(Parent ->HWindow, HWND_TOP, FALSE, FALSE, FALSE, FALSE,
			 SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );

	TWindowsObject::CloseWindow();
}



void MfdbSel2Window::Sel2Close(RTMessage)
{
	CloseWindow();
}


void MfdbSel2Window::Paint(HDC PaintDC,PAINTSTRUCT&)
{
	POINT	point[tKind] = {	/*	文字の表示座標		*/
	  {Sel2_W /2 , Title_Y },		/*	タイトルの   (x , y) 座標		*/
	  {    Msg_X , Msg_Y   },		/*	メッセージの (x , y) 座標		*/
	};

	RECT		TitleRect;			/*	タイトルを書く長方形	*/
	char		TitleText[NameLenMax];	/*	タイトル文字列		*/

	int		Sel,SelY;
	HGDIOBJ		hbr, hbrOld;			/*	変更するブラシ,元のブラシ	*/
	int		BkModOld;			/*	元の背景モード			*/


	if (NoneData){
		CloseWindow();
		MessageBox(HWindow,NoExplain,"警告",MB_ICONEXCLAMATION);
	}



		/*	タイトルの描画	*/

	GetClientRect(HWindow, &TitleRect);		/*	現在のウィンドウの幅を獲得	*/
	TitleRect.top = point[tTitle].y ;

	if( (Part ==0) && (Sel1Win ->Sel1Max == 0) )
		strcpy(TitleText, CircuitName[Circuit]);
	else
		strcpy(TitleText, PartName[Part]);

	DrawText(PaintDC, TitleText, strlen(TitleText), &TitleRect, DT_CENTER );


		/*	メッセージの描画	*/

	SetTextAlign(PaintDC, TA_LEFT);
	TextOut(PaintDC, point[tMsg].x, point[tMsg].y, SelectMsg,  strlen(SelectMsg)  );

                      
		/*	ボタンの描画	*/

	SetTextAlign(PaintDC, TA_LEFT);

	for ( Sel= 0; Sel < Sel2Max; Sel++){

		SelY = SelBtn_Y0+(SelButton_H + Button_spc)*Sel;


		hbr = GetStockObject(LTGRAY_BRUSH);
		hbrOld = SelectObject(PaintDC, hbr);
		BkModOld = SetBkMode(PaintDC, TRANSPARENT);  /*  背景を透過モードにする	 */

		Rectangle( PaintDC, SelButton_X, SelY ,
			 SelButton_X + Sel2Button_W, SelY + SelButton_H );
		TextOut(PaintDC, SelButton_X+8, SelY + 2,
			 FailureName[Sel], strlen(FailureName[Sel]) );


		SelectObject(PaintDC, hbrOld);
        	DeleteObject(hbr);
		SetBkMode(PaintDC,BkModOld);

	}
}


int MfdbSel2Window::GetFailureName()		/*	症状名を配列に格納	*/
{
	int		FailCt;
	char	FailText[DispTextLen];
	BOOL	SearchEnd = FALSE;		/*	症状名の検索を終わるか	*/
	BOOL	BeFaBrac = FALSE ,		/*	症状名 が存在するかどうかのフラグ	*/
		BeDisp   = FALSE;		/*	説明文 が存在するかどうかのフラグ	*/


	fpFail.seekg(FPPart[Part]);

	NoneData = FALSE;
	FailCt = 0;

	while(!SearchEnd){
		if (FailCt >= FailMax){
			MessageBox(NULL, CountOver, DataReading CannotRun, MB_ICONSTOP);
			exit(1);
	       }
        	
		fpFail.getline(FailText, DispTextLen);
		switch(*FailText){
			case	Comnt:
            		case	FstAttBegin:
				break;

			case	CiBrac:
			case	PaBrac:
            		case	FstAttEnd:
			case	CiEnd:
			case	FileEnd:
				SearchEnd = TRUE;
				break;

			case	FaBrac:
				strcpy(FailureName[FailCt], FailText);
				FPFailure[FailCt] = fpFail.tellg();
				FailCt++;
				BeFaBrac = TRUE;
				break;

			default:
                		BeDisp = TRUE;
				break;
		}
	}

	if (!BeFaBrac){

		FPFailure[0] = FPPart[Part];

		if(!BeDisp)
			NoneData = TRUE;
	}

	return FailCt;
}
void MfdbSel2Window::AllButtonDown(RTMessage)	/*	全部表示ボタンが押された	*/
{
	if( !BeDispWin){
		DispAll = TRUE;

		/*	説明ウィンドウの構築	*/

		DispWin = new MfdbDispWindow(this, "MFDB − 説明");
		DispApply = GetApplication();
		DispApply-> MakeWindow(DispWin);
	}
	else {
		MessageBeep(-1);
   	}
}

void MfdbSel2Window::WMLButtonDown(RTMessage Msg)
{
	int	xPos = Msg.LP.Lo,           /*	マウスのボタンが押された座標		*/
		yPos = Msg.LP.Hi;


	if( !BeDispWin){
		if( SelButton_X <= xPos  &&  xPos <= SelButton_X + Sel2Button_W){

			/*	何番目の項目を選択したのかを y 座標より計算	*/
			Failure = y_Failure(yPos);

			if ( 0 <= Failure && Failure < Sel2Max){

				/*	説明ウィンドウの構築	*/

				DispWin = new MfdbDispWindow(this,"MFDB − 説明");
				DispApply = GetApplication();
				DispApply-> MakeWindow(DispWin);
        		}
		}
	}
	else {
		MessageBeep(-1);
    	}
}

int MfdbSel2Window::y_Failure(int yPos)
{
	int	SelNo;


	if ( (yPos - SelBtn_Y0) < 0)
    		SelNo = -1;
    	else{
		SelNo = (yPos- SelBtn_Y0) / (SelButton_H + Button_spc);
		if ( (yPos- SelBtn_Y0) % (SelButton_H + Button_spc) > SelButton_H )
    		SelNo = -1;
	}

    return SelNo ;
}
/*
						クラス MfdbDispWindow のメンバ関数
*/





LPSTR MfdbDispWindow::GetClassName()
{
	return "MfdbDispWindow" ;
}



BOOL MfdbDispWindow::CanClose()
{
	return TRUE;
}


void MfdbDispWindow::CloseWindow()
{
	SetWindowPos(Parent ->HWindow, HWND_TOP, FALSE, FALSE, FALSE, FALSE,
			 SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE );

	TWindowsObject::CloseWindow();
}


void MfdbDispWindow::DispClose(RTMessage)
{
	CloseWindow();
}




void MfdbDispWindow::Paint(HDC PaintDC,PAINTSTRUCT&)
{
	char	TitleText[NameLenMax];		/*	タイトル文字列	*/

	POINT	point[tKind] = {		/*	文字の表示座標	*/
		{Disp_W /2 , Title_Y },		/*	タイトルの   (x , y) 座標	*/
		{    Msg_X , Msg_Y   }		/*	メッセージの (x , y) 座標	*/
	};

	RECT	DispRect;		/*	タイトル、説明文を書く長方形	*/
	int	DiLen,DiHi;    	/*	説明文の長さ、高さ	*/
  	int	DiDTRet;		/*	DrawText() からの戻り値(テキストの高さ)	*/
	UINT	DiStyle;		/*	DrawText() のためのスタイル			*/		
	BOOL	DispEnd = FALSE;     /*	表示が終わりかどうか示すフラグ	*/
	BOOL	DispOn 	= TRUE;		/*	表示するかどうか示すフラグ		*/

	long	ScBottom, ScRangeY ;	/*	スクロールバーの調節用		*/
	/*	タイトルの表示とファイルポインタの設定	*/

	if(DispFlg == dAll){
		strcpy(TitleText, DispAllMsg);

	    	  /*	全部表示ならファイルポインタの設定をやり直す。	*/
		fpFail.seekg(FPPart[Part]);
	}
	else {
		if(NowBasic)
			strcpy(TitleText, PartName[Part] );
		else
			strcpy(TitleText, FailureName[Failure] );

		if(Circuit == cFirstMsg)
			fpFail.seekg(FPPart[Part]);
        else
			fpFail.seekg(FPFailure[Failure]);
	}

	/*	タイトルの表示	*/
	GetClientRect(HWindow, &DispRect);	/*   現在のウィンドウの 幅 と 高さ を獲得	 */
	DispRect.top = point[tTitle].y ;
	DrawText(PaintDC, TitleText, strlen(TitleText), &DispRect, DT_CENTER );


	DispEnd = FALSE;											/*	説明文の表示	*/
	switch(DispFlg){
		case	dNone:
			MessageBox(HWindow,NoExplain,"警告",MB_ICONEXCLAMATION);
			CloseWindow();
			break;

		case	dAll:
		case	dNormal:
			DispRect.top = DispTx_Y0;	/*	説明文の1行目の y 座標	*/

			while(!DispEnd){
				fpFail.getline(DispText, DispTextLen);
				switch(*DispText){
					case	Comnt:
					case	FstAttBegin:
                    				DispOn = FALSE;
						break;

					case	CiBrac:
					case	FstAttEnd:
					case	CiEnd:
					case	FileEnd:
						DispEnd = TRUE;
						break;


					case	PaBrac:
						if ( (DispFlg == dAll) && (NowBasic) ){

				/*	最初の注意で、 全部 表示なら、<> も表示する	*/
							DispOn = TRUE;
							DispRect.top += 10;
                        			}
						else
                        				DispEnd = TRUE;

						break;

					case	FaBrac:
						if ( (DispFlg == dAll) || (NowBasic) ){
				/*	 最初の注意か、全部 表示なら、() も表示する	*/
							DispOn = TRUE;
							DispRect.top += 10;
                        			}
						else									/*	そうでなければ、次の症状の前でストップ	*/
							DispEnd = TRUE;

						break;

					default:
						DispOn =TRUE;
						break;
				}

				if(DispOn && !DispEnd){

						/*		文字列の長さ(ピクセル)	*/
				    DiLen = fpFail.gcount() * (int)(Font_W *1.2 /2 );

				    DiHi = (DiLen / DispRect.right +1) * (DispTx_H);
				    DispRect.bottom = DispRect.top + DiHi;

						/*	DrawText() のためのスタイル		*/
				    DiStyle = ( DT_EXTERNALLEADING | DT_LEFT | DT_NOPREFIX
						| DT_EXPANDTABS | DT_WORDBREAK );

				    DiDTRet = DrawText(PaintDC, DispText, strlen(DispText),
								 &DispRect, DiStyle );

				    if (DiDTRet != NULL)
					DispRect.top += DiDTRet;
					else{
                    				MessageBox (NULL, DataError ,
							 DataReading CannotRun ,MB_ICONSTOP);
						exit(1);
				    }
				}
			}
			/*		スクロールバーの調節	*/

			ScBottom = DispRect.top;		/*	描画範囲の下端 の座標	*/

				/*	現在のウィンドウの 幅 と 高さ を獲得	*/
			GetClientRect(HWindow, &DispRect);						

				/*	y 方向 のスクロール範囲 (ユニット)		*/
			ScRangeY = (ScBottom - DispRect.bottom) / ScrollUnit_Y;
			if (ScRangeY >0)
			   ScRangeY++;
			Scroller -> SetRange(  0, ScRangeY  ); 	/*	値を設定する	 */
            		Scroller -> SetSBarRange();	/* スクロールバーを設定に同期させる	 */
			break;

		default	:
			break;
	}
}

int MfdbDispWindow::CheckDispText()		/*	説明文の行数を調べる	*/
{
	int	Lines;				/*	行数			*/
	BOOL	SearchEnd = FALSE;		/*	説明文の検索を終わるかを示すフラグ	*/

	if(NowBasic || (DispFlg == dAll) )
		fpFail.seekg(FPPart[Part]);
    	else
		fpFail.seekg(FPFailure[Failure]);

	Lines = 0;
	while(!SearchEnd){
		fpFail.getline(DispText, DispTextLen);

		switch(*DispText){
			case	Comnt:
            		case	FstAttBegin:
				break;

			case	CiBrac:
			case	PaBrac:
			case	FstAttEnd:
			case	CiEnd:
			case	FileEnd:
				SearchEnd = TRUE;
				break;

			case	FaBrac:
				if (DispFlg != dAll)
                			SearchEnd = TRUE;                	
				break;

			default:
				Lines++;
		}
	}
    return Lines;
}
/*
						クラス MfdbApply のメンバ関数
*/

void MfdbApply::InitApplication()
{
	char	*p;
	char	InitMsg[200];

															/*	データファイルがオープンできるか判定	*/
	strcpy(InitMsg,"データファイルとして、\n   ");

	if( fpFail.open(DataFileName, ios::in | ios::nocreate ), fpFail != NULL){
		strcat(InitMsg,"カレントディレクトリの " DataFileName);
	}
    	else {		/*	実行ファイルのあるディレクトリの中を探す	*/

		p = ModulePath + sizeof(ModulePath);
		for (;*p!='\\';p--)
			;
		p++; *p=NULL;
		strcat(ModulePath,DataFileName);

		if ( fpFail.open(ModulePath, ios::in | ios::nocreate ), fpFail != NULL){
			strcat(InitMsg,ModulePath );
		}
		else {
			strcpy(InitMsg, FileNotExist "\nデータファイル "DataFileName  \
			    " を " ProgramName".EXEと同じディレクトリに置いてください。");
			MessageBox( NULL, InitMsg, "エラー " CannotRun, MB_ICONSTOP );
        		exit(1);
    		}
	}

	strcat(InitMsg, " \nを使用します。");

	MessageBox( NULL, InitMsg, "続行", MB_ICONINFORMATION );

}


void MfdbApply::InitInstance()
{
	if ( hPrevInstance == NULL){
		TApplication::InitInstance();
	}
	else {
		MessageBox(NULL, AlreadyRun, "起動済み!!", MB_ICONEXCLAMATION );
		exit(1);
	}
}
void MfdbApply::InitMainWindow()
{
	/*	メインウィンドウの構築	*/

	MainWindow = new MfdbBaseWindow(NULL , BaseCaption) ;
}


BOOL MfdbApply::CanClose()
{
	return ( MessageBox(MainWindow-> HWindow, "MFDBを終了します。",
				 "MFDBの終了",	 MB_OKCANCEL | MB_ICONINFORMATION)
		  == IDOK ) ;
}









//      Windowsアプリケーションのmain関数

int PASCAL	WinMain(HINSTANCE aghInst, HINSTANCE aghPrevInst, LPSTR aglpCmdLine,
			 int agnCmdShow)
{
	/*	実行ファイルのパス名の取得	*/
      GetModuleFileName(aghInst,ModulePath,sizeof(ModulePath) );

	/*	クラス MfdbApply のオブジェクトの作成	*/
      MfdbApply MfdbApp(ProgramName , aghInst , aghPrevInst , aglpCmdLine , agnCmdShow) ;	

      MfdbApp.Run() ;				/*	メッセージループを実行	*/

      return MfdbApp.Status ;             /*	Windowsに 状態を返す	*/
}


2.3 シンボル定義ファイル (mfdb_def.h )

/*	mfdb_def.h  MIRS障害データベース 定数定義 ファイル	*/

//									Mar. 22, 1995

#ifndef	__MFDB_DEF_H
# define __MFDB_DEF_H


/*	ファイル名に関係する設定	*/

#define	ProgramName		"MFDB"		/*	Windows に渡すプログラム名	*/
#define	DataFileName	"FAILURES.TXT"		/*	データファイルのパス名      		*/
#define	MoPathLen		120		/*	データファイルのパス名の長さの上限	*/


/*	メインウィンドウのキャプション	*/

#define	BaseCaption		"MIRS障害データベース (MFDB)"


/*	ウィンドウの位置・大きさの設定	(左端
						 上端
						 幅
						 高さ の順)		*/

	/*	メインウィンドウ	*/
#define	Base_X			100
#define	Base_Y			100
#define	Base_W			(BaseButton_W + SelButton_X *2)
#define	Base_H			460

	/*	選択ウィンドウ1	*/
#define	Sel1_X			(Base_X + EndButton_X + EndButton_W + 5)
#define	Sel1_Y			(Base_Y - 40)
#define	Sel1_W			(Sel1Button_W + SelButton_X *2  + ScrBar_W)
#define	Sel1_H			(Base_H + 100)

	/*	選択ウィンドウ2	*/
#define	Sel2_X			(Sel1_X + 40)
#define	Sel2_Y			(Sel1_Y + 40)
#define	Sel2_W			(Sel2Button_W + SelButton_X *2  + ScrBar_W)
#define	Sel2_H			Sel1_H

	/*	説明ウィンドウ	*/
#define	Disp_X			(Sel2_X + 50)
#define	Disp_Y			(Sel2_Y + 40)
#define	Disp_W			(560 + ScrBar_W)
#define	Disp_H			(Base_H + 100)

	/*	スクロールバー関係の設定	*/

#define	ScrollUnit_Y	(int)(DispTx_H * 2 / 3)  /*		スクロールユニット(y 方向)	*/
#define	ScrollRange_Y0		30	/*	スクロールボタンが押せる回数の初期値   */
#define	ScrBar_W		22	/*		スクロールバーの幅		   */

/*	文字の表示位置	*/

#define	Title_Y		3 				/*	タイトルの   y 座標		*/
#define	Msg_X	 	2				/*	メッセージの x 座標		*/
#define	Msg_Y	(Title_Y + EndButton_H + Button_spc + 32)	   /* メッセージの y 座標   */
#define	DispTx_X     10				/*	説明文の    x 座標		*/
#define	DispTx_Y0	(Msg_Y + DispTx_H)		/*	説明文の1行目の  y 座標	*/
#define	DispTx_H	(int)(Font_H * 3 / 2)		/*	説明文の1行の高さ		*/


/*	フォント(全角)のサイズ (ピクセル単位)	*/

#define	Font_W		16				/*	フォントの幅	*/
#define	Font_H		16				/*	フォントの高さ	*/


/*	ボタン関係の設定	*/

#define	Button_spc	  6

#define	BaseButton_X			 10
#define	BaseButton_W			280
#define	BaseButton_H			 24
#define	BaseBtn_Y0		(Msg_Y + DispTx_H)	/*	1番目のボタンの  y 座標	*/

#define	SelButton_X		 10
#define	Sel1Button_W	(int)(PaNameLen /2 * Font_W)
#define	Sel2Button_W	(int)(FaNameLen /2 * Font_W)
#define	SelButton_H	BaseButton_H
#define	SelBtn_Y0     (AllButton_Y + AllButton_H +Button_spc) /* 1番目のボタンの y 座標 */


#define	EndButton_X		 3
#define	EndButton_Y		(3 + EndButton_H)
#define	EndButton_W		70
#define	EndButton_H		25

#define	EndBtnTxt		"←戻る"

#define	AllButton_X		(Msg_X + 200)
#define	AllButton_Y		(EndButton_Y + EndButton_H + AllButton_H + Button_spc)
#define	AllButton_W		100
#define	AllButton_H		EndButton_H

#define	AllBtnTxt		"全部 表示"


/*	ボタンのディスパッチインデックスの割り付け	*/

#define	BaseBtn		  0		/*	ベースウィンドウのボタン	*/
#define	Sel1Btn		100		/*	選択ウィンドウ1のボタン	*/
#define	Sel2Btn		200		/*	選択ウィンドウ2のボタン	*/
#define	DispBtn		300		/*	説明ウィンドウ のボタン	*/

#define	EndButton	1	/*	終了ボタン	*/
#define	AllButton	2	/*	全部表示ボタン	*/

/*	各項目の最大数	*/

#define	CircMax 30	/*	ボード・回路の数の上限			*/
#define	PartMax 10	/*	1つのボード・回路の中の項目の最大数	*/
#define	FailMax	15  	/*	1つの部分における症状の最大数		*/


/*	文字列の長さの上限  (半角単位で 最後の NULL を含む )	*/

#define	NameLenMax		43            /*	タイトルに使う文字列の長さ	*/

#define	CiNameLen		NameLenMax 	/*	ボード・回路名 の長さ		*/
#define	PaNameLen		NameLenMax	/*	   部分名       の長さ		*/
#define	FaNameLen		NameLenMax	/*	   症状名       の長さ		*/
#define	DispTextLen		601		/*	データファイルの1行の長さ		*/


/*	回路の種類 の 順番付け	*/

enum E_Circuit{
	cFirstMsg  =0,			/*	最初に表示される注意	*/
	cFirstCirct			/*	最初の回路		*/
};


/*	ウィンドウ内の表示の順番	*/

enum E_TextOrder {
	tTitle,				/*	タイトル	*/
	tMsg				/*	メッセージ	*/
};

#define	tKind	(tMsg + 1)		/*	表示座標の配列の添え字	*/


/*	表示フラグの状態	*/
enum	E_dState{
	dNone =0,			/*		表示するものがない	*/
	dAll,	                	/*			全部表示	*/
	dNormal	                	/*			通常表示	*/
};


/*	データファイルの中で使われる記号	*/

#define	Comnt			';'	/*	1行コメントにするために行頭に置く記号	*/

#define	FstAttBegin		':'	/*	最初の注意の始まり	*/
#define	FstAttEnd		'*'	/*	最初の注意の終わり	*/

#define	CiBrac			'['	/*	ボード・回路名が 入るカッコ	*/
#define	PaBrac			'<'	/*	   部分名が      入るカッコ	*/
#define	FaBrac			'('	/*	   症状名が      入るカッコ	*/

#define	CiEnd			'?'	/*	 ボード・回路 の終わり	*/
#define	FileEnd			'@'    /*	データファイルの終わり	*/

/*	メッセージ	*/

#define	WelcomMsg				"MFDBへようこそ。"
#define	FirstMsg1				"※ 以下の事項についてもう一度"
#define	FirstMsg2				"確認してください。"
#define	SelectMsg				"項目を選んでください。"
#define	DispAllMsg				"すべての項目について表示します。"
#define	GoToSel2Msg				"次の 選択2 に進む"


/*	エラーメッセージ	*/

#define	AlreadyRun	"MIRS障害データベースは既に起動されています。"
#define	FileNotExist	" ファイル が存在しません。"
#define	CountOver	" データファイルの項目数が既定の最大値を超えました。"
#define	NoExplain	" この項目については、データファイルの中に記述がありません。"
#define	DataError   "データの記述に誤りがあります。\n定められた書式にしたがってください。"
#define	CannotRun	" − 続行不能"

#define	DataReading	"データ読み込み中"


/*	その他の設定	*/

#define	Version		1	/*	(現在使われていません。)*/


/*	グローバル変数の定義	*/

/*
	ヘッダで宣言するとエラーになるので、 mfdb.cpp に移しました。
*/

#endif	/* __MFDB_DEF_H */


2.4 将来の拡張用関数定義ファイル (mfdb_ft .cpp)

//	mfdb_ft.cpp	MIRS障害データベース  将来の拡張のための C++関数ファイル

//									Mar. 22, 1995

#pragma		hdrfile	"mfdb.sym"

#include	
#include	
#include	
#include	

#pragma		hdrstop
#include	"mfdb_def.h"
#include	"mfdb_cls.h"

extern char	CircuitName[cFirstCirct+ CircMax][CiNameLen];

/*	メッセージ応答関数の例	*/

/*
void MfdbBaseWindow::FT1ButtonMsg(RTMessage)
{
   if(!BeSel1Win){
      MessageBox(HWindow,"このボタンは将来の拡張用です。", CircuitName[FT1], MB_OK);
   }
}
*/

/*
     機能拡張については、

 マニュアル( NCT−電子制御−9404−1−3 MIRS障害データベースの使い方 )の、
	  3.2 機能の拡張

     を参照してください。
*/



3.その他のファイル

3.1 実行形式定義ファイル (mfdb.def)

NAME MFDB
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
HEAPSIZE 3000
STACKSIZE 5120


3.2 リソース定義ファイル (mrdb.rc )

ICON_1 ICON "mfdb.ico"



4.データファイル (failures.txt)

;falures.txt
;				作成日 1995年 3月16日
;
;				変更
;				        年  月  日
;
;		MIRS障害データベース(MFDB) 症状ファイル
;
; !!!! データファイルの変更は、MFDBを実行していない状態で行うこと。 !!!!
;
;      改行だけの行は作らないでください。全部表示ボタンの動作に支障があります。
;        (空行を表示したい時は、半角スペースを1つ入れておいてください。)
;
;	; で始まる行は コメントになります。
;
;書式について:
;
; 1.すべての行を、左端(前の行の改行直後)から書き始めてください。
;
;     :: 最初に表示される注意のタイトルが入ります。
;     *  最初に表示される注意は、   * (半角)  で終わります。
;
;     [] の中には、ボード名または回路名が入ります。
;     <> の中には、部分の名前が入ります。
;     ()  の中には、症状が入ります。
;
;       現在、これらのカッコの中に入るのは、全角で20文字です。
;       ヘッダファイル mfdb_def.h の NameLenMax で定めています。
;
;     ?   ボード・回路が変わる時には、 ? (半角)  を書くこと。
;     @   症状ファイルの終わりには、  @ (半角)  を書くこと。
;
; 2.1行(改行なしで続く文字列)の長さを300文字(全角)以下にしてください。
;
; 実際の書き方については、次の例と、下の各データを参考にしてください。
;
;
;
;例
;[ボード名1]
;<部分1>
;(症状1)
;説明1
;  :
;
;<部分2>
;(症状2)
;説明2
;  :
;(症状3)
;説明3
;  :
;?
;;
;[ボード名2]
;(症状1)
;(症状2)
;(症状3)
;?
;@
;
;最初に表示される注意
:基本的な注意:
<VMEラック>
・VMEラックに電源(±5V,±12V,GND)が供給されているか。
・ターゲットボードはしっかり接続されているか。
・VMEラックのバックプレーンのジャンパの接続はできているか
(ボードが挿入されていないスロットについては、IACK、BG0〜BG3の計5つの信号(10端子)をジャンパでショートする必要がある)
<VSBC−1>
・ジャンパが正しく設定されているか確認してください。
(NCT−電子制御−9404-1「自律知能ロボット用制御システムの開発
     (その1 システム概要とテストプログラム)」第2章 参照。)
・ICEとの接続に使用している68ピンコネクタのピンが折れ曲がっていないか確認してください。
<VIPC310>
・ジャンパが正しく設定されているか確認してください。
(NCT−電子制御−9404-1「自律知能ロボット用制御システムの開発
     (その1 システム概要とテストプログラム)」第2章 参照。)
<IP−Digital48>
・ジャンパが正しく設定されているか確認してください。
(NCT−電子制御−9404-1「自律知能ロボット用制御システムの開発
     (その1 システム概要とテストプログラム)」第2章 参照。)
<ロジックアナライザ>
・プローブが断線していないか確認してください。
<個別保守診断プログラム>
・RS−232CケーブルがVSBC−1のCH0に接続されているか確認してください。
・RS−232Cケーブルが断線していないか確認してください。
・PC−98端末はターミナルモードに移行してください。
(NCT−電子制御−9404-1-2「個別保守診断プログラムの使い方」参照。)
<全ボード,回路に共通のこと>
・ボード/回路のVCCとGNDは短絡していないか確認してください。
・ジャンパ線は正しく接続されているか、または断線していないか確認してください。
*
;
;[Man-Machine インタフェース・ボード]
[Man-Machine インタフェース・ボード]
<LED>
(LEDが点灯しない)
 LEDの極性が逆になっていないか、確認してください。
(7seg−LEDの点灯が異常)
 配線が、セグメント違いになっていたり、隣のセグメントと短絡したりすると、7セグメントLEDに正しい数字が表示されません。
<スイッチ>
(割り込みが何回も入る)
 スイッチ割込み処理ルーチンにおいて、命令 outportb(PSR0,0x08); によって H4ステータスビットがクリアされないと、割込みが入りっぱなしになります。 
?
;
;[ロータリ・エンコーダ/タッチセンサ・ボード]
[ロータリ・エンコーダ/タッチセンサ・ボード]
<ロータリ・エンコーダ>
(動作しない)
ロータリ・エンコーダが壊れていないか確認してください。
(I/Oにアクセスできない)
I/Oボード(VIPC310)のジャンパが正しく設定されているか確認してください。
<タッチセンサ>
(試験中に暴走する)
割込みベクタ番号設定用のディップスイッチの設定が間違った状態で割込みがかかると暴走します。
(リセットすると割り込みが入る)
初期化を行う前に、命令 MOVE #$2000,SR によって割込み許可状態にすると割り込みが入ります。
(割り込みを許可するとすぐ割り込みが入る)
初期化を行う前に、命令 MOVE #$2000,SR によって割込み許可状態にすると割り込みが入ります。
?
;
[PWM信号回路]
(LowLevelで細かいパルスが出る)
ICのGNDが接触不良だと細かいパルスがでます。
?
;
;
[赤外線センサ回路] 
(スイッチを読み取れない)
I/Oボード(VIPC310)のジャンパが正しく設定されているか確認してください。
(パルスが出ない)
・ボードにクロックが入っているか確認してください。
・フリップ・フロップが壊れていないか確認してください。
?
;
;
[超音波センサ回路]
(回り込み波が除去不能)
増幅率が大きすぎると回り込み波が除去できなくなります。
(割り込みが何回も入る)
ポートの設定が間違っていないか確認してください。
(割り込みを許可するとすぐ割り込みが入る)
・ソフトに原因がある場合
 回り込み波に対応するための割り込み処理がされていない
 これについては、
  NCT−電子制御−9404-1-5「個別保守診断プログラムのソースリスト」の
     sss.c 
 を参考にしてください。
 
・ハードに原因がある場合
 (現在のところそのような原因は登録されていません。)
(PLDの接触不良)
PLDをしっかりセットしてください。
(PLDに書き込めない)
PLDが故障していないか確認してください。
(アンダーフローしない)
・増幅率が大きすぎると、アンダーフローしません。増幅率を下げてください。
 
・タイマ・モードがデバイスウォッチドッグ・モードになっているか確認してください。
(割り込み試験でアンダーフローしてしまう)
増幅率が小さすぎると、アンダーフローします。増幅率を上げてください。
?
;
;
[電源/勝敗判定装置]
(LEDの異常点灯)
接触不良でないか確認してください。
?
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;FT1
[将来の拡張1]
(将来の拡張1 の1)
MFDBは、表示される説明を簡単に追加できます。
現在登録されていない症状を見つけたら、ぜひ登録してください
    (登録は、MFDBを終了してから行うこと)。
 
登録のしかたについては、
 マニュアル( NCT−電子制御−9404-1-3
       「MIRS障害データベースの使い方」 )の、
  3.1 表示項目と説明の追加/変更
と、
 データファイル failures.txt の中のコメント
を参照してください。
?
;
;FT2
[将来の拡張2]
(将来の拡張2 の1)
MFDBを改造し、機能を拡張する場合は、
 マニュアル( NCT−電子制御−9404-1-3
       「MIRS障害データベースの使い方」 )の、
  3.2 機能の拡張
を参照してください。
?
;
;
@
;
;症状ファイルの終わり
;



参考文献

1) NCT−電子制御−9404-1  自律知能ロボット用制御システムの開発(その1) ,1995
2) NCT−電子制御−9404-1-3 MIRS障害データベースの使い方 ,1995
3) TURBO C++3.0 FOR WINDOWS PROGRAMMER'S GUIDE, BORLAND, 1992
4) OBJECTWINDOWS FOR C++ USER'S GUIDE , BORLAND, 1992
5) Windows/C++ 基本プログラム集, 横井与次郎, 工学図書株式会社, 1993



'94MIRS V-Project仕様書体系へ戻る