VCL组件 + 设计模式 = ? 不管是VS200X工具箱,还是DELPHI组件板,都提供了丰富的组件/控件.如何把它们组装成需要的应用程序也是件有意思的事. 说说都是怎么组装的吧? :) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.dxbar封顶,实现菜单栏与工具栏2.客户区用两个panel+1个splitter来实现导航界面与内容界面的分隔!3.以statusbar封底 呵. 从最简单,最常发生的说吧. 仪器产生的数据 或 手工录入的数据... -> 数据处理/验证 -> 数据保存(数据库) -> 数据查询 -> 界面显示报表/图表 从楼主的意思看,编写程序就象是搭积木。用一堆小块的积木可以搭出一栋很漂亮的小房子,但是小房子的门窗都还是关着的,所以我们还要想办法动点手脚,既能让门窗可以打开,又要积木还能稳住不倒。写程序也是如此,在form上摆上一堆控件,就可以组成一个自己喜欢的界面,但是这样的界面只能看,没有什么具体功能。于是我们还要编写具体的代码,来实现那些功能,让这个界面既好看,又好用。 俺失敗了。好像RAIZE自帶了一個這個東西,呵呵,不過很失敗。 仪器产生的数据 或 手工录入的数据... -> 数据处理/验证 -> 数据保存(数据库) -> 数据查询 -> 界面显示报表/图表//--------------任何一步骤到一下步骤, 如果到达一定的复杂度,都最好设计规划一下. 主要是考虑怎么把VCL组件再包装一下, 达到简化/复用的效果. 还在实践中,.. Delphi已经提供了很好的模式:Frame,使用Frame就可以很方便的实现界面的复用。 组件其实就相当于VC里的类,只是Delphi封装的更高级一些,根据功能不同封装了不同的类,也就有了不同的组件,根据应用程序实现的功能把不同的组件组织在一起就形成了应用程序。VC里叫MFC类库,在Delphi里叫VCL库(可视化组件库); 放分吧。这个话题是不是在能画图的BBS里比较好讨论? 根据不同的VCL组装起来就行了呢。当然要美观一点的话,还要美工功底好的 不好意思,没看清问题,我不推荐直接用delphi的数据感知组件。因为这样写出的程序复用性比较低,只能做一些简单的操作时使用。 举例: 要做一个查询,根据员工id查出员工的所有信息,用数据感知组件,你为组件作一些配置,写上sql,ok,运行程序就可以在组件上看出效果了。 但是,很多模块都需要这样的一个查询,它们都想根据id取到员工对象后,做一些处理。所以应该把这一块写成一个类,可以称为DAO类,然后,所有需要这个查询的模块直接用这个类就可以查出员工信息。 如果你的系统比较复杂,你又想让程序结构比较合理,模块之间耦合性低,模块内部内聚性高,我建议你为系统建立一个框架。不知你知道MVC模式不?我推荐你应用它。我在做我们的系统时,吸取了各种框架的优点,大致将系统分成这么几个层: DAO层,模型层,控制层,视图层。 在我的程序里,delphi的Form就是视图层的东西,它仅仅只是接收用户输入和显示数据,不做任何业务逻辑。业务逻辑的处理放在模型层中,这样就使得多个视图复用模型成为可能。 要做好一个系统,有很多东西需要掌握,你如果有兴趣的话,可以和我交流。 很高兴楼上的回得!我一般这么写.TOrder = class(TObject)private FDataSet: TDataSet;public procedure QueryWithID(ID: string)public DataSet: TDataSet read GetDataSet;end;//-------procedure TForm1.Form1OnCreate(AOwner: TComponet);begin Init; //略 XXX.DataSource.DataSet := Order.DataSet;end; 另外. 通过继承TXXXXDataSet来扩充一点功能, 把Post,Scroll等虚方法override, 在中间加入相关的调用.也就是在TOrder和TMyDataSet中间加一个类.(现在还在摸索中,所以有时候加,有时候不加.) 这样就把相关的TDataSet的ONXXXXX事件分离到其它单元中了. 另外: 感觉工具类可以复用, 业务类几乎没有重用的可能, (除非是抽象类上的复用) To 21楼:谁说肯定要用到组合模式的。请搞清楚UML中的组合关系和组合模式的区别。 to:Harryfin,很高兴认识你。不知你从哪里得知我不知道UML中的组合关系和组合模式的区别呢?整个form包括它里面的所有组件不是组成了树状结构吗,这难道不是组合模式的应用吗?参见HeadFirst设计模式组合模式一章。 我是以为楼主要做一个什么界面框架,所以才说这,我看错题了。不好意思。一般界面上的东西,我们用别人做好的就行,不需要自己开发。但是,开发界面框架的人肯定要用到的。 UML中的组合就是类之间的has-a关系,和继承(is-a)相对。策略模式就是一种应用。 很高兴认识你,希望能和你交个朋友,探讨感兴趣的技术,共同进步。我。这里不便透漏qq. 楼主,你的这个类:TOrder = class(TObject) private FDataSet: TDataSet; public procedure QueryWithID(ID: string) public DataSet: TDataSet read GetDataSet; end; //------- procedure TForm1.Form1OnCreate(AOwner: TComponet); begin Init; //略 XXX.DataSource.DataSet := Order.DataSet; end;对于要使用这个类的程序(简称为客户代码)来说,应用起来不是很方便。它为了得到想要的信息,还需要和DataSet这个对象打交道,太麻烦。这样才是理想的:把查询结果做成一个类,举例:TEmployee=class(TPersistent)private//...published property Id:string; property Name:string; property Age:string; //其它属性然后,查询里把结果组成这个类的对象直接返回。对于客户代码来说,你的这个查询类要尽量简单,它只要这样做就可以取得想要的信息var Employee:TEmployee; Query:TQuery;//实例查询类 {创建Query对象就不写了} Employee:=Query.getEmployeeById('0000001'); 就这样,客户代码用一个方法就取到想要的东西了。这和你的方法相比,遵循了最少知识原则。TDataSet类的使用,是你做查询时需要的一个类,这个对于客户代码来说,应该屏蔽起来。客户代码说:我只想要结果,我不管你用什么方法实现,不要想着让我还要参与一些事情。 楼上的意思我明白, 但界面上使用的基本上都是TDBEdit类控件(主要是为了省事), 所以把DataSet暴露出来了。 如果像生成TEmployee; 除了加 property Id:string; property Name:string; property Age:string;需要取字段的值外, 界面上用的应该是TEdit了. 所以还要写Edit1:=Employee.ID. 我实现是不愿意写这些代码。 to jianfengqu:你好。TComponent包含TComponent这里,确实是典型的组合模式。但是说到做组件就肯定要用到组合模式,这个我觉得就比较难以理解了,组件不等于界面,也不等于框架。但是组合关系就是经常要用到的,说肯定要用到也不过分,所以我才得出了这个结论。说错了实在不好意思。 DELPHI TreeView排序的问题 各位老大,delphi流分为哪几种啊 关于嵌套线程内存管理问题 急急,使用TQuickRep做报表时,自定义打印宽度和高度,为什么不打印呢 怎么快速的把adoquery的内容导出1个excel文件? 特别奇怪的Dll释放问题,FreeLibrary就会出错....... 一个Windows程序的结构应该是什么样子的? 有关dbgrid的问题 来者有分 请问谁知道张小龙先生的联系方式? 百分求解,高手进来一看! delphi线程中操作mscomm
2.客户区用两个panel+1个splitter来实现导航界面与内容界面的分隔!
3.以statusbar封底
这个话题是不是在能画图的BBS里比较好讨论?
在我的程序里,delphi的Form就是视图层的东西,它仅仅只是接收用户输入和显示数据,不做任何业务逻辑。业务逻辑的处理放在模型层中,这样就使得多个视图复用模型成为可能。 要做好一个系统,有很多东西需要掌握,你如果有兴趣的话,可以和我交流。
我一般这么写.
TOrder = class(TObject)
private
FDataSet: TDataSet;
public
procedure QueryWithID(ID: string)
public
DataSet: TDataSet read GetDataSet;
end;//-------
procedure TForm1.Form1OnCreate(AOwner: TComponet);
begin
Init; //略
XXX.DataSource.DataSet := Order.DataSet;
end;
to:Harryfin,很高兴认识你。不知你从哪里得知我不知道UML中的组合关系和组合模式的区别呢?整个form包括它里面的所有组件不是组成了树状结构吗,这难道不是组合模式的应用吗?参见HeadFirst设计模式组合模式一章。
我是以为楼主要做一个什么界面框架,所以才说这,我看错题了。不好意思。一般界面上的东西,我们用别人做好的就行,不需要自己开发。但是,开发界面框架的人肯定要用到的。 UML中的组合就是类之间的has-a关系,和继承(is-a)相对。策略模式就是一种应用。 很高兴认识你,希望能和你交个朋友,探讨感兴趣的技术,共同进步。我。这里不便透漏qq.
private
FDataSet: TDataSet;
public
procedure QueryWithID(ID: string)
public
DataSet: TDataSet read GetDataSet;
end; //-------
procedure TForm1.Form1OnCreate(AOwner: TComponet);
begin
Init; //略
XXX.DataSource.DataSet := Order.DataSet;
end;
对于要使用这个类的程序(简称为客户代码)来说,应用起来不是很方便。它为了得到想要的信息,还需要和DataSet这个对象打交道,太麻烦。这样才是理想的:
把查询结果做成一个类,举例:TEmployee=class(TPersistent)
private
//...
published
property Id:string;
property Name:string;
property Age:string;
//其它属性然后,查询里把结果组成这个类的对象直接返回。
对于客户代码来说,你的这个查询类要尽量简单,它只要这样做就可以取得想要的信息var
Employee:TEmployee;
Query:TQuery;//实例查询类
{创建Query对象就不写了}
Employee:=Query.getEmployeeById('0000001'); 就这样,客户代码用一个方法就取到想要的东西了。这和你的方法相比,遵循了最少知识原则。TDataSet类的使用,是你做查询时需要的一个类,这个对于客户代码来说,应该屏蔽起来。客户代码说:我只想要结果,我不管你用什么方法实现,不要想着让我还要参与一些事情。
如果像生成TEmployee; 除了加
property Id:string;
property Name:string;
property Age:string;
需要取字段的值外, 界面上用的应该是TEdit了. 所以还要写Edit1:=Employee.ID. 我实现是不愿意写这些代码。