其实,在整个学习和使用atl server技术的过程中,因为vc的缘故,我是比较痛苦的;
反而,根据它的启示, 我用c#写了一个副产品,却让我体会到了收获成果的高兴。

概括: 将若干个股票的总括情况输出到doc文件中。就是说,将db中的一些信息,写到doc中的表格中。
这个doc 文件的格式,文字的字体,大小,等都是要根据不同的情况而设置的。写到表格中的内容,
包括一些表的一行记录, 还有,从另一些表查出来的多行记录,就是一个相对复杂的综合报表。
(或者,我们干脆称它为中国式的报表) 这一页报表,大约要涉及10几个table.

设计思想: 借用atl server的思路,
1。设置标志,然后以相应的内容替换。
2。设置标志,然后在标志处插入表格。
3。设计一个doc文件,作为输出文件的模板template.doc(相应与atlsever的srf文件)。
4。对每一个标志,专门为他动态的指定一个处理函数(相应于atlserver的tag_handler方法)。

标志完全与atlserver一样,如{{company('addr')}},在atlserver中,看到这个标志,
就会找tag=company的 方法,在这个方法中,根据参数'addr',进行处理。

在本程序中,这个思路也完全一样。
很自然的设计一个类Mark,它来表明一个mark的名字,参数,处理它的handler方法(用delegate实现)
在template.doc中,设置好各种表格,格式,并填写上各种标志。程序的开始,要把所有的Mark注册到一个集合中,
然后遍历这个集合,用其中每一个mark,找到相应的handler,执行handler中的处理程序。 再说,另外一个问题。
在handler中的处理中,大都要涉及到对word的操作,如replace,inserttable,setCellText(i,j),insertBmp等。
但这些所谓的automation操作,都有其一定的响应时间,但你认为它应该把某个功能做好的时候,它却抛出了异常。
只好重复再执行N次,直到成功为止。(一般也就3,4次,我设置最多执行20次) 为解决这个问题,我把对word的
所有操作独立成一个原子操作,封装起来,目的就是能让这些原子操作确实执行, 然后调用这些封装后的方法。
这样程序就具有了三个性能:
1。通过封装对word的原子操作,保证了对word调用的健壮。
2。通过template.doc,可以对输出内容及格式任意变化。
3。通过设置mark,和mark_handler,可以实现对mark的任意处理。

20040702(写完了,就可能不在上班了,也上不了网了,BYE,MY-BLOG)