• Delphi程序设计之惯用法


    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;
    / /

    { 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;

    / /

    { No. 12 }

    以下是我编程时的要求:(部分信息没有语言限制)
    //以下的解决方案,几乎都可以在上面的方法中,找到
    1、减少程序的复杂度。a、减少函数个数,使用Case、Tag方式,学习实现Perform定义方式;b、减少单元嵌套关系,使用消息传递方式,减少窗体单元的互相包含。
    2、减少

    { No. 13 }使用广播,实现管理类对管理列表对象的通知

    //对于{ No. 12 } 项目描述中,当画图的窗体控件属性或状态改变时,经常会需要通知所有的图形对象,进行相应的改变。
    //则如果只定义一个广播函数,就可以实现父子通知的话,也会提高程序的可重用性、扩展性、易维护性等,使类结构清晰。

    //比如:1、在Visio和MapInfo中,如果当前窗体的比例尺(缩放比例)改变时,需要用新的比例尺重画当前所有的显示图形对象。2、当当前窗体默认窗体字体改变后,对于默认使用窗体字体显示文字信息的图形对象,他们的文字字体也应该相应的改变。

    //解决方案,参考TWinControl中,属性或状态改变时,通知所有子Controls的处理机制:
    procedure TWinControl.NotifyControls(Msg: Word);
    var
    Message: TMessage;
    begin
    Message.Msg := Msg;
    Message.WParam := 0;
    Message.LParam := 0;
    Message.Result := 0;
    Broadcast(Message);//广播当前的变更消息
    end;
    其中:
    procedure TWinControl.Broadcast(var Message);
    var
    I: Integer;
    begin
    for I := 0 to ControlCount - 1 do
    begin
    Controls[I].WindowProc(TMessage(Message));
    //改为:with TMessage(Message) do Cads[I].CadPerform(msg, WParam, LParam);
    if TMessage(Message).Result <> 0 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。(自己很菜,写不出来什么,找到好的东西希望大家一起分享,也感谢作者给我带来的经验和技巧)

    希望看过的人留下意见,下面为作者的话:
    “另外,最好请将您转贴位置的连接给我一份。我向定期看看别人的建议。谢谢!
    有好经验大家分享!”

  • 相关阅读:
    Python 学习目录
    Django目录
    SQLAlchemy
    Flask之Sqlalchemy
    Websocket
    Mongodb
    虚拟环境
    Github
    LINUX
    内存管理和垃圾回收机制
  • 原文地址:https://www.cnblogs.com/martian6125/p/9631580.html
Copyright © 2020-2023  润新知