您的位置:首页 > 编程语言 > Delphi

Delphi程序设计之--惯用法

2012-01-15 03:10 337 查看
======================================================

注:本文源代码点此下载

======================================================
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^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: