为什么其他form都可以用FORM:=TForm.create(nil)创建,而datamodule用这种方法创建时,提示内存错误,必须使用Application.CreateForm(TDtmdl, Dtmdl)方式创建。

解决方案 »

  1.   

    TForm可以有多个实例。Tdatamodule只能有一个实例。因Tdatamodule里东西都是全局共享的。只需一个实例就够了。
      

  2.   

        DataModule2 :=TDataModule2.Create(nil);
          DataModule2 :=TDataModule2.Create(nil);
    测试一下发现没啥问题哎。DataModule可以建多个实例,我以为因为DataModule是共享的,所以控制了呵
      

  3.   

    我的dm里定义了些变量,会不会是这个引起呢?
    interfaceuses
      SysUtils, Classes, DB, ADODB,forms,messages,windows;
    type
      TDtmdl = class(TDataModule)
        con1: TADOConnection;
        qQryLogin: TADOQuery;
        procedure DataModuleCreate(Sender: TObject);
      private
        { Private declarations }
        FLoginedUserID:integer;
        FLoginedUserCode:string;
        FLoginedUserName:String;
        FLoginedEmployeeID:integer;
        FloginedEmployeeCode:String;
        FDatabaseServer:string;
        FDatabaseName:String;
        FUserID:String;
        FPassWord:String;
      public
        { Public declarations }
        property LoginedUserID:integer read FLoginedUserID write FLoginedUserID;
        property LoginedUserCode:string read FLoginedUserCode write FLoginedUserCode;
        property LoginedUserName:string read FLoginedUserName write FLoginedUserName;
        property LoginedEmployeeID:integer read FLoginedEmployeeID write FLoginedEmployeeID;
        property LoginedEmployeeCode:string read FloginedEmployeeCode write FloginedEmployeeCode;
        property DatabaseServer:string read FDatabaseServer write FDatabaseServer;
        property DatabaseName:string read FDatabaseName write FDatabaseName;
        property UserID:string read FUserID write FUserID;
        property PassWord:string read FPassWord write FPassWord;  end;
      

  4.   

    这里没问题,提示内存错误一般是使用了未实例化的对象
    比如 var sl:stringlist;
    sl.text := '';
      

  5.   

    下面是我整个的unit,好像没有未实例化的东东吧。
    unit UDtmdl;interfaceuses
      SysUtils, Classes, DB, ADODB,forms,messages,windows;
    type
      TDtmdl = class(TDataModule)
        con1: TADOConnection;
        qQryLogin: TADOQuery;
        procedure DataModuleCreate(Sender: TObject);
      private
        { Private declarations }
        FLoginedUserID:integer;
        FLoginedUserCode:string;
        FLoginedUserName:String;
        FLoginedEmployeeID:integer;
        FloginedEmployeeCode:String;
        FDatabaseServer:string;
        FDatabaseName:String;
        FUserID:String;
        FPassWord:String;
      public
        { Public declarations }
        property LoginedUserID:integer read FLoginedUserID write FLoginedUserID;
        property LoginedUserCode:string read FLoginedUserCode write FLoginedUserCode;
        property LoginedUserName:string read FLoginedUserName write FLoginedUserName;
        property LoginedEmployeeID:integer read FLoginedEmployeeID write FLoginedEmployeeID;
        property LoginedEmployeeCode:string read FloginedEmployeeCode write FloginedEmployeeCode;
        property DatabaseServer:string read FDatabaseServer write FDatabaseServer;
        property DatabaseName:string read FDatabaseName write FDatabaseName;
        property UserID:string read FUserID write FUserID;
        property PassWord:string read FPassWord write FPassWord;  end;var
      Dtmdl: TDtmdl;
    implementation
       uses UPublic;
    {$R *.dfm}procedure TDtmdl.DataModuleCreate(Sender: TObject);
    begin
     try
        Dtmdl.DatabaseName:=readinfoini('SystemDB.ini','LinkDB','DatabaseName','hrdb');
        Dtmdl.UserID:=readinfoini('SystemDB.ini','LinkDB','UserID','sa');
        dtmdl.PassWord:=readinfoini('SystemDB.ini','LinkDB','PassWord','ooooo');
        dtmdl.DatabaseServer:=readinfoini('SystemDB.ini','LinkDB','Server','127.0.0.1');
        if Con1.Connected=true then Con1.Connected:=false;
        Con1.connectionString:='Provider=SQLOLEDB.1;Password='+GetPassStr(dtmdl.PassWord)+';Persist Security Info=True;User ID='+Dtmdl.UserID+';Initial Catalog='+Dtmdl.DatabaseName+';Data Source='+dtmdl.DatabaseServer+';Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=A;Use Encryption for Data=False;Tag with column collation when possible=False  '   ;
        Con1.Connected:=true;
     except
        on e:exception do
        begin
          application.MessageBox(pchar(e.Message),'提示',mb_ok+mb_iconinformation);
          application.Terminate;
        end;
     end;
    end;end.
      

  6.   

    Dtmdl:=TDtmdl.create(Application)应该不会报错吧
      

  7.   

    估计你是Dtmdl没有对这个变量赋值用楼上方法可行,但类内调用自己建议用Self。
      

  8.   

    使用Dtmdl:=TDtmdl.create(Application)是没有错的,因为控件原因,要使用Dtmdl:=TDtmdl.create(nil)创建;所以不知错的哪里,头痛啊!