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

框架其实就是一种开发模式,用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. 【EM算法】EM(转)

    Jensen不等式 http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html 回顾优化理论中的一些概念.设f是定义域为实数的函数 ...

  2. .NET微信公众号开发-5.0微信支付

    一.前言 在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请 ...

  3. Hibernate单向多对一对象关系模型映射

    单向的many-to-one 案例: 班级和学生 父亲和子女 单向:只能由其中一方维护关系 Many-to-one中有many的一方法维护或者体现两者之间的关系. 单向的many-to-one描述学生 ...

  4. Xcode添加注释

    VVDocumenter-Xcode,自动生成注释,感觉比较方便的插件,分享下,应该很多人都知道= = 在 https://github.com/onevcat/VVDocumenter-Xcode  ...

  5. The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.

    出现这样的错误: error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your C ...

  6. ASP.NET 下载文件并继续执行JS解决方法

    需求说明:当用户点击按钮时使当前按钮为不可用,并打开新页面,关闭新页面时,按钮变为可用.并且如果不关闭新页面,当前按钮过10秒钟自动变为可用. 包含3个页面: 一.按钮页 前台代码:当刷新后采用js进 ...

  7. flume学习

    下载 自定义sink(mysql) 1.ide打开下载后的源码 2.代码如下: /** * Licensed to the Apache Software Foundation (ASF) under ...

  8. 51nod1057(python2计算n!)

    题目链接:www.51nod.com/onlineJudge/questionCode.html#!problemId=1057 思路:直接for循环呗- 代码: n = int( raw_input ...

  9. php常用判断的函数

    empty($var)        //用来检查变量是否为空(没有值或零值) isset($var)           //这个//测试一个变量看它是否已被定义. gettype($var)   ...

  10. SQL中的JOIN类型解释(CROSS, INNER,OUTER),关键字ON,USING

    书上讲得明白,解了不少迷惑. SELECT e.fname, e.lname, d.name FROM employee AS e INNER JOIN department AS d ON e.de ...