Delphi程序设计之--惯用法


======================================================
注:本文源代码点此下载
======================================================

http://blog.csdn.net/lee576/archive/2007/08/29/1764253.aspx

delphi --技巧探索:

{ no. 1 }

创建模式窗体的句子:

class procedure tmyform.runform(aobj1, aobj2: tobject);

var

vform: tmyform;

begin

vform := tmyform.create(application);

with vform do

try

initform(aobj1, aobj2);

showmodal;

finally

free;

end;

end;

//*说明:

通过class声明的函数,类似与vc中的静态函数;使用语句:tmyform.runform(vobj1, vobj2);

其他具体的,参考:delphi 帮助中的,class 类说明。

强调这个惯用法,就是为了:

1、如果此窗体在多处被使用,那么可以保证统一都调用此段代码;

2、如果功能上有所修改,比如:根据showmodal的返回值不同进行处理,那么只修改此函数就行了。

3、程序封装性好,易于维护和工作交接。*//

{ no. 2 }//tag 的使用

窗体工具栏按钮事件的响应

procedure tmyform.runoperate(atag: integer);

begin

case atag of

1: mybutton.color := clred;

2: mybutton.color := clgreen;

3: mybutton.color := clblack;

end;

end;

procedure tmyform.toolbtnclick(sender: tobject);

begin

runoperate(tcontrol(sender).tag);

end;

如果你在某下拉菜单中,也需要执行类似功能则

procedure tmyform.menuitemclick(sender: tobject);

begin

runoperate(tmenuitem(sender).tag);

end;

//*说明:

1、结构清晰

2、相关的信息集中,比较容易查错、修改和维护

3、提高程序的适应、扩展能力;比如现在要求不在工具栏按钮中实现,而要求在不同按钮中实现,则修改容易。

建议:每个分类后面只跟一行或不多的几行代码,如果代码比较多,使用过程函数替代。

比较有意思的是,我经常如下写:

case btnmybutton.visible of

{ 显示 } true: ...

{不显示} false: ...

end;*//

{ no. 3 }//事件指针做参数

//对于列表等的读取使用事件指针的方式

type

tdatasetevent = procedure (dataset: tdataset; aindex, acount: integer) of object;

//从 tadoquery派生而来的类

procedure tmyadoquery.enumrecord(awherestr: string; apro: tdatasetevent);

begin

close;

sql.clear;

sql.add('select * from table1');

if awherestr0 then exit;

end;

end;

但是,我们处理图形对象时,可能会直接调用 cads 的canperform公共函数即可

{ no. 14 }需要时,动态创建你的对象

比如:http://www.delphibbs.com/keylife/iblog_show.asp?xid=824 中的

//*******方案二当需要的时候在创建属性窗体

uses

...

fproperty;

type

tfrmmymap = class

...

procedure onfrmmymapdestroy(sender: tobject);

procedure onmapgeoselected(ageo: tgeometry);

private

ffrmproperty: tfrmproperty;

procedure showpropertyform(avisible: boolean);

public

end;

procedure tfrmmymap.showpropertyform(avisible: boolean);

begin

if not assigned(ffrmproperty) then ffrmproperty := tfrmproperty.create(application);

ffrmproperty.visible := avisible;

end;

procedure tfrmmymap.onfrmmymapdestroy(sender: tobject);

begin

if assigned(ffrmproperty) then ffrmproperty.free;

end;

procedure tfrmmymap.onmapgeoselected(ageo: tgeometry);

begin

if assigned(ffrmproperty) then ffrmproperty.myrefresh(ageo);

end;

这里说明了:

1、需要时,动态创建你的对象 ffrmproperty

2、当前对象释放时,判断你的对象的合法性,然后释放动态创建的对象。

{ no. 15 }创建接口还是创建结构

//项目描述:我开发一个表格控件时,如果我将单元格设置为一个com,则如果表格现实的信息过多的话,则装载速度无法保证,甚至于有死机的可能。我之所以用com是为了将来每个单元格的处理和信息都可以在控件外扩展。

我的解决办法是:对于每个从cell派生来的控件创建一个实例,通过动态创建若干个结构对象record来记录个单元格的信息,如果需要对单元格进行操作,则将结构对象指针赋值给cell组件,测试结果很令人满意。

所以,如果需要使用某个com大量实例的话,尽量管理和维护一个实例,而对于其中的数据可以实行动态创建管理,速度上会有很好的效果。

另外,尽量声明一个 pmyinterface = ^imyinterface 借口指针,参数传递或使用时,直接使用接口指针,这样可以减少调用计数函数_addinft等,如果操作平凡也可以提高速度的。

注:此文作者笔名:joyyuan97。(自己很菜,写不出来什么,找到好的东西希望大家一起分享,也感谢作者给我带来的经验和技巧)

希望看过的人留下意见,下面为作者的话:

“另外,最好请将您转贴位置的连接给我一份。我向定期看看别人的建议。谢谢!

有好经验大家分享!”


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值