浅谈Delphi开发经验[2]
有经验的程序员完成特定的功能会充分考虑可变的情况 将这些地方提取出来 定义为方法参数或者从配置文件中读取 这样即使需求发生变化 也能轻松应对 要写出易维护的程序应该在软件配置化和程序动态化上下功夫 特别提一提程序动态化 现在开发网络游戏的很多 而且一般都会用到脚本引擎Lua来实现部分逻辑 这样在开发后期的调整相对变得轻松一点 以后在服务器上做修改也不会要求重新启动程序 当然在一般的项目或产品中一样可以考虑使用脚本引擎 当然不一定要用Lua 还可以有很多别的选择 比如 DelphiWebScript RemObjects Pascal Script AUTOMA atPASCAL SCRIPTER FastScript Innerfuse Pascal Script 如果还有更高的要求 还可以考虑利用COCO/R (ParserBuilder)来实现自己的语法解析器
开发中通常会遇到自己不能解决的问题 要知道你遇到的问题别人可能早就遇到过并解决 因此请教他人或者请教Google通常是最好的选择 上论坛提问是没有效率的方法
控件开发
控件分为不可视控件与可视控件 不可视控件其实与一般的类没什么太大的区别 只需要公布需要公布的属性为Published 如有需要也可以设计并注册自己的属性编辑器
开发控件也有专业的开发工具Eagle CDK和Eagle reAct 您不仅可以很方便的创建类 还可以在运行期测试控件 可以很方便的修改属性 即时看到效果 大大提高了开发效率
软件破解
愈来愈多的开发者开始采用RSA来作为注册的加密算法 效果还算不错 虽然仍不能防止被爆破 但是至少不会出现(内存)注册机 对软件加壳也不是什么防弹衣 对于有经验的破解者几分钟就可以用OllyDbg从内存Dump(先用Process Explorer杀掉屏蔽调试工具的线程) 接着就是用Import REConstructor修复IAT 再用Lord PE对EXE进行优化
DeDe可以让破解者看到程序内的资源 事件 既可以静态分析 也可以在OllyDbg中对分析出的地址进行动态调试
破解Delphi控件当然也可以用DeDe 但是我们有更好的选择 那就是DCUcu与Dcu Pas 可以将Dcu直接反编译成汇编代码 通过静态分析其中的字符串以及调用的API 破解真的是很容易
只有做到知己知彼 才能做到有的放矢 反破解就是做到以最小的保护代价来使得破解者付出极大的破解行动
版本控制
版本控制最流行的就是VSS CVS SVN 我比较喜欢SVN 但是由于在Delphi下始终没有很方便的连接SVN的插件 因此 仍然是Delphi+VSS是最方便的版本控制的选择 VssConneXion是专门用于为Delphi增加VSS支持的插件 确实为开发人员带来了无比的便利 Delphi+TortoiseCVS与Delphi+TortoiseSVN同样也是不错的选择 VSS最大的缺点就是只能在内网中使用 除了可以透过***来允许远程访问外 我们还可以用Dynamsoft SourceAnyWhere或SourceOffSite实现VSS通过Internet访问 当然VSS 也支持Internet访问 如果你是个人开发者 觉得使用VSS也太麻烦 不妨试试FileHamster
软件测试
在提交给测试人员前 要求开发人员首先做自测 不要出现给测试人员的是一个都不能运行的版本 这样是对测试人员的不尊重
Java有JUnit Net有NUnit 同样Delphi也有DUnit 这主要是用来做单元测试用的 特别是在不停的代码重构中 能够及时发现修改出的问题 是每日构建中的重要组成部分 开发人员在完成功能前就写好测试用例代码 也称之为测试驱动开发 让自己作为自己代码的第一个用户 以确保自己提交的代码是易用的 正确的 让测试人员更专注于发现那些隐藏的逻辑性错误
TestComplete是AutomatedQA出品的专业自动化测试工具 与Rational Robot和Mercury WinRunner相比 特别适合用于Delphi开发的程序的测试 自动化测试可以减轻测试人员的工作量 提高他们的测试效率 当然 采用自动化测试对于测试人员的要求就更高了 因为需要测试人员维护测试脚本
缺陷管理
测试人员的报告需要反馈给开发者 同时又要知道开发者的修改意见 上级主管需要知道当前的测试进度与修改情况 这一切都是需要缺陷管理系统所管理的 通常缺陷管理都是做成B/S系统 当然也有提供客户端的 JIRA Mantis Bugzilla Axosoft OnTime Axosoft PowerTrack Bug Tracker BugFree Dev Hound SourceGear Dragnet TestTrack Pro URTracker 同样有很多选择
lishixinzhi/Article/program/Delphi/201311/24782
Web 开发有多种应用形式,要看应用的平台(比如是电脑还是手机)。
以下提供用 delphi 开发 web 的一些方式:
一、使用 Indy 组件包里的 Internet 控件
如果是开发网络应用(架构web服务器等),可以使用 Indy 组件包里的 Internet 控件。
二、使用 IntraWeb 组件
IntraWeb很像是普通的应用程序,唯一不同的是它的用户界面是用浏览器代替了通常的Windows界面,当把应用程序安装到Web服务器上之后,用户马上就可以通过它的网络地址来开启它,应用程序会马上建立使用者的用户信息,这样就可以避免丢失用户信息或者与其它的使用者发生使用混乱。
三、开发 Android / IOS 手机应用
此外,UniGUI 组件包改编 ExtJS 框架,提供了一整套的 web UI 元素。
由Borland公司推出的Delphi是全新的可视化编程环境,为我们提供了一种方便、快捷的Windows应用程序开发工具。它使用了MicrosoftWindows图形用户界面的许多先进特性和设计思想,采用了弹性可重复利用的完整的面向对象程序语言(Object-OrientedLanguage)、当今世界上最快的编辑器、最为领先的数据库技术。对于广大的程序开发人员来讲,使用Delphi开发应用软件,无疑会大大地提高编程效率,而且随着应用的深入,您将会发现编程不再是枯燥无味的工作——Delphi的每一个设计细节,都将带给您一份欣喜。
Delphi是Borland公司研制的新一代可视化开发工具,可在Windows3x、Windows95、WindowsNT等环境下使用。当前,DELPHI也可以为LINUX平台上开发应用,其在LINUX上的对应产品Kylix。
DELPHI拥有一个可视化的集成开发环境(IDE),采用面向对象的编程语言和基于部件的开发结构框架。Delphi它提供了500多个可供使用的构件,利用这些部件,开发人员可以快速地构造出应用系统。开发人员也可以根据自己的需要修改部件或用Delphi本身编写自己的部件。主要特点如下:
(1)直接编译生成可执行代码,编译速度快。由于Delphi编译器采用了条件编译和选择链接技术,使用它生成的执行文件更加精炼,运行速度更快。在处理速度和存取服务器方面,Delphi的性能远远高于其他同类产品。
(2)支持将存取规则分别交给客户机或服务器处理的两种方案,而且允许开发人员建立一个简单的部件或部件集合,封装起所有的规则,并独立于服务器和客户机,所有的数据转移通过这些部件来完成。这样,大大减少了对服务器的请求和网络上的数据传输量,提高了应用处理的速度。
(3)提供了许多快速方便的开发方法,使开发人员能用尽可能少的重复性工作完成各种不同的应用。利用项目模板和专家生成器可以很快建立项目的构架,然后根据用户的实际需要逐步完善。
(4)具有可重用性和可扩展性。开发人员不必再对诸如标签、按钮及对话框等Windows的常见部件进行编程。Delphi包含许多可以重复使用的部件,允许用户控制Windows的开发效果。
(5)具有强大的数据存取功能。它的数据处理工具BDE()是一个标准的中介软件层,可以用来处理当前流行的数据格式,如xBase、Paradox等,也可以通过BDE的SQLLink直接与Sybase、SQLServer、Informix、Oracle等大型数据库连接。Delphi既可用于开发系统软件,也适合于应用软件的开发。
(6)拥有强大的网络开发能力,能够快速的开发B/S应用,它内置的IntraWeb和ExpressWeb使得对于网络的开发效率超过了其他任何的开发工具。
(7)Delphi使用独特的VCL类库,使得编写出的程序显得条理清晰,VCL是现在最优秀的类库,它使得Delphi在软件开发行业处于一个绝对领先的地位。用户可以按自己的需要,任意的构建、扩充、甚至是删减VCL,以满足不同的需要。
(8)从Delphi8开始Delphi也支持Net框架下程序开发。
当前DELPHI已经成为一个品牌,而不仅仅是一个开发平台或开发语言的名称。当前DELPHI产品已经由CodeGear公司继续发展,该公司是BORLAND公司的全资子公司。当前,CodeGear为广大开发者提供了DELPHIFORPHP,以高度可视化的方式全面支持面向对象的PHP网站开发,大大提高了PHP开发网站的代码复用程度,成为WEB应用开发的新利器。
从开发平台到服务器的向上适化
适化概述
所谓适化就是将桌面应用转化为Client/Server应用
适化是一个很复杂的主题 这里不详细讲述 本节将介绍适化Delphi 应用程序中最重要的方面
适化的主要方面有
● 将数据库从桌面平台到服务器的适化
● 将应用程序转化为Client/Server的适化
适化还需要实现从桌面环境到Client/Server环境的转化
桌面数据库和SQL服务器数据库在许多方面有不同之处 例如
● 桌面数据库用于同一时刻单用户的访问 而服务器用于多用户访问
● 桌面数据库是面向记录的 而服务器是面向集合的
● 桌面数据库将每个表存储在独立的文件中 而服务器将所有的表存储在数据库中Client/Server应用必须解决更新的问题 最复杂的是联接 网络和事务控制
适化数据库
适化数据库包含下列步骤
● 在桌面数据库结构的基础上 定义服务器上的元数据
● 将数据从桌面转化到服务器中
● 解决下列问题
● 数据类型差异
● 数据安全性和完整性
● 事务控制
● 数据访问权
● 数据合法性
● 锁定
Delphi提供了两种方法适化一个数据库
● 使用Database Desktop工具 选择菜单Tools/Utilities/Copy to命令将数据库表从桌面方式拷贝到SQL格式
● 建立应用TBatchMove部件的应用程序
这两种方法都可以将表结构和数据从桌面数据源转化到服务器上 依靠这些数据库 可能需要改变结果表 例如 可能想进行不同数据类型的映射
也可以将下列特征加入数据库
● 完整性约束
● 索引
● 检测约束
● 存储过程和触发器
● 其它服务器特征
如果用SQL脚本和服务器数据定义工具定义元数据会更有效 然后用前面介绍的两种方法转移数据 因为如果是手工定义数据库表 Database Desktop和TBatchMove 部件将只拷贝数据
适化应用程序
在理论上 设计用来访问局部数据的Delphi应用程序做很少的修改就可以访问远程服务器上的数据 如果在服务器上定义适合的数据源 你就能将应用程序指向访问它 这只需简单地改变应用程序中TTable或TQuery部件的DatabaseName属性
实际上 在访问局部和过程数据源之间有许多重要的不同之处 Client/Server应用程序必须解决大量的在桌面应用中所没有的问题
任何Delphi应用程序都能用TTable或TQuery部件访问数据 桌面应用程序通常都是使用TTable部件 当适化到SQL服务器上时 用TQuery会更有效 如果应用程序要检索大量记录 则TQuery部件要略胜一筹
如果应用程序使用统计或数学函数 那么在服务器上通过存储过程执行这些函数会更有效 因为存储过程执行更快 使用存储过程还可以减少网络负载 特别是大量行数据的函数
例如 计算大量记录的标准差
● 如果该函数在客户端执行 所有的值从服务器上检索出来并送到客户端 导致网络拥塞
● 如果该函数在服务器端执行 则应用程序只需要服务器上的答案
Delphi客户/服务器应用实例分析
本节中采用的实例是Delphi 数据库的例子CSDEMO CSDEMO是Delphi客户/服务器编程的示例程序 它采用的数据库服务器是Local InterBase Server
CSDEMO较好地示范了BDE环境的配置 InterBASE Server高级功能应用 SQL服务器联接 触发器应用 存储过程编程和事务控制技术等 具有较高的参考价值 本节讲述下列内容
● 数据库环境介绍
● TDatabase的应用
● 不同数据库表的切换
● 触发器编程
● 存储过程编程
● 事务控制应用
数据库环境介绍
本例中采用的数据库服务器是Local InterBase Server Local InterBase是InterBase Server的单用户版 位 兼容ANSI SQL Local InterBase支持客户/服务器应用在单机上的开发和测试 并且可以很容易地适化到InterBase Server上 因此 开发客户/服务器应用采用Local InterBase作为原型开发环境是很方便的
IBLOCAL的BDE参数
本例中的SQL数据库是IBLOCAL 它是由BDE配置工具(BDECFG EXE)设置参数值 它的各项参数值列于下表
表 IBLOCAL的各项参数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
参 数 名 参 数 值
────────────────────────────────────
TYPE INTRBASE
PATH
SERVER NAME C:\INTRBASE\EXAMPLES\EMPLOYEE GDB
USER NAME SYSDBA
OPEN MODE READ/WRITE
SCHEMA CACHE SIZE
LANGDRIVER
SQLQRYMODE
SQLPASSTHRU MODE SHARED AUTOMIT
SCHEMA CHCHE TIME
MAX ROWS
BATCH COUNT
ENABLE SCHEMA CACHE FALSE
SCHEMA CACHE DIR
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
数据库结构介绍
IBLOCAL数据库的结构都是由InterBase服务器工具交互式SQL工具(ISQL)定义的
用ISQL定义数据库 首先要用Create Database命令建立数据库 建立的新数据库一般是以GDB为扩展名 建立好后 就可以用SQL语言定义数据库表 例如建立EMPLOYEE表的SQL语句如下
定义域名数据类型
CREATE DOMAIN FIRSTNAME AS VARCHAR( )
CREATE DOMAIN LASTNAME AS VARCHAR( )
CREATE DOMAIN COUNTRYNAME AS VARCHAR( )
CREATE DOMAIN EMPNO AS SMALLINT;
CREATE DOMAIN DEPTNO AS CHAR( )
CHECK (VALUE = OR (VALUE > AND VALUE <= ) OR VALUE IS NULL)
CREATE DOMAIN JOBCODE AS VARCHAR( )
CHECK (VALUE > )
CREATE DOMAIN JOBGRADE AS SMALLINT
CHECK (VALUE BEEEN AND )
CREATE DOMAIN SALARY AS NUMERIC( )
DEFAULT
CHECK (VALUE > )
建立EMPLOYEE表
lishixinzhi/Article/program/Delphi/201311/25125
现在网络的流行 使得服务器程序得到了广泛的应用 那么我们使用Delphi如何设计出强壮的服务器呢?
有人说 如果要设计服务器的话 一定要使用VC来设计 其实这个人说的有一定道理 因为如果你要使用Delphi来设计服务器的话 要想设计高效的服务器就不要使用Delphi带来的大部分的控件(最好不要使用Delphi控件) 为什么呢?下面我会告诉大家 这样的话你全部使用API来设计服务器 就同VC没有太大的区别了
使用Delphi来设计服务器程序 具体选择是使用窗体消息模式还是使用完成端口的模式 这主要看你的用户连接数量来决定 如果你的用户连接数量小于 人的话 并且处理的数据量不大的话 可以使用窗体的消息模式来进行服务器的开发 而如果大于 这样最好使用完成端口来开发服务器 我这里建议大家最好使用完成端口模式 因为你不可能保证你的用户数量不变化 同时由于你的服务器如果运行一段时间没有问题的话 最好做成WIN 的服务程序 这样可以保证后期的维护比较少
现在介绍你在开发Delphi服务器的时候需要注意地方
不要在程序中使用String变量
这个也是在实际的开发过程中发现的 我最开始开发的时候 为了简单一些 就大量使用String变量来开发程序 但程序总是在运行一段时间后出现问题 后来查原因也不太清楚 到网上查资料 发现有人介绍不要使用String来做变量 将自己的程序全部修改成数组问题就基本解决了
使用快速的加密算法如XOR 加密或DES加密等算法
服务器在与客户端传递的时候一定要进行加密 但使用什么类型的加密算法呢?不要使用那种需要大量运算的算法如RSA等算法 最好使用XOR加密或DES换位加密算法 这样主要是满足普通的加密密文的要求 又保证服务器的运算速度 你也可以使用RSA加密密文 但这会造成服务器处理变慢 而如果遇到大量的处理时候 很容易服务器就拒绝服务器
使用原ADO函数来连接数据库
服务器程序通常都与数据库想结合 那么使用Delphi开发的时候 通常使用ADO的控件来制作 但如果你学习ADO手册会发现 对于服务器其实不需要控件来完成数据的操作 可以直接使用ADO相应的函数来完成 主要因为服务器程序与数据库通常都是比较简单的操作 没有很复杂的 所以使用原ADO模式就可以了 这样也减少由于ADO控件带来的问题
应多使用 池
服务器在设计的过程 一定要大量的变量支持 如果不使用池这个概念 你的程序将在创建和释放变量过程中浪费大量的时间 而且容易出现问题 设计过程中尽量不要创建和释放变量 如果能考虑到的变量 都在开始的运行的时候创建完毕 这样可以加快程序的运行速度 减少冲突 具体如何使用池这个技术 以后有时间再考虑写一篇介绍一下
熟练使用指针操作
如果你不熟悉指针操作 那么你几乎无法设计出高效的服务器 如果你要真正的理解指针的概念 对于设计服务器来说就是如虎添翼
下面举个例子 如使用Recv接收数据到Buffer中后 你需要进行解密操作 你可以使用下面的方法进行
var a b:array [ ] of byte; i :integer; ResultBuffer :array [ Max] of byte;begin for i := to Sizeof(Buffer) div do begin move(Buffer[(i ) + ] a ); Des(a b true); //这里使用DES加解密处理 move(b ResultBuffer[(i ) + ] ); end;endlishixinzhi/Article/program/Delphi/201311/24703
0条评论