结合Delphi
客户端桌面开发的优势和Java的稳健强壮特性,采用Delphi
Client + Java Server的系统架构应该是很有市场的,经过一段时间的实际项目实践,实现架构是这么实现的,供讨论:
1.后台应用服务层可采用基于Spring+Hibernate的轻量级J2EE实现,并使用Apache XML-RPC
提供客户端调用接口;
2.前台采用 Delphi
XML-RPC
调用服务器端业务实现接口;
3.后台和前台分别实现XML-对象序列化;
4、可选用SLL,可支持数据压缩;(这个需要对Delphi
XML-RPC
实现作一些扩展)
系统架构实现基于几点考虑:
1、XML-RPC
同SOAP比较:由于Delphi
SOAP客户端存在一些性能问题和同Java实现存在一些兼容性问题,因此考虑采用XML-RPC
实现,而且XML-RPC
实现同SOAP实现相比较,性能要好很多;
2、XML-RPC
同SOCKET比较:采用HTTP协议可以有效穿透不同网络防火墙;
3、采用XML格式交换数据,而不采用XML-RPC
标准格式交换数据,主要是由于XML-RPC
格式比较简单,复杂的数据格式很难满足需求,直接使用对象XML数据流方式,有利于系统扩展;
使用的第三方软件列表(开源产品,可用于商业开发)
Spring Framework:http://www.springframework.org
Hibernat ......
结合Delphi
客户端桌面开发的优势和Java的稳健强壮特性,采用Delphi
Client + Java Server的系统架构应该是很有市场的,经过一段时间的实际项目实践,实现架构是这么实现的,供讨论:
1.后台应用服务层可采用基于Spring+Hibernate的轻量级J2EE实现,并使用Apache XML-RPC
提供客户端调用接口;
2.前台采用 Delphi
XML-RPC
调用服务器端业务实现接口;
3.后台和前台分别实现XML-对象序列化;
4、可选用SLL,可支持数据压缩;(这个需要对Delphi
XML-RPC
实现作一些扩展)
系统架构实现基于几点考虑:
1、XML-RPC
同SOAP比较:由于Delphi
SOAP客户端存在一些性能问题和同Java实现存在一些兼容性问题,因此考虑采用XML-RPC
实现,而且XML-RPC
实现同SOAP实现相比较,性能要好很多;
2、XML-RPC
同SOCKET比较:采用HTTP协议可以有效穿透不同网络防火墙;
3、采用XML格式交换数据,而不采用XML-RPC
标准格式交换数据,主要是由于XML-RPC
格式比较简单,复杂的数据格式很难满足需求,直接使用对象XML数据流方式,有利于系统扩展;
使用的第三方软件列表(开源产品,可用于商业开发)
Spring Framework:http://www.springframework.org
Hibernat ......
枚举类型
Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据。例如,性别、月份、星期几、颜色、单位名、学历、职业等。
1、枚举类型的定义
格式: type 枚举类型标识符=(标识符1,标识符2,…,标识符n)
2、枚举类型数据特点
① 枚举元素只能是标识符;
例如,下列类型定义是合法的:
type days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
而下列类型定义是错误的:
type colortype=('red','yellow','blue','white');
numbers=(1,3,5,7,9);
定义枚举类型时列出的所有枚举元素构成了这种枚举类型的值域(取值范围)。
② 枚举类型属于顺序类型
根据定义类型时各枚举元素的排列顺序确定它们的序号,且序号从0开始。
例如,定义type days=(sun,mon,tue,wed,thu,fri,sat);
则, ord(sun)=0,ord(mon)=1,……,以此类推。
枚举类型中的第一个元素无前趋,最后一个元素无后继。
pred(sat)=fri; succ(sun)=mon; ord(sat)=6;
③ 同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。如下列定义是错误的:
type color1=(red,yellow,white);
col ......
枚举类型
Pascal程序不仅用于数值处理,还更广泛地用于处理非数值的数据。例如,性别、月份、星期几、颜色、单位名、学历、职业等。
1、枚举类型的定义
格式: type 枚举类型标识符=(标识符1,标识符2,…,标识符n)
2、枚举类型数据特点
① 枚举元素只能是标识符;
例如,下列类型定义是合法的:
type days=(sun,mon,tue,wed,thu,fri,sat);
colors=(red,yellow,blue,white,black,green);
而下列类型定义是错误的:
type colortype=('red','yellow','blue','white');
numbers=(1,3,5,7,9);
定义枚举类型时列出的所有枚举元素构成了这种枚举类型的值域(取值范围)。
② 枚举类型属于顺序类型
根据定义类型时各枚举元素的排列顺序确定它们的序号,且序号从0开始。
例如,定义type days=(sun,mon,tue,wed,thu,fri,sat);
则, ord(sun)=0,ord(mon)=1,……,以此类推。
枚举类型中的第一个元素无前趋,最后一个元素无后继。
pred(sat)=fri; succ(sun)=mon; ord(sat)=6;
③ 同一个枚举元素不能出现在两个或两个以上的枚举类型定义中。如下列定义是错误的:
type color1=(re ......
Delphi字符串加密解密函数
功能:字符串加密和解密
首先定义一个常量数组
const
XorKey:array[0..7] of Byte=($B2,$09,$AA,$55,$93,$6D,$84,$47); //字符串加密用
在程序里加入以下两个函数,
function Enc(Str:String):String;//字符加密函數 這是用的一個異或加密
var
i,j:Integer;
begin
Result:='';
j:=0;
for i:=1 to Length(Str) do
begin
Result:=Result+IntToHex(Byte(Str[i]) xor XorKey[j],2);
j:=(j+1) mod 8;
end;
end;
function Dec(Str:String):String;//字符解密函數
var
i,j:Integer;
begin
Result:='';
j:=0;
for i:=1 to Length(Str) div 2 do
begin
Result:=Result+Char(StrToInt('$'+Copy(Str,i*2-1,2)) xor XorKey[j]);
j:=(j+1) mod 8;
end;
end;
......
在Delphi里实现MD5加密其实很容易!方法如下:
在Uses单元中引用 IdHashMessageDigest,IdGlobal, IdHash 单元,再写如下代码
即可以达到MD5的实现。
示例代码
procedure
TForm
1.Button1Click(Sender: TObject);
var
MyMD5: TIdHashMessageDigest5;
Digest: T4x4LongWordRecord;
begin
MyMD5 := TIdHashMessageDigest5.Create;
Digest := MyMD5.HashValue('');
ShowMessage('32: ' + MyMD5.AsHex(Digest)); //显示32个字符长度的MD5签名结果
ShowMessage('16: ' + Copy(MyMD5.AsHex(Digest), 9, 16)); //显示16个字符长度的MD5签名结果
end;
说明:
MyMD5.HashValue 函数中可以是一个字符串或是一个流对象,它返回的结果类型为 T4x4LongWordRecord 的MD5签名后结果
MyMD5.AsHex 函数是将T4x4LongWordRecord的Md5签名转换成为十六进制的MD5签名字符串
......
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
//返回值问题
function Add(x, y: Integer): Integer;
function Add_Res(x, y: Integer): Integer;
//关于函数的参数问题
//参数可以分为: 默认参数(传值)、var(传址)、out(输出)、const(常数)四类
function MyFun1(Value: Integer): Integer;
function MyFun2(var Value: Integer): Integer;
function MyFun3(out Value: Integer): Integer;
function MyFun4(const Value: Integer): Integer;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
{ TForm2 }
function TForm2.Add(x, y: Integer): Integer;
begin
Add := x + y; //使用函数名作为返回存储变量 (少用)
// Add := Add + 1; // 函数名 ......