BDH_Modify クラスを用意しました.
class BDH_Modify {
public:
BDH_Modify () { Modified = FALSE ; }
public:
virtual BOOL IsModified (void) const { return Modified ; }
virtual BOOL SetModifiedFlag (const BOOL mod=TRUE) { Modified = mod ; return TRUE ; }
virtual BOOL CanClose (void) { return SaveModified() ; }
public:
virtual CString GetPathName (void) const { return _T(“ファイル”) ; }
virtual BOOL DoFileSave (void) { return FALSE ; }
public:
virtual BOOL SaveModified (void) ;
protected:
BOOL Modified ;
} ;
inline
BOOL BDH_Modify::SaveModified (void)
{
if (!IsModified()) { return TRUE ; }
CString name = GetPathName() ;
if (name.Find(‘\\’) >= 0) {
name = ::GetFileName(name) ;
}
// VC98\MFC\SRC\DocCore.cpp CDocument::SaveModified() より
CString prompt ;
AfxFormatString1(prompt,AFX_IDP_ASK_TO_SAVE,name) ;
switch (AfxMessageBox(prompt,MB_YESNOCANCEL,AFX_IDP_ASK_TO_SAVE)) {
case IDCANCEL: return FALSE ; break ;
case IDYES : if (!DoFileSave()) { return FALSE ; } break ;
case IDNO : break ;
default : break ;
}
return TRUE ;
}
ダイアログベースなどで利用するために作成しました.
以下の様に利用しています.
#include “BDH_Mod.hxx”
class BDModCSV : public BDocCSV , public BDH_Modify {
public:
virtual BOOL Clear (void) { SetModifiedFlag(FALSE) ; return BDocCSV::Clear() ; }
public:
virtual void Serialize (CArchive& ar) { SetModifiedFlag(FALSE) ; BDocCSV::Serialize(ar) ; }
} ;
class Masters : public BDModCSV
{
// …
virtual CString GetPathName (void) const { return GetFilePath() ; }
virtual BOOL DoFileSave (void) { return FileWrite(GetFilePath()) ; }
} ;
BOOL Masters::AddMaster1 (Master* reg)
{
SetModifiedFlag(TRUE) ;
// …
}
void CEditCNDlg::OnCancel()
{
Masters* masters = Mast_S->GetSelected() ;
if (masters != NULL && !masters->CanClose()) { return ; }
CDialog::OnCancel();
}
BDH_Modifyは何ですか?
ここの前半にあるコードがほぼ全てです.
MFC の CDocument を利用できない時のために,その一部の機能の「保存確認」を BDH_Modify として抜き出しています.
利用方法はその下になります.
通常,BDH_Modify の GetPathName と DoFileSave はオーバーライドします.