Delphi程序设计之--惯用法

2008-04-10 02:57:10来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

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 AWhereStr <> '''''''' then
SQL.Add(''''Where '''' AWhereStr);
Open;
While Not Eof do
begin
if Assigned(APro) then APro(Self, RecNo, RecordCount);
Next;
end;
Close;
end;

//*说明:
此方法来自与Window中,枚举当前所有子窗体的API函数,EnumChildWindow
1、原则:尽量将数据读取与数据显示、数据处理等分离;如:MVC等都是此目的。
2、程序扩展性增强,如果您原来希望在列表中显示或处理某列信息,后来改为用ComboBox,则在修改程序时,不在阅读数据读取部分,只需要修改信息显示等即可。又比如,现在要求您在读取记录时,用进度条显示读取进度等。
*//

{ No. 4 }//常量数组

{ 在 No.2 中,实现了如下的内容
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.RunOperate(ATag: Integer);
const
MyButtonColorMax := 3;
MyButtonColor: array [1..MyButtonColorMax] of TColor = (clRed, clGreen, clBlack);
begin
Case ATag of
1..MyButtonColorMax: MyButton.Color := MyButtonColor[ATag];
101:....
end;
end;

//*说明:
对于数组方式使用,只要注意数组的上限或下限使用常量来实现,然后在以后使用中都尽量使用此常量进行数组循环读取就行了。
*//

{ No. 5 }消息机制 减少类公共函数
//如何让一个窗体中,尽量减少公共函数的定义;
{ 比如:要实现一个当前窗体控件的属性列表窗体,当需要刷新属性窗体;改变某属性值;添加新的属性等;会有很多需要交互的信息。如果我们使用类公共函数,则需要定义很多的公共函数。同时,如果需要进行窗体类型转换,转换为目标窗体类型才可以使用公共函数。所以,会遇到两个单元需要互相包含的情况 }
//解决方案:
TfrmMyForm = class(TForm)
FfrmProperty: TForm;
end;

...
FfrmProperty := TfrmProperty.MyCreate(Application, Self);
...

//当需要刷新属性窗体时
FfrmProperty.Perform(WD_REFRESHPROPERTYLIST, 0, 0);

TfrmProperty = class(TForm)
private
FMyForm: TForm;
procedure WDREFRESHPROPERTYLIST(var Message: TMessage); message WD_REFRESHPROPERTYLIST;
public
constructor MyCreate(Owner: TComponent; AForm: TForm);
end;

constructor TfrmProperty.MyCreate(Owner: TComponent; AForm: TForm);
begin
inherited Create(Owner);
FMyForm := AForm;
end;

//* 对于使用消息的方式,可以减少窗体公共函数的定义。同时,提高程序的可扩充性。如果,使用他的窗体替代时,则可以比较轻松的转换,因为如果最多也就是您的窗体,对当前的消息没有进行处理而已 *)//

{ No. 6 }使用注册列表管理可能扩充的模块

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:华为CMPP源码delphi6版

下一篇:程序设计和调试中的几点总结