dポイントプレゼントキャンペーン実施中!

MFCの既存のフレームで、「最近使ったファイル」という欄があります。
これを選んだ際に、指定したプログラムでそのファイルを開きたいのですが、うまくいきません。
どうすればよろしいでしょうか?

HogeView.cpp

...(省略)

/***************************************
OnOpenRecentFileのオーバーライド
***************************************/
BOOL CWinApp::OnOpenRecentFile(UINT nID)
{
ASSERT_VALID(this);
ASSERT(m_pRecentFileList != NULL);

ASSERT(nID >= ID_FILE_MRU_FILE1);
ASSERT(nID < ID_FILE_MRU_FILE1 + (UINT)m_pRecentFileList->GetSize());
int nIndex = nID - ID_FILE_MRU_FILE1;
ASSERT((*m_pRecentFileList)[nIndex].GetLength() != 0);
  
    /* 選んだファイルを表示 */
AfxMessageBox((*m_pRecentFileList)[nIndex]);

CHogeView *myview = new CHogeView();

★myview->GetDocument()->SetFilePath((*m_pRecentFileList)[nIndex]);

AfxMessageBox(myview->GetDocument()->GetFilePath());

myview->ReadFile((*m_pRecentFileList)[nIndex]);

TRACE2("MRU オリジナル関数内: open file (%d) '%s'.\n", (nIndex) + 1,
(LPCTSTR)(*m_pRecentFileList)[nIndex]);

if (OpenDocumentFile((*m_pRecentFileList)[nIndex]) == NULL){
m_pRecentFileList->Remove(nIndex);
}
return TRUE;
}

/******************************************************************
ファイル読み込み
******************************************************************/
void CHogeViewerView::ReadFile(CString filename){
...(省略)
}


コンパイルはできるのですが、どうやら★のところがうまく行かず、
Debug Assertion Failed!
とエラーがでます。
何が原因なのでしょうか?

A 回答 (1件)

ん~ MFCのDOC/VIEWを使うのであればファイルの読み込みをViewクラスでやるのはお勧めできません



質問の直接の原因は Viewクラスは作っているがViewと関連のあるDocumentクラスが無いので
GetDocumentがNULLを返してくるためにアサーションが発生します

OpenDocumentFileからの戻り値の CDocument* を お使いのCDocumentからの派生クラスにキャストしてやれば Documentに関する部分は操作可能になります

CHogeDocument* pDoc = NULL;
if ((pDoc = (CHogeDocument*)OpenDocumentFile((*m_pRecentFileList)[nIndex])) == NULL){
といった具合にif文を書き換えてやります

このif文が成り立つのは Documentクラスを生成できなかった場合です
何らかの原因でドキュメント内容が読み込めなかったとか サイズ0のファイルを指定したとか

ドキュメント内容の取得は CHogeDocumentクラスの Serializeルーチンで読み込むようにしましょう
… 書き込み時もSerializeを使います

読み込み後Viewクラスで何かやりたいのであれば ViewクラスのOnInitialUpdateなどが適当かとおもいます
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!