//转的,怕想百度博客一样搬家,赶紧先复制下来。

框架其实就是一种开发模式,用tangram框架开发应用程序意味着选择一种面向接口、模块化的开发方式。这和传统的Delphi应用程序开发方式有一定区别,对于刚刚接触框架的童鞋可能不知道如何下手,因此有必要把框架的一般开发方式说明一下。不过框架比较灵活,因此这里仅仅说我的使用经验,如果有更好的方式或建议欢迎大家一起探讨。

1. 应用程序的目录结构 
典型的目录结构为,主程序(Host)放一个目录,其他各个模块都放在独立的目录下,此外,还有一个Bin目录,是主程序和各个模块的编译输出目录;还有一个Interfaces目录,用于保存整个项目的接口单元,Interfaces目录的路径必须加到主程序和各个模块的搜索目录中,可以点”Project”->”Options”-“Directories/Conditionals”在”Search Path”里加,为什么要这么麻烦的设置各个模块的私有搜索路径而不直接加到Delphi的搜索路径是因为加到Delphi的话,如果你还有其他使用框架的项目的话就很容易混淆;还有另一个和Interfaces目录一样重要的目录就是DCP目录,DCP也样加到各个模块和主程序的私有搜索路径中,DCP用于作为BPL包的DCP输出路径,每个包编译时都会生成一个DCP文件,包有依赖关系会用到它,因为每个程序一般都需要有一个放祖先类等东西的包,这个详细请看第2点“程序的一般结构”。此外可能还有象Doc(用于放项目文档),Images(用于放图片图标)等目录,但不是框架必须的。

2. 程序的一般结构 
一个项目至少有一个主程序(Host),还有若干个模块(BPL或DLL)。传统的开发方式,我们一般都先在主程序创建菜单和工具栏,然后在菜单和工具栏按扭下写代码创建相应的窗体,但我建议放弃这种开发方式,在使用框架开发中,主程序的菜单以和工具栏应该是在模块中创建的,加载相应的模块才会有相应的菜单和工具栏,这样程序扩展性非常灵活(既插件化)。因此,主程序必须实现一个接口,一般叫IMainForm(叫别的也行),用于包装一些创建菜单、工具栏以前创建窗体等功能,模块可以通过这个接口创建自己的菜单和工具栏等。这里会遇到一个问题就是,菜单或工具栏因为创建的时候不同顺序不太好控制,这个有很多种解决方法,比如可以象AdvancedDemo展示的那样可以自己定义菜单的顺序,但那样相对麻烦,我更倾向于在设计期把菜单的结构设计好,菜单的项才由模块创建。当然还有别的控制方法,可以自行发挥。 
另外,一个项目最好还有一个公共包,公共包里可以放一些基类,我建议一个项目所有的窗体最好都继承自一个共同的基类,这样你可以设置一些共同的风格,比如字体等等,还有其他很有用的东西,当然基类下面可能还有各个分支,比如单据基类,字典基类等都放公共包中。此外,公共包还可以放个DataModule,可以放一些共公的东西,比如imageList,里面放些图标整个项目都可以共用,还有全局变量也可以定义成DataModule的成员,比如登录的用户信息等。甚至放共公的数据库链接(DBConnection),总之这个是很有用的。不过别忘了创建DataModule的实例,可以在单元的initialization里创建,finalization里释放。使用这个公共包需要让主程序或者模块都依赖它,引用相应的单元就行了。公共包不必用框架的IDE向导来创建,普通的BPL就行,也不必configtool.exe安装,把它的DCP输入目录设成第1点提示到DCP目录就行。 
最后还有一个模块加载问题。如果不是特别需要,我建议让框架自动加载模块,让框架自动加载模块很简单,把框架自带的configtool.exe拷贝到bin目录下,运行它,点击”工具”->”模块管理”,在里面安装你的模块(DLL或BPL),然后运行主程序就行了。

