【vc++精品源码栏目提醒】:网学会员在vc++精品源码频道为大家收集整理了“【精品】CBX开发人员手册 - 其它资料“提供大家参考,希望对大家有所帮助!
从零开始,开发 CBX 的第一个工程这是每个 CBX 使用者的头等大事。
CBX 有两种核心项目类型:ao 和 xo。
所谓的“ao”代表着客户端对象,或者称之为 Applet我们从 Java 那里把这个很好的词汇借用过来,而 xo 呢,则是对应着 Servlet,意味着在服务器运行的 模块。
对于最开始的起步阶段,我们一般都是开发一个 ao,把它部署到服务器中,以此来感受CBX 的部署步骤。
一、编写和部署 ao每个 ao 的 Delphi 工程,其实是个 Delphi 动态库工程,这个动态库有以下必须的特性: 1、这个 dll 导出一个名叫“GetModClass”的函数,它返回当前 ao 中的主类, 这个类必须是 TModRoot 的直接或间接后代类。
2、这个 dll 必须引用名叫 CBRun 的 dcp。
当然,也可以同时附带引用二级包 CBExt。
如果 ao 中使用了很多 CBExt 中的类,那么引用 CBExt 有助于 ao 的编译体积的紧缩,这一点,由开发者自己衡量。
3、这个 dll 是以“.ao”为后缀的,尽管它的实质是一个 dll。
4、其他方面,这个项目的相关路径要指向 CBX 的相关位置,否则,项目无法 编译以及发布。
当然,根据这几个原则,开发者可以自己去从一个空白 dll 项目来创建 ao。
但是,更为方便的做法,就是,直接从 CBX 默认的 Demo 项目中去另存工程和窗体,这样,要方便很多。
一般,如果开启一个最基础的 ao 项目,那么可以直接从hello.ao 去复制代码,将项目名称和主窗体名称都另存为一个新的名称,同时把窗体的名称也改为一个有意义的名称(同时不要忘记修改 GetModClass 函数内的类名称: Result : TModYourClass)。
这里应提起注意的是,工程名和单元名都最好比较特殊,避免和已有 Delphi 单元重名,一般单元名前面加 u 前缀,工程名可以加 Mod 前缀(Demo 并没有完全这样做)。
我们开发 CBX 的 Chart 的 Demo 时,就有过深刻的教训,工程名称叫”Chart”,后来无论如何无法编译,最后调查到,TeeChart 有个单元也叫做“Chart”,而工程名称和它重名后,便无法编译通过。
在一切开始之前,我们要确保一件事,那就是 CBX 框架是否成功安装。
首先要确保 CBX 框架在目标服务器上成功安装,标志着这一点的,就是 Console 已经成功的登陆了服务器,应该是这个界面:确保了 CBX 框架安装成功,且 Console 已经顺利登陆 CBX 服务器,就可以开展正式的开发了。
打开最基本的 Demo: CBXTemplatesHello.ao Hello.dpr,将项目另存为某个目录下的另一项目名,同时将 uModTemplate.pas 另存为新项目路径下的另一文件名,同时,最好修改一下窗体名称,使名称与实现业务相关。
新项目需要设定几个地方:1、输出路径和搜索路径,都要设定到 CBX 目录的 CBXSDK__Deploy 和 CBXSDKLib 目录下。
现在,就可以试着编译一下项目,应该能够编译通过,一个.ao 文件在目标目录下产生了。
当然,我们需要的,肯定不是单单一个 hello.ao。
所以,我们开始了正题——开发 ao 的功能,这个过程和开发任何一个窗体几乎是一样的,只不过,所有需要在浏览器中显示出来的东西,一定要放在窗体的一个名叫“ContentPanel”的 Panel 中,这个 Panel 是自其父类派生而具备的控件,在其中的任何可视化控件,都会在运行时呈现出来。
如果可视控件直接放在了窗体上,而落在ContentPanel 之外,那么这个控件就会不被显示。
几乎所有的 VCL 控件都可以放在 ao 中使用。
不过,商业开发者们最感兴趣的,主要是那些强大的表格控件、报表、按钮、编辑框之类的。
其中 DevExpress 的全套对象,几乎都囊括到了核心包CBRun.bpl 中,所以,是我们非常推荐使用的控件。
2、打开控制台,连接服务器(可以是远程的服务器) 如果是远程,则 按此按钮。
输入远程服务器 如果是本机,则 地址。
如果是本 按此按钮。
机,则为空3、编译 ao 代码,然后点击 Deploy All In Dir,模块就被上传到服务器中。
新版本 的 Console 的这个按钮在 Deployment Dir 页中。
老版本的这个按钮在窗体右上 方。
4、部署成功的 ao,应该能够从 IE 中被浏览。
但这里,需要补充非常重要的一 点,那就是这个 ao 的 Dependency。
如果这个 ao 仅仅使用了 CBRun.dcp,那么 这部分完全不必设置。
但如果这个 ao 需要 CBExt.dcp,那么必须在 Dependency 中加入 CBExt 并存盘。
如果这个 ao 需要支持独立运行,恐怕还应加入 CBRunner 的条目: 在这里存盘 添加 Dependency当我们能够从浏览器中,看到了我们自己编写的 ao 的时候,那么,我代表 CBX 团队恭喜您:您的第一个 CBX 应用问世了!开发第一个 xo,这个过程和 ao 的项目几乎完全一样,只有少许区别在于:1、xo 项目都需要引用 AppSvrRT.dcp,而并非 CBRun.dcp2、xo 项目有 3 个预定义 xo 对象,分别对应三种数据库:MS SQL,Oracle, FireBird,如果开发者是针对这三种数据库,则可以直接从相应的对象派生,会 获得很多有用的函数。
如果是其他的访问方式,则需要从 TEntityRoot 派生。
这里面,还有一个极其核心的 “潜规则”:xo 是一个 Midas 服务端容器, xo 模块上的所有的 DataSetProvider 将被 Export,能够通过 RemObject 的方式,被ClientDataSet 访问。
所以,在 xo 中,可以放置一个 DataSetProvider,后面连接任意 Query 或其他DataSet。
这种机于 DataSetProvider 的中间层模式,就是传统的 Delphi 的 Midas 模式,只不过,客户端连接的方式是 RO。
xo 的范例,我们首先剖析一下 CBXTemplatesMultiTierDemo.xodemoSvr.dpr。
这个 FireBird 数据库的例子很好的展现了 xo 的开发模式:上面有几个DataSetProvider,后面连接 IBQuery。
我们同时打开相应的 ao 项目(CBXTemplatesMultiTierDemo.aoDemo.dpr),发现里面有三个控件:RODataSnapConnection1、ROMessage、RORemoteService。
其中,最重要的是 RODataSnapConnection1 的一个属性 ServerName,它对应的是,服务器端对象的名称,也就是 xo 对象的那个直接或间接继承自 EntityRoot 类的那个实体名称,对于 demoSvr.dpr 而言,它是 HRData。
我们部署了一个 XO后,可以在 AppSvr.dll/List 页面中,看到 XO 的名称,将其复制到 ServerName 属性中。
在 TRORoot 类的 InitModule 函数中,隐含的干了一件事情,那就是自动将ROChannel.TargetURL 的值指向了当前的服务器端地址,也就是执行了这么一句:ROChannel.TargetURL : CurrentContext.ServerURL /Bin这代表着,服务器端的地址已经被自动替换了,开发人员不必操心。
但是在设计时,这个地址需要指向一个切实存在的目标地址,才可以进行窗体设计。
将 MultiTier 的两个小工程分析透彻后,即可开发复杂多样的多层 CBX 应用了。
我们通过下图看到对于 AO-XO 之间的相互关联所需的控件属性: AO CBX Server TargetURL 属性 http://Server/CBX/AppSvr.dll/Bin XO ROChannel Provider Query ServerName 属性 RODataSnapConnection1 设置为 XO 的名称 Provider Query ProviderName 属性 设置为 XO 上 Provider 的名称 … ClientDataSetCBX 的调试 Provider Query 其他 ClientDataSetCBX 的服务端(XO)暂时没有很直观的调试方式,我们目前推荐通过书写日志的方式来调试,具体代码如下:SystemLogSvc.LogEventSomeDebugInforAsString运行中,我们即可 AppSvr.dll/List 来查看输出的结
上一篇:
计算机专业毕业论文主题
下一篇:
缅怀先烈 铭记历史