CSDN博客

img vpoor

Delphi之快速设计(程序设计篇)

发表于2004/6/24 14:30:00  497人阅读

本文涉及的所有代码均在WinNt 4、Delphi4 C/S下正确运行通过。
由于Delphi采用了真正的完全面向对象方法、当今世界最快的编译器以及领先的数据库技术,特别是她对Windows API的完全兼容,出色的代码自动生成能力……人们已经看到,在短短的几年当中,Delphi已在众多的开发工具中脱颖而出!正是Delphi的诸多优秀品质,使程序员能在很短的时间内开发出极具专业水准的运用软件,而所做的工作却是相当的少!
正所谓Let's us make better!我们应怎样充分利用Delphi的优势来更加快速地进行程序设计程序呢?
一、充分利用代码完全共享(句槟):
我们这样做的目的不仅仅是为了“偷懒”,这也是优化程序代码的一种方法。当然,首先要考虑的是能不能共享(这很简单,看看是否包含在该事件的下拉集合中),其次是要注意的是共享后有没有“麻烦”,因为正确是第一步,在保证正确的情况下才有必要去追求优化!
比如:我们在用户删除数据前给出一确认消息:
procedure TForm1.Table1BeforeDelete(DataSet: TDataSet);
begin
//确认删除记录
if MessageBox(handle,'确实要删除当前记录吗?','确认',MB_IconQuestion+MB_YesNo)=IDNO then
Abort;
end;
那么,你只要愿意让用户在删除数据记录前进行确认均可在TDataSet.BeforeDelete事件(Table2的BeforeDelete,Table3的BeforeDelete……)中完全共享这段代码。好运不会天天有,在有的时候就不这么直接、简单了……
  • 二、充分利用Delphi的强制转换:
    “As”这个单词不仅仅在英语中用处极大,在Delphi中亦然!当我们想为数个“同类”组件共享代码时,即可发挥她的巨大作用:我们只需为其中一个组件编写代码即可。
    比如:想让一组文本编辑框在得到输入焦点时背景颜色变为茶色,失去焦点是恢复系统颜色,我们可以如此共享代码(让每个文本编辑框的事件公用以下代码):
    procedure TForm1.Edit1Enter(Sender: TObject);
    begin
    (Sender as TEdit).color:=ClTeal; //得到输入焦点
    end;

    procedure TForm1.Edit1Exit(Sender: TObject);
    begin
    (Sender as TEdit).color:=ClWindow; //失去输入焦点
    end;
  • 三、不起眼的Tag属性:
    上面的例子似乎有点太特殊了,万一我只对其中某些组件特别关照怎么办?仍以上面的为例,比如其中有两个文本输入框需要输入数字,为引用户注意,得到焦点时颜色变为兰色,但我仍然然不想为每个组件分别写代码。
    要解决这个问题可利用组件的Tag属性,先为要特别处理的组件分配非零、不等的Tag(必须说明的Delphi不会检查Tag值是否相等,设计时自己掌握);然后如下编写代码,就可依然实现共享:
    procedure TForm1.Edit1Enter(Sender: TObject);
    begin
    case (Sender as TEdit).Tag of
    10,20:(Sender as TEdit).Color:=clBlue //输入数字的文本框
    else
    (Sender as TEdit).Color:=clTeal; //其余文本框
    end;
    end;
  • 四、充分利用Delphi的CodeInsight技术:
    (以下言论均假设在Delphi的默认条件之下)
    1、利用Self关键字:
    也许有人以为我搞错了!其实,这里要向大家介绍的是笔者(因记性太差)“惯犯”的又一“伎俩”。在有的时候,我们可能记不准组件的确切名字(Name)了,这时你要是再返回窗体表格去确认一遍的话(大多数的朋友应该是这样的)未免有点太对不起时间了,此时你要是利用Self就特别省力,因为Self在Delphi中是显式地引用该组件所在的窗体,因此,我们可以输入Self后加一逗点以此激活Delphi的Code Completion,此时系统会立即为你显示一包含该窗体所有组件及窗体本身属性的下拉列表,你从中选择所需组件即可。这样,就避免了来回切换窗体表格的这一工作量。
    2、利用代码补缺(Code Completion):
    我们现在再也没有必要让自己去记忆太多的参数细节了,因为有了Delphi的代码补缺功能。在具体解释之前,还要罗嗦一点,Delphi的Code Completion默认的快捷键会与我们已用的某些快捷键冲突(如Ctrl+Space就与我们打开、关闭汉字输入法的快捷键冲突),因此请先解决这个问题。
    当然,Code Completion一般会自动激活,但是不要以为就万事大吉了,本人认为Delphi的此项技术应向VB学习,此言怎讲?举例来说吧:当你输入StrToint(edit1.后,Delphi不会自动显示edit1的属性,此时你就将用Ctrl+Space来激活Code Completion,特别是嵌套很深的时候,Delphi似乎也糊涂了。
    3、利用代码参数(Code Parameters):
    激活快捷键是Ctrl+Shift+Space。这项功能也是Delphi自动实现的,正如上述所言,当我们来回切或是光标移走时,这项功能也就随之消失了,当我们需要确认该函数的具体参数时即可以此快捷键打开。
    4、利用代码模板(Code Templates):   
    这项技术再次体现了Inprise公司Delphi开发组的工程师们高超的技术及处处为用户着想的高尚品德!(只是不希望再听到又有人被微软挖走的消息)
    激活快捷键是Ctrl+J。此项功能实现机制与代码补缺的差不多,只是她不是自动的,当然最另令人激动的一面是用户可以定义自己的模板。比如笔者定义的一个模板:快捷-〉“msg”;代码-〉“MessageboxMessageBox(
    handle,'|','',MB_Icon...+MB_...);”,只要一输入msg然后按Ctrl+J整个代码“脱颖而出”,并把光标帮我移到我该补充输入的地方,简直爽呆了!
    注意:如果你为自己定义了很多可爱的模板舍不得丢掉的话,不妨把...Delphi4/Bin目录下的Delphi32.dci文件备份,重新安装Delphi后以此文件覆盖即可。
  • 五、能偷懒时就偷懒:
    这个话题本不应该写在这里,但还是忍不住……
    1、能利用对象观察器直接设置且不会影响程序正常运行的就没有必要去写代码:
    由于这个话题涉及面太广,此处仅举一例说明:比如要在Delphi4中实现在状态栏上的自动提示,又没有太“苛
    刻”的条件时,我们没有必要再像以前一样,先定义一个过程(ShowMyHint(...)),然后在程序初始化的地方
    把她赋值给TApplication的OnHin事件。因为只需将状态条的AutoHint属性设为True即可!当然,她似乎只能在
    第一个Panel上显示(这就是没有太“苛刻”的条件时)。当然,怪我罗嗦,有的朋友居然不知道Delphi的Hint
    属性由两部分组成,此处不是说话之地,感兴趣请到笔者的个人主页上去遛遛www.zg169.net/~delphiok(刚开
    张,东西还不多)。
    2、节省代码:
    能够少写代码就没有必要多写代码,能够精炼就不要冗余:
    比如,以下的两段代码实现的功能完全相同,你喜欢用哪段?
    代码段一:
    if ToolButton1.Down=true then
    begin
    Dbgrid1.show;
    DelBtn.Enabled:=true;
    end
    else
    begin
    Dbgrid1.Hide;
    DelBtn.Enabled:=false;
    end;
    代码段二:
    Dbgrid1.Visible:=ToolButton1.Down;
    DelBtn.Enabled:=ToolButton1.Down;
    因此,我们写完程序后,不要仅仅追求程序调通,不妨也给程序代码炸炸油。
    3、节省变量:
    有的程序员在不需要变量的地方定义了变量,在需要变量的地方定义了多余的变量,我个人认为这都不是好的
    习惯,特别是动不动就定义全局变量更是值得商榷。有的读者可能认为我是一个守财奴,现在的处理器速度都
    什么年代了……但我只简单的给你展示一段代码你就明白了:
    procedure TForm1.Button1Click(Sender: TObject);
    Var s1,s2:String;
    begin
    s1:=Inputbox('数据','请输入用户姓名','');
    if s1<>'' then
    begin
    Btn_Name.Enabled:=True;
    s2:=Inputbox('数据','请输入用户住址','');
    if s2<>'' then
    Btn_Adress.Enabled:=True;
    end;
    end;
  • 当然,本文的这些小例子仅仅从侧面表述了笔者的一些个人观点,要充分体现Delphi的高效性,这些还远远不够!限于篇幅,关于数据库以及其他高级话题在这里均未涉及,特别是数据库编程方面,Delphi提供了相当的灵活性!当然,万变不离其宗,只要随时注意Delphi是完全面向对象的,有对象就考虑其属性、事件、方法、继承、引用等等。
  • 0 0

    相关博文

    我的热门文章

    img
    取 消
    img