C#编写文本编辑器
脚本环境还模拟实现了文档事件的处理,比如文档中某些元素对象支持onchange事件,这些元素是有名称的,当用户修改这些元素的内容时,程序会查询脚本引擎来看是否存在名为对象名称_OnChange的过程存在,若存在则执行它,这样就模拟实现了事件处理。 在脚本环境中,全局对象的成员函数可以直接调用,因此在vbsystem中定义一些例程就可以直接调用,可以在vbsystem中定义诸如
Alert,ConFirm,Prompt,DebugPrint等成员函数,脚本中就能直接使用这些函数了。 访问数据库
由于应用需要,本文本编辑器要直接访问数据库,但该文本编辑器既使用于C/S程序又使用于B/S程序,当处于B/S构架时是不好直接连接数据库的,必须通过服务器程序来访问数据库。为了编程方便,应该抹杀掉这两种模式之间的差别。
大家考察一下.NET框架中操作数据库的类型,可以发现无论是专门操作SQLServer的在System.Data.SqlClient名称空间下面的那套对象还是操作OLEDB的在
System.Data.OleDb空间下面的那套对象(其他类似有专门操作ODBC和ORACLE),这些套对象间最大的共同点就是都遵循一套在名称空间System.Data下接口。这些接口包括IDataReader , IDbCommand,IDbConnection,IDbDataParameter,
IDataParameterColleciton等等 。若我们编了一套对象也实现了这些接口,那就相当于自定义了一套.NET数据库驱动程序。于是小弟很快根据B/S构架特性写了套对象,该套对象通过HTTP协议和WEB服务器交流数据,这套对象将SQL语句及其参数简单打包使用POST方法发送到指定的服务器页面后等待返回,服务器页面解析出SQL语句和参数查询数据库,将查询所得结果经过一定的编码返回为客户端,而客户端根据HTTP返回结果进行一番处理后就可以使用一个实现IDataReader的对象来访问了。这样在应用程序的其他模块若查询数据库则只要坚持使用System.Data.IDbConnection 等接口就可以了,如此就抹杀了C/S和B/S环境下访问数据库的差别了。
这种模式也算是一种WebService了,服务器页面可以使用任何类型,可以使用
ASP,,PHP,J2E或JSP等等,只要能解析出SQL语句并返回特定结构的数据就行了。小弟的服务器为J2E,偶JAVA不熟,勉强用JSP实现了一个。我管这种模式叫两层半,实践证明这套还是管用的。
派生对象
定义了基础对象后就开始派生对象了,首先定义字符对象类型TextChar,一个文档内容中最主要的还是字符数据,在此为了实现方便,文档中每一个字符都是一个字符对象,字符对象重载了RefreshSize对象RefreshSize方法,用于根据当前绘制用的绘图对象(System.Drawing.Graph对象)的MeasureString来计算文字大小。注意默认情况下,该方法计算的字符串显示宽度后回额外的附加一些空白,为了计算实际的大小则使用
System.Drawing.StringFormat.GenericTypographic参数。此外还有一个比较特殊的字符-制表符。这个字符的宽度是不固定的,需要在进行排版的时候才计算。
字符对象(TextChar)还派生RefreshView方法,该方法比较简单,根据Left,Top值进行坐标转换后算出绘制地点,然后调用System.Drawing.Graph.DrawString方法即