Single Document Interface与CSingleDocTemplate的区别?

wangyangcheng 2005-04-27 02:38:34
CSingleDocTemplate就是CDocument* m_pOnlyDocument

Single Document Interface除了采用CSingleDocTemplate之外,还有什么其它细节特征?

为何Single Document Interface只能同时打开一个document?

...全文
257 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangyangcheng 2005-04-27
  • 打赏
  • 举报
回复
回复人: 52001314(不当程序员了) ( ) 信誉:99 2003-03-24 14:28:52Z 得分:0



CSingleDocTemplate *pDocTemplate;
pDocTemplate1=new CSinlgeDocTeplate(IDR,
CRunTimeClass(mydoc1),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate1)


pDocTemplate2=new CSingleDocTeplate(IDR,
CRunTimeClass(mydoc2),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate2)

如果用pDocTemplate1打开mydoc1,pDocTemplate2打开mydoc2应该是可以同时打开的吧?
不过,这样的话,两个template,还算SDI程序吗?


----
有人说SDI/MDI与否取决于Template的个数,对此我不认为,但又无法完全确定.



回复人: luogucai(萝卜) ( ) 信誉:98 2003-03-24 15:07:49Z 得分:0



单文档、多文档首先是从我们现实使用中而来的,我们同一个程序需要处理多个文档时,其框架结构就会有所变化。
目前单文档结构一般只允许你对一个文档进行操作,我们也可以同时对两个相同类型的文档进行操作,如果用户需要这样的操作,它可以启动两个进程。所以我们在设计程序时可以只关注对同一中文档而且只有一个文档的情况进行设计。
而多文档可以处理多种类型的文档,每一种文档也可以打开多个,这是因为既然我已经需要处理多个框架了,我就可以较为轻松的实现对同一类型文档的多个不同文档进行编辑,而不需要多个进程。
因此,MFC的设计者根据以上的情况设计了两种不同类型的文档模版来处理这种问题,当然你完全可以自己处理一下CSingleDocmentTpl,使得其支持多个文档(同一类型)甚至你完全可以处理多个不同类型的文档。但你最终会那样的话,你的程序结构会比现在好吗?应用效果呢


----
这个肯定是从应用的角度出发去设计的.



回复人: fishsward(.) ( ) 信誉:100 2003-03-24 17:24:31Z 得分:0



to 52001314(谁说程序员不用休息的?) :
讨论到这个时候,我们的观点基本上达成一致了,您的参与给了我很大的
帮助,谢谢!!不过,还是存在一下分歧:
1。CSingleDocTemplate *pDocTemplate;
pDocTemplate1=new CSinlgeDocTeplate(IDR,
CRunTimeClass(mydoc1),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate1)


pDocTemplate2=new CSingleDocTeplate(IDR,
CRunTimeClass(mydoc2),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate2)
您对此的看法是《如果用pDocTemplate1打开mydoc1,pDocTemplate2打开mydoc2应
该是可以同时打开的吧?》,,,而我则认为:《它不能同时打开mydoc1和mydoc2》
为什么呢??因为程序要同时打开多个文档,必须依靠CMultiDocTeplate对象的成员
变量CPtrList m_docList。不管您有多少个CSingleDocTeplate,仅仅是表示您的程
序能够支持多个文档,您在打开另一个文档之前,必须关闭当前文档。
除非您用CMultiDocTeplate,您永远不能同时打开多个文档!!(注意,我这里反复
强调《同时》)

2。CSingleDocTemplate *pDocTemplate;
pDocTemplate=new CSinlgeDocTeplate(IDR,
CRunTimeClass(mydoc1),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate)


pDocTemplate=new CSingleDocTeplate(IDR,
CRunTimeClass(mydoc2),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate)
frameAll肯定指的是MainFrame,因为CSinlgeDocTeplate程序没有ChildFrame,
至于切换的方法,我现在也在摸索。程序中的有一个模板列表,说不定就可以实现
多个模板的切换,切换模板的同时,也就切换了MainFrame(遗憾的是,这也许只是
一种理想,理论上可行的理想,操作起来erro和warning肯定不少,各种书上只是
有使用多个CMultiDocTeplate,还未见过使用多个CSingleDocTeplate,或者
把CSingleDocTeplate和CMultiDocTeplate混用的例子,如果您看过,望告知
小弟和所有参与过这个帖子的朋友)

-----
我觉得1与2其实是一种情况---即多个CSingleDocTemplate,可以合并考虑。

to luogucai(萝卜) 朋友:
《目前单文档结构一般只允许你对一个文档进行操作,我们也可以同时对两个相同类型的文档进行操作,如果用户需要这样的操作,它可以启动两个进程。所以我们在设计程序时可以只关注对同一中文档而且只有一个文档的情况进行设计》
这是您的原话,我不知道您说的《单文档》,是指的《CSingleDocTeplate》,还是
指的《在wizard中选择sdi选项》,如果是前者,我个人认为不可能(原因见上),如果是后者
,似乎难度也不小,特别是您要同时显示两套《frame和view》。
最后,也感谢您的参与!!

---
似乎您也认为SDI的主要特征还是只有一套frame和view.










回复人: 52001314(不当程序员了) ( ) 信誉:99 2003-03-25 09:41:54Z 得分:0



我们一直讨论的都是理论的东西。
不过,如果是CsingleDocTemplate,好像没办法同时打开两个template。

