【发布时间】:2020-11-09 03:22:11
【问题描述】:
我生成了一个带有CMultiDocTemplate 的Visual MFC 项目。
新建和文件打开已经实现。但我现在想打开一个数据库并查询数据。
在CDocument::OnOpenDocument 下,我可以读到可以为此编写一个应用程序。但我不知道如何在不打开文件的情况下打开带有附加视图的文档。
我需要的是一个函数OnOpenDB(LPCTSTR tableName),它创建文档和视图,但不尝试打开文件并扩展表名。
Google 没有帮助我。我找不到任何有用的文档。
@阿德里安,
是否有其他解决方案?
最后,我想为不同的功能使用多个模板。
在您的解决方案中,我错过了将表名发送到文档以进行数据库查询并将数据提供给视图的可能性。
我可以覆盖模板类吗?
在您的代码中,是否 dynamic_cast
所以最后我需要一个公共函数,它允许我发送一个带有表名的新文档的请求。 这可能吗?
更新: 我试图覆盖 CMultiDocTemplate::OpenDocumentFile(...),但它不起作用。看来这个功能不是虚拟的。 因此,我在 CMultiDocTemplate 的覆盖中创建了一个 OpenDocumentFile(...)
CDocument* CStreamAuswertungMDT::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bAddToMRU, BOOL bMakeVisible)
{
CDocument* pDoc = CreateNewDocument();
if (pDoc == NULL)
{
TRACE(traceAppMsg, 0, "CDocTemplate::CreateNewDocument returned NULL.\n");
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
return NULL;
}
ASSERT_VALID(pDoc);
BOOL bAutoDelete = pDoc->m_bAutoDelete;
pDoc->m_bAutoDelete = FALSE; // don't destroy if something goes wrong
CFrameWnd* pFrame = CreateNewFrame(pDoc, NULL);
pDoc->m_bAutoDelete = bAutoDelete;
if (pFrame == NULL)
{
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
delete pDoc; // explicit delete on error
return NULL;
}
ASSERT_VALID(pFrame);
// avoid creating temporary compound file when starting up invisible
if (!bMakeVisible)
pDoc->m_bEmbedded = TRUE;
if (!pDoc->OnNewDocument())
{
// user has be alerted to what failed in OnNewDocument
TRACE(traceAppMsg, 0, "CDocument::OnNewDocument returned FALSE.\n");
pFrame->DestroyWindow();
return NULL;
}
// it worked, now bump untitled count
pDoc->SetTitle(lpszPathName);
pDoc->OnDocumentEvent(CDocument::onAfterOpenDocument);
InitialUpdateFrame(pFrame, pDoc);
return pDoc;
}
这对我有用!
【问题讨论】:
-
调用
CWinApp::OnFileNew()(这将创建一个无标题的文档和一个视图)然后调用另一个从数据库传输数据并设置标题的方法不是更简单吗?
标签: c++ visual-studio visual-c++ mfc