做的第一个Delphi程序
现在只需要导入某个格式的数据并且读到临时数据库中去
再加上数据表和左侧树形节点的交互(即点节点显示对应的数据项,反之亦然)
再加上将部分数据导出成html格式的文件我概要设计的时候是分了几个类的
但是写代码的时候发现很多功能相互耦合的非常厉害,写起来非常难受
但是如果不划分类,直接在TForm中一路做下来倒是非常省心……是不是在Delphi中,比较简单的程序可以不用面向对象思想?或者说这个程序需要么?还有,这个程序的上述功能只是在demo中的,做完这个demo后还要加上和另一个程序交互的协议和上传文件到服务器等功能。先行谢过各位,一旦解决马上给分
现在只需要导入某个格式的数据并且读到临时数据库中去
再加上数据表和左侧树形节点的交互(即点节点显示对应的数据项,反之亦然)
再加上将部分数据导出成html格式的文件我概要设计的时候是分了几个类的
但是写代码的时候发现很多功能相互耦合的非常厉害,写起来非常难受
但是如果不划分类,直接在TForm中一路做下来倒是非常省心……是不是在Delphi中,比较简单的程序可以不用面向对象思想?或者说这个程序需要么?还有,这个程序的上述功能只是在demo中的,做完这个demo后还要加上和另一个程序交互的协议和上传文件到服务器等功能。先行谢过各位,一旦解决马上给分
TMyFun=function (Const AName,APassWord:String):Boolean of Object;将类公开的过程和函数用这样的方法指针来代替.
有时你在开发中用到了OOP还不知觉哦!
痕说的,相互耦合的类本来就不科学,也许按照功能他们真的应该在一个类里面。这是我毕业后的第一份工作,也是第一次用Delphi作程序,算是工作、学习兼有吧。
我现在就是完全按照他执行的顺序写下去,按钮被点了,调到什么功能就写谁的函
数来被调,完全没用到面向对象。还有,如果在这个程序中定义类的话,感觉好像不会有具体的对象,因为他有一个
清晰的执行序列,但是我不明白对象会起到什么作用,或者说我拿什么去初始化你,
我的对象?好像也不会有继承的情况出现……也许数据封装能勉强沾上边……也许
将来功能多了就会有oop的必要了?还有,请问ZyxIp(绝望中...)
TMyProc=Procedure (Const Name:String;ID:Integer) of Object;
TMyFun=function (Const AName,APassWord:String):Boolean of Object;将类公开的过程和函数用这样的方法指针来代替.你说的这个是不是就是当你不知道怎样来初始化对象时,或者说你根本没有对象,
直接用指针调用类的函数就可以了?
一个是数据表操作类,只完成操作User表的功能
TOnLogonEvent=Function (AName:String;APassWord:String;var ACaption:String):Boolean of Object;TUserInfo_Obj=Class
private
AName:String;
ACaption:String;
ALogonDateTime:TDateTime;
FOnLogon:TOnLogonEvent;
public
Function Logon:Boolean;
Procedure SetOnLogon(AOnLogon:AOnLogonEvent);
end;
//实现
Function TUserInfo_Obj.Logon:Boolean;
var
frm_Logon:TFrm_Logon;//登录窗体,输入用户ID和密码.
ACaption:String;
begin
Result:=FALSE;
frm_Logon:=TFrm_Logon.Create(Application);
frm_Logon.ShowModal;
if frm_Logon.ModalResult=mrOK then
begin
if Assigned(FOnLogon) then
if FOnLogon(frm_Logon.UserName,frm_Logon.PassWord,ACaption) then
begin
FCaption:=ACaption;
Result:=TRUE;
end;
end;
frm_Logon.Free;
end;TDBUser_Obj=Class
private
Function Logon(AName:String;APassWord:String;var ACaption:String):Boolean ;
public
function OnLogon:TOnLogonEvent;
end;//实现
Function TDBUser_Obj.Logon(AName:String;APassWord:String;var ACaption:String):Boolean ;
begin
Result:=FALSE;
if AName='ABCD' then
if APassWord='1234' then
begin
ACaption:='ZYXIP';
Result:=TRUE;
end;
end;
function TDBUser_Obj.OnLogon:TOnLogonEvent;
begin
Result:=Logon;
end;在主窗体中Private中定义
Private
FUserInfo:TUserInfo_OBj;
FDBUser:TDBUser_Obj;//创建这两个对象
FUSerInfo:=TUserInfo_Obj.Create;
FDBUser:=TDBUser_Obj.Create;
FUserInfo.SetOnLogon(FDBUser.OnLogon);
//用户登录
if FUserInfo.Logon then
Showmessage('你成功了.')
else
Showmessage('不在灰心,在试一次.');
Function Logon:Boolean;
Procedure SetOnLogon(AOnLogon:AOnLogonEvent);
end;
IDBUser=Interface
function OnLogon:TOnLogonEvent;
end;TUserInfo_Obj=Class 改成TUserInfo_Obj=Class(TInterfacedObject,IUserInfo)TDBUser_Obj=Class 改动成TDBUser_Obj=Class(TInterfacedObject,IDBUser)定义的两个变量
FUserInfo:TUserInfo_OBj;
FDBUser:TDBUser_Obj;
改动成
FUserInfo:IUserInfo;
FDBUser:IDBUser;其它的都不变.你会发现没有TDBUser_Obj程序也能运行,就是说只要你的类实现了这两个接口就可以了.在写程序的时候没有必要先就坐在计算机边写代码,先想将程序分解成几个类的关系,这几个类要如何交互,然后定义出接口,你去实现这个接口,他去实现另一个,因为每个类都不会调用其它的类或者非常的少,所以每个人都只要完成自己的一部分就可以了.上面的两个类应定义成四个单元,文件分别是UserInfoHeadFile 定义IUserInfo接口
UserInfoClass 定义实现TUserInfo_Obj 会引用UserInfoHeadFile .
DBUserHeadFile 同上
DBUserClass 同上在进一步,稍微加工一下,符合几个标准,就成了COM了.但原理是一样的.还有要注意的是尽量避免在
TOnLogonEvent=Function (AName:String;APassWord:String;var ACaption:String):Boolean of Object;
中用到非系统标准的变量类型.尽量避免传递对象,最好都是字符,数字或声明到*HeadFile中的结构体.所做的一切都是为了避免在一个类中引用另一个类,每个类只做自己的事件.