做的第一个Delphi程序
现在只需要导入某个格式的数据并且读到临时数据库中去
再加上数据表和左侧树形节点的交互(即点节点显示对应的数据项,反之亦然)
再加上将部分数据导出成html格式的文件我概要设计的时候是分了几个类的
但是写代码的时候发现很多功能相互耦合的非常厉害,写起来非常难受
但是如果不划分类,直接在TForm中一路做下来倒是非常省心……是不是在Delphi中,比较简单的程序可以不用面向对象思想?或者说这个程序需要么?还有,这个程序的上述功能只是在demo中的,做完这个demo后还要加上和另一个程序交互的协议和上传文件到服务器等功能。先行谢过各位,一旦解决马上给分

解决方案 »

  1.   

    TMyProc=Procedure (Const Name:String;ID:Integer) of Object;
    TMyFun=function (Const AName,APassWord:String):Boolean of Object;将类公开的过程和函数用这样的方法指针来代替.
      

  2.   


    有时你在开发中用到了OOP还不知觉哦!
      

  3.   

    欢迎大家加入DELPHI程序员群1805366,一起进步!
      

  4.   

    这两天我也感觉类分得太细了,甚至说整个小程序可以只用两三个类就行了,像仙
    痕说的,相互耦合的类本来就不科学,也许按照功能他们真的应该在一个类里面。这是我毕业后的第一份工作,也是第一次用Delphi作程序,算是工作、学习兼有吧。
    我现在就是完全按照他执行的顺序写下去,按钮被点了,调到什么功能就写谁的函
    数来被调,完全没用到面向对象。还有,如果在这个程序中定义类的话,感觉好像不会有具体的对象,因为他有一个
    清晰的执行序列,但是我不明白对象会起到什么作用,或者说我拿什么去初始化你,
    我的对象?好像也不会有继承的情况出现……也许数据封装能勉强沾上边……也许
    将来功能多了就会有oop的必要了?还有,请问ZyxIp(绝望中...) 
    TMyProc=Procedure (Const Name:String;ID:Integer) of Object;
    TMyFun=function (Const AName,APassWord:String):Boolean of Object;将类公开的过程和函数用这样的方法指针来代替.你说的这个是不是就是当你不知道怎样来初始化对象时,或者说你根本没有对象,
    直接用指针调用类的函数就可以了?
      

  5.   

    我给你写一个例子,完成的功能是这样子的.两个类,一个是用户信息类,保存当前登录用户的状态信息,登录功能.
     一个是数据表操作类,只完成操作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('不在灰心,在试一次.');
      

  6.   

    这样就避免了大量的类相互调用的问题.更进一步的做法是定义成接口.IUserInfo=Interface
      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中的结构体.所做的一切都是为了避免在一个类中引用另一个类,每个类只做自己的事件.