3. 模块用BPL还是DLL好? 
BPL和DLL各自有各自的优点和缺点,框架2.5版本以前只支持BPL模块,2.5后支持BPL和DLL两种模块方式。不过我建议,一般的模块最好都使用DLL方式,而象第2点所提到的公共包才使用BPL。用BPL模块发布时,需要带上用到的第三方控件的包,而用DLL模块则可以自己选择带或者不带,默认是不带,不过不带的话编译出来会比BPL大一些。对于一些大的控件,比如Dev Express,可以把Dev的所有包合并成一个然后带上(如何合并可以看这篇文章:http://hi.baidu.com/tintinsoft/blog/item/40934a0edac6373f6159f351.html)。

4. 打包发布程序 
因为框架需要带包编译,因此发布时要带上一些包。一般情况下有Delphi的一些包,比如vclxxx,rtlxxx,还有框架的核心包tangram_core.bpl,还有自己创建的一些包,比如公共包,以前第三方控件的包。如果模块是BPL,那可以用框架自带的PackageRequires找到要带上的包,如果是DLL只能自己看它依赖的包或者借助第三方的工具了。

[转]Tangram框架应用开发的一般模式的更多相关文章

  1. 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组

    真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...

  2. Navi.Soft30.框架.WinForm.开发手册

    阅读导航 Navi.Soft30.Core类库.开发手册 http://www.cnblogs.com/xiyang1011/p/5709489.html Navi.Soft30.框架.WinForm ...

  3. 浅析Thinkphp框架中运用phprpc扩展模式

    浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc ...

  4. 使用 CodeIgniter 框架快速开发 PHP 应用(四)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(四) 使用 CI 简化数据库开发你学习CI 是因为你想要使编程更容易和更有生产力.这一章讲述CI的Active Record类. 如果C ...

  5. 使用 CodeIgniter 框架快速开发 PHP 应用(一)

    原文:使用 CodeIgniter 框架快速开发 PHP 应用(一) 对 CodeIgniter 的介绍大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事.这篇文章是有关 ...

  6. 使用Maven搭建Struts2框架的开发环境

    一.创建基于Maven的Web项目

  7. Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码

    Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 ...

  8. Taurus.MVC 微服务框架 入门开发教程:项目部署:2、让Kestrel支持绑定多个域名转发,替代Ngnix使用。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  9. Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局部模块升级。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

随机推荐

  1. [Android] 解析android framework下利用app_process来调用java写的命令及示例

    reference to :http://bbs.9ria.com/thread-253058-1-1.html 在android SDK的framework/base/cmds目录下了,有不少目录, ...

  2. checkbox复选框全选

    HTML: <input type="checkbox" class="all"> <input type="checkbox&qu ...

  3. JQuery阻止冒泡事件on绑定中异常情况分析

    科普下事件冒泡以及默认行为,以下面例子举列子:     事件冒泡:当点击内部button元素时,会触发自身及外层 a的点击事件,这就是事件冒泡引起的.事件会随着 DOM 的层次结构依次向上传播. 事件 ...

  4. Android源码-学习随笔

    在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...

  5. C语言中do...while(0)的妙用

    在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语句: 通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错 ...

  6. HDU5792 World is Exploding(树状数组)

    一共6种情况,a < b且Aa < Ab, c < d 且Ac > Ad,这两种情况数量相乘,再减去a = c, a = d, b = c, b = d这四种情况,使用树状数组 ...

  7. golang json 包简单分析

    首先上代码: func main() { b := true a1, _ := json.Marshal(b) a2, _ := Marshal(b) fmt.Println(string(a1)) ...

  8. 怎样在linux下安装网卡驱动

    由于我电脑的各种奇葩问题的存在,导致我装上Ubuntu13.10之后网卡居然无法使用,坚持了挺久使用无线网,终于坚持不住了,百度了各种解决方式,终于成功解决.这里也记录一下我的解决过程,供大家参考.大 ...

  9. Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构

    分享两篇Win 10应用开发的XML文档结构:Win 10 开发中Adaptive磁贴模板的XML文档结构,Win10 应用开发中自适应Toast通知的XML文档结构. Win 10 开发中Adapt ...

  10. javase基础笔记2——数据类型和面向对象

    API:Application program interface  程序调用一个方法去实现一个功能 正则表达式:regex 用来匹配的 javaEE里边有三大框架 SSH struts spring ...