在三层结构中!
有两个类,其中第一个类从TRemoteDataModule继承(类名为:A)
该类中放了两个控件,一个SQLConnection , 一个SQLQuery!该类中没有任何其它过程或函数;第二个类(类名为B)从A继承,该类包含一个构造函数和析构函数,
并新增了部分函数或过程,如执行SQL语句的公共函数或过程(该过程有使用到父类的SQLConnection 和SQLQuery);现在出现了两个问题:
1:将B设置为自动创建时,构造函数一直不会得到执行;
2:将B设置为手工创建时,当 B := TB.CREATE()后(此时执行了构造函数),但在B类的过程中又无法访问A类中的SQLConnection和SQLQuery时,因其值为NIL?
高手帮忙解决一下!

解决方案 »

  1.   

    B := TB.CREATE()里面加上inherited create(参数);
      

  2.   

    type
      TDMEventLog = class(TRemoteDataModule)
        SQLCon: TSQLConnection;
        SQLQueryComm: TSQLQuery;
      private
      protected
        constructor Create ; virtual;
        Destructor Destroy ; override;
      public
    end;implementation{$R *.dfm}end.type
      TDMDataDirect = class(TDMEventLog)
      private
        FDataSetStringList: TStringList;
      protected
        procedure ExecSQL(const SQLStr : String ; ExecType : Byte);
      public
        Constructor create;override;
        destructor destroy;override;
      published
        property DataSetStringList : TStringList read FDataSetStringList;
      end;
      
    var
      DMDataDirect: TDMDataDirect;  
      
    implementation{$R *.dfm}
      
    constructor TDMDataDirect.create;
    begin
      FDataSetStringList := TStringList.Create;
    end;destructor TDMDataDirect.destroy;
    begin
      FreeAndNil(FDataSetStringList);
      inherited;
    end;procedure TDMDataDirect.ExecSQL(const SQLStr : String ; ExecType : Byte);
    begin
      //公共SQL执行过程,该过程有使用到父类的SQLCon,SQLQueryComm;
      //并将返回的结果组成字符串存入于FDataSetStringList中;
    end;
    问题描述:
    一:当我通过ALT+SHIFT+F11键,将TDMEventLog,TDMDataDirect类都设置为Auto Create Forms 时, 
        程序能正常启动,TDMDataDirect类中的构造函数为什么一直不会执行;
        此时通过 DMDataDirect.ExecSQL('select * from aaa',1) 能正确的执行SQL语句;
        但由于没有对FDataSetStringList进行创建,所以无法在ExecSQL过程中使用该成员;
        
    二:当我通过ALT+SHIFT+F11键,将TDMEventLog,TDMDataDirect类都设置为Available Forms 后,
        通过
         var x : TDMDataDirect;
         begin
           x := TDMDataDirect.create();//此时执行了构造函数;
           x.exec('select * from aaa',1);
           freeandnil(x);
         end;
         执行TDMDataDirect.Exec时,居然出现父类的SQLCon,SQLQueryComm为nil?
         
         
    现在这个问题应该怎么解决?我需要达到的目的就是能够通过父类的SQLCon,SQLQueryComm控件来执行SQL语句,并将结果存放到FDataSetStringList中!
      

  3.   

    >>很簡單的constructor TDMDataDirect.create;
    begin
      inherited Create(nil);  //需要寫
      FDataSetStringList := TStringList.Create;
    end;你復寫了Create方法後沒有調用父類的Create方法.所以TDMDataDirect就不能正确的創建
      

  4.   

    constructor TDMDataDirect.create;
    begin
      inherited Create;//添上这句
      FDataSetStringList := TStringList.Create;
    end
      

  5.   

    不是这样,是因为你的构造方法是你自己引入的,Application根本不知道有你这个构造方法,它构造组件的时候是调用的是从TComponent引入的构造方法,虽然表面上名称一样,但是实际上是两个不同的方法,你只要改成:
    type
      TDMEventLog = class(TRemoteDataModule)
        SQLCon: TSQLConnection;
        SQLQueryComm: TSQLQuery;
      private
      public
        constructor Create(aOwner: TCompoent); override; //重载一下
        Destructor Destroy ; override;
      end;就ok了