如果FRAME使用MainFrame的话。
pDocTemplate1 = new CSingleDocTemplate(
IDR_TESTSDTYPE,
RUNTIME_CLASS(CDoc1),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CTestSDIView));
pDocTemplate2 = new CSingleDocTemplate(
IDR_TESTSDTYPE,
RUNTIME_CLASS(CDoc2),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CTestSDIView));

如果同时打开,明显是不行的。同时不可能有两个MainFrame存在吧?
在pTemplate->OpenDocumentFile(NULL);的时候。
CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass->CreateObject();返回空,第二个文档的MainFrame创建失败.

而在CDocument* CSingleDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
BOOL bMakeVisible)这个函数中,
if (pFrame == NULL)
{
AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);//提示建立空文档失败。
delete pDocument; // explicit delete on error
return NULL;
}

但是前面的pDocument = CreateNewDocument();是成功的。说明出错是因为没办法创建出新的MainFrame,而不是没办法创建新文档。

-----
如果有多套MainFrame又可以说是MDI程序了?
但是即便是SDI程序也同时创建多个文档。
wangyangcheng 2005-04-27
  • 打赏
  • 举报
回复
有一个老贴对此有比较深入的讨论:
http://search.csdn.net/Expert/topic/1559/1559269.xml?temp=.7216303

回复人: fishsward(.) ( ) 信誉:100 2003-03-24 13:05:44Z 得分:0



to 52001314(谁说程序员不用休息的?):


首先,还是要谢谢您的回答,谢谢所有参与过这个帖子的朋友。

然后,我想就两个问题说明我的观点:

1。 我们对“多文档”的定义不同(或者说理解不同)。依照某些人看,“多文档”是可以
“同时”支持多个“文档”,这些文档可能是同一种类型,也可能是不同类型,甚至还有可能只是
“同一个文档”的多个显示(比如说执行了window-》new window时)。而另外一些朋友的理解是:程序能够打开多种文档,即为“多文档”,也就是说,有可能打开另外一“种”文档之前,
必须关闭当前文档!!
如果依照前者的理解,的确,只有cmultidoctemplate才能实现多文档,
而 CSingleDocTemplate *pDocTemplate;
pDocTemplate=new CSinlgeDocTeplate(IDR,
CRunTimeClass(mydoc1),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate)


pDocTemplate=new CSingleDocTeplate(IDR,
CRunTimeClass(mydoc2),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate)
依旧还是单文档,因为它不能同时打开mydoc1和mydoc2
从这方面来说,其实他们的理解是没有分歧的!!!




2。我想说明一下Multidoctemplate的“multi”的作用:
我觉得,“multi”并不是说仅仅靠一个“CMultiDocTeplate对象,然后把mydoc1和mydoc2
分别加到CPtrList m_docList中去”,就可以实现打开多种类型的文档!!!!
“Multi”仅仅是说能够“同时”打开多个文档,一个"CMultiDocTeplate对象"只能打开一种
类型的文档.您希望您的程序支持多少种类型的文档,您就必须构造多少个"CMultiDocTeplate对象".
CMultiDocTeplate对象的成员变量CPtrList m_docList只是指向该"CMultiDocTeplate对象"能支持的文档”,并且他们是“同一种”类型的(也就是说
当您仅仅定义了:pDocTemplate=new CMultiDocTeplate(IDR,
CRunTimeClass(mydoc1),
CRunTimeClass(frameALL)
CRunTimeClass(ViewAll)
);
addDocTemplate(pDocTemplate)
时,您的程序其实仅仅支持一“种”文档————mydoc1类型的文档,只不过可以同时打开很多“个”“这种类型”的文档!!!

而用"CSingleDocTeplate"的弱点在哪里呢???其实CSingleDocTeplate程序也能
打开多种类型的文档,您定义了多少个CSingleDocTeplate对象,您的程序就能支持多少种
文档,只不过,它们不能同时打开罢了 不知您对此还有何看法??
愿问您的高见



------
我赞成其:
多Template才支持同时打开不同类型的document
单Template即使采用CMultiDocTemplate的话,仅仅是支持同时打开多个同一类型的document
wangyangcheng 2005-04-27
  • 打赏
  • 举报
回复
1.SDI程序的定义究竟是什么?

JJHOU在"深入浅出"中说过:

并不能说采用CSingleDocTemplate的程序就是SDI程序。

以下是别人的观点,我现在赞成SDI是指只有一套frame、menu、toolbar、statusbar,即使它
有多个view.
===================================================================================
多文档中,因为有ChildFrame,即使你只用一个文档。但是你可以用多个Template,这样,
你显示的时候,可以用不同的 frame,frame中有不同的view,每个frame可以有自己的
menu,toolbar,statusbar ,有多种的显示方式。

在单文档中,只有一个MainFrame.虽然可以达到多个view,但是只有一个frame.
=========================================================================================

如果我把SDI程序中的 new CSingleDocTemplate改为new CMultiDocTemplate那此程序到底是
算SDI还是MDI呢?


2. 以下是我总结的一份
CSingleDocTemplate CMultiDocTemplate

SDI 同时打开一个Document和一个View 支持多Document和一个View,
但只能同时开一个

MDI 只支持一个Document, 支持多个Document和多个View,
但可有多个View同时打开它 可以同时用多个View打开多个Document

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