文档数据的读操作
对于上述过程,我们所做的仅仅是在文档类的Serialize函数中添加文档数据读取(加载)和存储的代码。需要说明的是,Serialize函数的参数ar是一个CArchive类的引用对象。CArchive类提供了"<<"和">>"运算符,分别可以向文档对象写入数据或从文档对象中读取数据。它们的含义与C++中的"<<"和">>"运算符相同,只不过CArchive支持更多的数据类型,如:CObject、CString等。除此之外CArchive类还提供ReadString和WriteString成员函数来读写文档中的一行文本。下面的过程用来将文档的文本内容读出并保存到一个字符串集合类对象中。
(1) 将解决方案管理器窗口切换到"类视图",展开所有的类,右击类名"CTextViewerDoc",从弹出的快捷菜单中选择"添加"->"添加变量",弹出"添加成员变量向导"对话框,在"变量类型"框中输入CStringArray,在"变量名"框中输入m_strContent,如图4所示。单击"完成"按钮。
CStringArray是"字符串集合类",它封装了CString数组对象的全部操作。类似的还有对BYTE、UINT、WORD和DWORD等类型的数组操作的集合类CByteArray、CUIntArray、CWordArray和CDWordArray。这些集合类都有相似的操作,如Add(添加)、RemoveAll(删除全部元素)、GetAt(获取指定数组下标的元素)等。
图4 添加成员变量
(2) 在CTextViewerDoc::Serialize函数中添加读取文档文本内容代码,如图5所示。
图5 添加的读取文档文本内容代码
代码中,ReadString是读取打开的文档的一行文本,当成功读出时,函数返回TRUE,当文本达到文档结尾时,函数返回FALSE。这样,通过while循环可以将文档的文本内容全部读取并保存到m_strContent中。
(3) 由于另一个文档打开时,需要将m_strContent中的内容清除,所以我们需要跟踪DeleteContents函数。在CTextViewerDoc类的属性窗口,单击"重写"按钮,在列表框中找到DeleteContents函数项,单击右边的空格后再单击右侧的下拉按钮,出现一个下拉列表,如图6所示。
图6 添加DeleteContents函数的重写
(4) 单击"<添加>DeleteContents",该函数的重写就添加好了。这样,框架在自动执行该函数时就会将自己添加在这个函数中的代码也会被执行。
(5) 在DeleteContents中添加如图7所示的加框代码。
图7 在DeleteContents函数中添加的代码
这就是文档文本内容的整个读取过程。需要说明的是,也可以将"m_strContent.RemoveAll();"语句直接添加在图5中的while循环语句之前,从而可以省略(5)和(6)的步骤。