Active Form 能使用TDataModule嗎?(100分)

  • 主题发起人 主题发起人 leozy
  • 开始时间 开始时间
L

leozy

Unregistered / Unconfirmed
GUEST, unregistred user!
我作了一個Active Form ,加了一個TDataModule,並且能夠創建TDataModule
對象,但使用TDataModule,就會報錯:
"Access violation at address 06F5E9DB in module 'ZP.ocx' Read of address 0000005C"
到底Active Form 能否使用TDataModule,由該如何解決我的問題啊!!!!

下面是代碼.

/////TDataModule部分
unit DM;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, DB, DBClient, MConnect, SConnect;

type
TCDM = class(TDataModule)
DSMain: TDataSource;
CDstMain: TClientDataSet;
SkctConn: TSocketConnection;
DShead: TDataSource;
CDShead: TClientDataSet;
DSbody: TDataSource;
CDSbody: TClientDataSet;
DSother: TDataSource;
CDSother: TClientDataSet;
DSTbody: TDataSource;
CDSTbody: TClientDataSet;
DSNMF: TDataSource;
CDSNMF: TClientDataSet;
DSML: TDataSource;
CDSmL: TClientDataSet;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
CDM_purheadid:double;
{ Public declarations }
end;

var
CDM: TCDM;

procedure CreatCDM;

implementation


{$R *.dfm}
/////////////////////////////////////////////////////////////
/////用這個函數來創建,是否正確????
procedure CreatCDM;
begin
TCDM.Create(nil)
end;
/////////////////////////////////////////////////////////////
procedure TCDM.DataModuleCreate(Sender: TObject);
begin
Showmessage('CDM') //////////這個消息框出現過///////
end;
end.


///////////////在ActiveX Form 中調用的代碼。
//創建
procedure Tz.ActiveFormCreate(Sender: TObject);
begin
DM.TCDM.Create(nil);
end;
//使用
procedure Tz.BtnRenewClick(Sender: TObject);
var
sqltext:string;
begin
sqltext:=ue_makesql();
DM.CDM.CDstMain.Active:=false
/////<----到這裡就出錯!
DM.CDM.CDstMain.CommandText:=sqltext;
DM.CDM.CDstMain.Active:=true;
end;
/////////////////////

到底是爲什麽,要如何解決阿??
 
下面是代碼.

/////TDataModule部分
unit DM;

interface

uses
SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
Dialogs, DBTables, DB, DBClient, MConnect, SConnect;

type
TCDM = class(TDataModule)
DSMain: TDataSource;
CDstMain: TClientDataSet;
SkctConn: TSocketConnection;
DShead: TDataSource;
CDShead: TClientDataSet;
DSbody: TDataSource;
CDSbody: TClientDataSet;
DSother: TDataSource;
CDSother: TClientDataSet;
DSTbody: TDataSource;
CDSTbody: TClientDataSet;
DSNMF: TDataSource;
CDSNMF: TClientDataSet;
DSML: TDataSource;
CDSmL: TClientDataSet;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
CDM_purheadid:double;
{ Public declarations }
end;

var
CDM: TCDM;

//procedure CreatCDM;

implementation


{$R *.dfm}
/////////////////////////////////////////////////////////////
/////用這個函數來創建,是否正確????
{procedure CreatCDM;
begin

//TCDM.Create(nil)
end;}
/////////////////////////////////////////////////////////////
procedure TCDM.DataModuleCreate(Sender: TObject);
begin
Showmessage('CDM') //////////這個消息框出現過///////
end;
end.


///////////////在ActiveX Form 中調用的代碼。
//創建
procedure Tz.ActiveFormCreate(Sender: TObject);
begin

//DM.TCDM.Create(nil)
你这样创建肯定出问题!
//应该这样创建。
CDM := TCDM.Create(nil);
end;
//使用
procedure Tz.BtnRenewClick(Sender: TObject);
var
sqltext:string;
begin
{ DM.sqltext:=ue_makesql();
DM.CDM.CDstMain.Active:=false
/////<----到這裡就出錯!
DM.CDM.CDstMain.CommandText:=sqltext;
DM.CDM.CDstMain.Active:=true;}
去掉你对DM的引用!直接用CDM引用即可!
end;
/////////////////////

到底是爲什麽,要如何解決阿??
 
可以使用。我一直用的。
在activeform的FormCreate事件中创建
不要 CDM := TCDM.Create(nil),应用 CDM := TCDM.Create(self);
 
多人接受答案了。
 
后退
顶部