Delphi开发宝典.docx
- 文档编号:23092192
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:72
- 大小:272.12KB
Delphi开发宝典.docx
《Delphi开发宝典.docx》由会员分享,可在线阅读,更多相关《Delphi开发宝典.docx(72页珍藏版)》请在冰豆网上搜索。
Delphi开发宝典
Delphi开发宝典
一、系统的架构与流程
对于这个系统中用Delphi做前台程序的程序员来说首先要斩断以前做数据库系统的一些习惯,比如运用数据表组件等,因为这个系统在Delphi的前台编写中是看不到如ADODataSet,ClientDateSet,DataSouse等数据控件的,一切都是基于面向对象的思想来编写的,程序的各级窗体都是继承窗体基类BaseForm,数据类也是继承TBizObject类的。
TBizObject类是整个系统的基类,我们做的所有数据类都是继承自它的,如:
TDept=class(TBizObject),这个类已经被封装,是无法查看其源码的,它也是客户端与后台进行数据交换的平台,二者之间进行数据交换的工具是通过XML的Request(请求),Respone(返回结果)进行的。
1、系统的数据流程
程序在Delphi客户端发出命令,调用TBizObject方法后,生成XML的Request请求,这时JSP捕捉到XML的Request请求,在解释后调用后台的Java程序向后台数据库发出相应的指令(如Select,insert,delete等)来操作数据,在后台数据库完成这些指令后,再由Java程序返回结果给JSP,JSP再解释生成XML的Response结果,TBizObject在捕捉到XML的Response后,解释并返回结果给Delphi客户端并显示。
以下是流程图示:
数据库应用
数据对象
后台数据库
Java业务功能对象
JSP调用JavaBean
XML(Response返回结果)
XML(Request请求)
TBizObject类
业务类对象
Delphi客户端
2、程序窗体的继承架构
BaseForm
SearchTmpForm
BaseSearchForm
基础资料属性窗体继承,编辑基础资料属性界面,数据直接提交
BasePropForm
简单属性窗体,不作任何数据提交
只是简单地显示和修改类属性,数据提交由它底层的窗体负责
树型结构窗体继承,基础树形结构模板
BaseTreeForm
菜单窗体继承,编辑具体的菜单界面
BasePageForm
CommonSearchForm通用查询条件窗体
查询结果界面继承,写入具体查询操作
BaseTempForm
BaseEditForm
单表编辑界面继承,写入具体的界面操作
BillEditForm
多表编辑界面继承,写入具体的界面操作
SimplePropForm
注意:
不是属于以上几类窗体的,就自行设计窗体,但一定要从BaseForm窗体继承。
二、类及其实例
1.类的结构:
(下例为主从表的类)
unitCssClas;
基础数据类单元
系统变量单元
基类单元
interface
uses
BizClas,Classes,SysUtils,Variables,BaseDataClas;
constThisPackage='cssman';//传递给后台,调用那一个Java包
type
TCssSalebillHeader=class;//销售部配件发货单表头
TCssSaleBillLine=class;//销售部配件发货单明细
基类
//销售部配件发货单表头
TCssSalebillHeader=class(TBizObject)
private
FSalebillHeaderId:
integer;//单据Id,作为主键,必须在第一个声明,发布
FSalebillHeaderNo:
string;//单据编号
FSalebillHeaderDate:
string;//单据日期
FSaleDeptId:
integer;//发货部门
FSaleDeptCode:
string;//发货部门编码
FSaleDeptName:
string;//发货部门名称
FExcRate:
Double;//汇率
FCreateOperatorId:
integer;//制单人ID
FCreateTime:
string;//制单时间
FNote:
string;//备注
FStat:
integer;//单据状态
FIdpath:
string;//权限
FSqlWhere:
string;//条件语句
对Tlist容器的理解
FImportDataFlag:
integer;//导入标志
FMaxSearchRltCmt:
integer;//最大查询数
FCssSalebillLineofCssSalebillHeader:
TList;
此参数设定,在类对象Create的时候,要不要同时创建关联对象
protected
//继承覆盖创建一个类函数
//输入参数类名:
//AClassName用于决定创建什么类,如果为空创建本身
functionCreateNewObject(AClassName:
string=''):
TObject;override;
此三个函数是构造一个类的基本要素
public
//构建
constructorCreate(IsCreateCssSalebillLine:
Boolean=False);
//析构
destructorDestroy;override;
自定义新方法
//根据部门和仓库,获得销售部库存(DeptStock)
procedureDoGetDeptStock(ptType:
TPostType=ptStrWait);
published//属性如何发布
propertySalebillHeaderId:
integerreadFSalebillHeaderIdwriteFSalebillHeaderId;
propertySalebillHeaderNo:
stringreadFSalebillHeaderNowriteFsalebillHeaderNo;
propertySalebillHeaderDate:
stringreadFSalebillHeaderDatewriteFSalebillHeaderDate;
propertySaleDeptId:
integerreadFSaleDeptIdwriteFSaleDeptId;
propertySaleDeptCode:
stringreadFSaleDeptCodewriteFSaleDeptCode;
propertySaleDeptName:
stringreadFSaleDeptNamewriteFSaleDeptName;
propertyExcRate:
DoublereadFExcRatewriteFExcRate;
propertyCreateOperatorId:
integerreadFCreateOperatorIdwriteFCreateOperatorId;
propertyCreateTime:
stringreadFCreateTimewriteFCreateTime;
propertyNote:
stringreadFNotewriteFNote;
propertyStat:
integerreadFStatwriteFStat;
propertyIdpath:
stringreadFIdpathwriteFIdpath;
propertySqlWhere:
stringreadFSqlWherewriteFSqlWhere;
propertyImportDataFlag:
integerreadFImportDataFlagwriteFImportDataFlag;
propertyMaxSearchRltCmt:
integerreadFMaxSearchRltCmtwriteFMaxSearchRltCmt;
propertyCssSalebillLineofCssSalebillHeader:
TListreadFCssSalebillLineofCssSalebillHeader
writeFCssSalebillLineofCssSalebillHeader;
end;
//销售部配件发货单明细
TCssSalebillLine=class(TBizObject)
private
FSalebillHeaderId:
integer;//销售部配件发货单Id
FSeq:
integer;//行号
FCssItemId:
integer;//配件ID
FCssItemCode:
string;//配件编码
FCssItemName:
string;//配件名称
FQty:
Double;//数量
FPrice:
Double;//单价
FAmount:
Double;//金额
FNote:
string;//备注
protected
//继承覆盖创建一个类函数
//输入参数类名:
//AClassName用于决定创建什么类,如果为空创建本身
functionCreateNewObject(AClassName:
string=''):
TObject;override;
public
//构建
constructorCreate;
//析构
destructorDestroy;override;
published
propertySalebillHeaderId:
integerreadFSalebillHeaderIdwriteFSalebillHeaderId;
propertySeq:
integerreadFSeqwriteFSeq;
propertyCssItemId:
integerreadFCssItemIdwriteFCssItemId;
propertyCssItemCode:
stringreadFCssItemCodewriteFCssItemCode;
propertyCssItemName:
stringreadFCssItemNamewriteFCssItemName;
propertyQty:
DoublereadFQtywriteFQty;
propertyPrice:
DoublereadFPricewriteFPrice;
propertyAmount:
DoublereadFAmountwriteFAmount;
propertyNote:
stringreadFNotewriteFNote;
end;
implementation
usesAuthClas,ResConst;
//---TCssSalebillHeader类开始---------------------------------------------
constructorTCssSalebillHeader.Create(IsCreateCssSalebillLine:
Boolean=False);
begin
inheritedCreate;
{在此处键入创建该子类时需要初始化的变量和对象}
//对象在资源文件中的名称代号
//主键个数
PKNum:
=1;
//包代号
注意关联对象列表的创建
PackageId:
=ThisPackage;
//关联是结果集
bRelationIsRecord:
=True;
//创建TCssSalebillLineOfCssSalebillHeader对象列表
ifIsCreateCssSalebillLinethen
FCssSalebillLineOfCssSalebillHeader:
=TList.Create;
end;
//析构
destructorTCssSalebillHeader.Destroy;
注意关联对象列表的释放
vari:
integer;
begin
{在此处键入释放该子类前需要释放的对象}
//释放FCssSalebillLineOfCssSalebillHeader对象列表
ifAssigned(FCssSalebillLineOfCssSalebillHeader)then
begin
fori:
=0toFCssSalebillLineOfCssSalebillHeader.Count-1do
TCssSalebillLine(FCssSalebillLineOfCssSalebillHeader[i]).Free;
FCssSalebillLineOfCssSalebillHeader.Free;
end;
inheritedDestroy;
end;
//继承覆盖创建一个类函数
//为了确保父类创建正确的子类
//输入参数类名:
//AClassName用于决定创建什么类,如果为空创建本身
functionTCssSalebillHeader.CreateNewObject(AClassName:
string=''):
TObject;
begin
if(AClassName='')orSameText(AClassName,'TCssSalebillHeader')then
result:
=TCssSalebillHeader.Create
常用的字符串比较
elseifSameText(AClassName,'TCssSalebillLine')then
result:
=TCssSalebillLine.Create
注意关联对象(子表)的创建
else
result:
=nil;
end;
procedureTCssSalebillHeader.DoGetDeptStock(ptType:
TPostType);
自定义方法需要传递给后台的参数
begin
Action:
='getdeptstock';
Post(paSelect,sSelect,ptStr);
end;
//---TCssSalebillHeader类结束---------------------------------------------
//---TCssSalebillLine类开始---------------------------------------------
constructorTCssSalebillLine.Create;
begin
inheritedCreate;
{在此处键入创建该子类时需要初始化的变量和对象}
//对象在资源文件中的名称代号
//主键个数
PKNum:
=1;
//包代号
PackageId:
=ThisPackage;
end;
//析构
destructorTCssSalebillLine.Destroy;
begin
{在此处键入释放该子类前需要释放的对象}
inheritedDestroy;
end;
//继承覆盖创建一个类函数
//为了确保父类创建正确的子类
//输入参数类名:
//AClassName用于决定创建什么类,如果为空创建本身
functionTCssSalebillLine.CreateNewObject(AClassName:
string=''):
TObject;
begin
if(AClassName='')orSameText(AClassName,'TCssSalebillLine')then
result:
=TCssSalebillLine.Create
else
result:
=nil;
end;
//---TCssSalebillLine类结束---------------------------------------------
end.
2.类的注册
//功能:
注册客户端使用到的所有业务类
//基类在对业务类进行解析时,要在BizReg单元寻找业务类的注册.若没有,则会解析失败
必须Uses类单元才能找到相应的类
unitBizReg;
interface
usesclasses;
implementation
usesLoginClas,VaultClas,AuthClas,BaseDataClas,FinClas,CssClas,DrpClas,MktClas,
RptClas,WhClas,ErpClas;
initialization
begin
RegisterClasses([TCPCVault,TLoginUser,TModal_Class,TSys_Menu,TSys_Func,Toperator_ext_menu_ctrl,TCssSalebillHeader,TCssSalebillLine,TDept]);
end;
end.
2.类实例的使用
类建立,注册以后,必须通过其实例才能存储数据和进行其他处理,如:
procedureTCssProvBillTotalSearchForm.SearchBillObj(strSqlWhere:
string);
1.类实例的声明
varRptObj:
TRptSqlTool;
Begin
2.类实例的创建
RptObj:
=TRptSQLTool.Create;
RptObj.DSId:
=1;//1号数据连结
3.类属性的赋值
RptObj.SQLType:
=0;//0-查询
//执行查询
4.类方法的调用
RptObj.SQL:
=‘Select*FromDept’;
RptObj.ExecSQL(ptstr);
5.类数据的显示
//显示结果集在DataStringGrid上
dgView.LoadFromDataSet(RptObj.ResultSet,True);
6.类实例的释放
RptObj.Free;
end;
三、命名规则
1.控件前缀:
由于系统基类和一些通用方法在对控件进行数据处理时,会结合控件类型,前缀,名称(对应类属性名)进行解析.故控件的命名必须标准.
控件
命名前缀
前缀长度
命名
Tedit
edt
3位字符
前缀+对应类属性名
Tmemo
mm
2位字符
TbuttonEdit
bedt
4位字符
TmaskEdit
medt
4位字符
TspinEdit
sedt
4位字符
TcheckBox
cbx
3位字符
TcomboBox
cb
2位字符
TDataStringGrid
dg
2位字符
2.文件命名:
Unit单元文件名称:
模块前缀+通用名+Frm
对应Form名称:
模块前缀+通用名+Form
3.类命名:
模块前缀+通用名+Clas,注意要与后台Java类同名
四、控件的使用
系统使用的控件除TLabel、TEdit、Tcheck、Tmemo等基本控件外,还有公司自行开发的控件。
现介绍几个常用的控件(如:
TButtonEdit,TdataStringGrid)的一些用法。
1、TbuttomEdit的用法
TbuttomEdit控件是在TEdit的基础上增加了一些功能而开发出来的编辑框控件,最大的优点是可以显示多种格式及数据形式。
下面介绍它的一些重要的属性及相关方法。
a)AddOnId和AddOnIdFieldName属性
AddOnId这个属性是根据整个系统的特点而设计的一个非常有用的属性,由于数据库的设计中很多数据表中用一个ID值来作为数据的唯一标识,所以很多字段有相应的Id,Code和Name。
如商品则有ItemId,ItemCode,ItemName。
那么在存放ItemCode字段这个的TbuttonEdit中就可以在AddOnId属性中存放ItemId字段了。
AddOnIdFieldName这个属性是存放Id的字段的名称的。
如在存放ItemCode字段的TbuttonEdit的控件中赋给AddOnIdFieldName属性值为ItemId,这样TbuttonEdit就会在从对象中取数据时自动根据AddOnIdFieldName属性值来把ItemId的值保存到AddOnId属性中,也会在保存数据时根据AddOnIdFieldName属性值取的AddOnId属性中的ItemId的值来保存到对象中。
b)AutoClearAddon属性
这个属性的作用是当TbuttonEdit的Text的值改变了的时候,控件会自动清空AddOn属性的值,即字段的Id值。
当该属性为True时,给TbuttonEdit赋值时一定要将给AddOn赋值的语句写在给其Text赋值之后。
下面的语句是错误的:
BedtItemCode.AddOn:
=ItemTmp.ItemId;
BedtItemCode.Text:
=ItemTmp.ItemCode;
两句应该调换位置才是正确的。
c)ButtonStyle属性
这个属性设置TbuttonEdit的显示形式的。
它有四个值,分别是:
lsDropdown,lsEllipsis,lsNormal,lsSelect。
当是lsDropdown值时,TbuttonEdit是下拉框的形式,在属性Items中写入要显示的值;当是lsEllipsis值时,TbuttonEdit的编辑框右边有出现一个小按钮,可以在OnButtenClick事件中为小按钮写入事件;当是lsNormal值时,TbuttonEdit是一个普通的编辑框;当是lsSelect值时,TbuttonEdit也是下拉框的形式,但是和lsDropdown的区别是在属性Items中是要显示的值,在属性Values中是字段真正要传回后台的值。
d)DataFormat属性
DataFormat这个属性是设置TbuttonEdit的数据类型的。
它有五个值,分别是:
dfDate,dfDateTime,dfInteger,dfNumber,dfString。
当是dfDate值时,TbuttonEdit的数据类型是日期型;当是dfDateTime值时,TbuttonEdit的数据类型是日期时间型;当是dfInteger值时,TbuttonEdit的数据类型是整数型;当是dfNumber值时,TbuttonEdit的数据类型是实数型;当是dfString值时,TbuttonEdit的数据类型是字符串型。
e)FocusControl属性
FocusControl这个属性的作用是在设置焦点控
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 开发 宝典