关于对象创建先后的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 xkdcc
  • 开始时间 开始时间
X

xkdcc

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了个 初始化数据库连接的类TInitClass(非可视化的),
type
TInitClass = class(TObject)
private
{ Private declarations }
FErrForm: TForm;
public
{ Public declarations }
property ErrForm: TForm read FErrForm write FErrForm;
procedure InitDataConnection();
end;
var
InitClass: TInitClass;
另有个窗体TfrmErrorBail,静态创建,有全局变量:
var
frmErrorBail: TfrmErrorBail;
。在InitDataConnection中使用了TfrmErrorBail的showmodal();
在工程源文件中,有:
Application.CreateForm(TfrmErrorBail, frmErrorBail);
InitClass.ErrForm := frmErrorBail;
Application.Run;
我在主窗体的shorform事件调用了InitDataConnection();但运行到Application.Run;时,系统总出错!
有人遇到过这种问题吗?请帮忙解答下,谢了!
 
我写了个 初始化数据库连接的类TInitClass(非可视化的),
type
TInitClass = class(TObject)
private
{ Private declarations }
FErrForm: TForm;
public
{ Public declarations }
property ErrForm: TForm read FErrForm write FErrForm;
procedure InitDataConnection();
end;
var
InitClass: TInitClass;
另有个窗体TfrmErrorBail,静态创建,有全局变量:
var
frmErrorBail: TfrmErrorBail;
。在InitDataConnection中使用了TfrmErrorBail的showmodal();
在工程源文件中,有:
Application.CreateForm(TfrmErrorBail, frmErrorBail);
InitClass.ErrForm := frmErrorBail;
Application.Run;
我在主窗体的shorform事件调用了InitDataConnection();但运行到Application.Run;时,系统总出错!
有人遇到过这种问题吗?请帮忙解答下,谢了!
 
Application.CreateForm(TfrmErrorBail, frmErrorBail);
InitClass.ErrForm := frmErrorBail;//这个时候,InitClass创建了吗?
Application.Run;
 
不知道是你漏了说TInitClass 的创建,还是本来就没有创建。
如果没创建TInitClass 你访问InitClass.ErrForm 或Application.Run;
会报地址错误吧^_^
 
嗯,InitClass没有重写Create构造方法,所以我没有显示的创建。
但是我加上Create方法后,constructor create(AOwner: TComponent);override;
编译它说不能override静态方法。为什么呢?
另,各位知道怎么在程序刚启动时创建一个非可视的自己写的类呢(它会在主窗体的shorform事件中调用已创建的可视窗体)?
 
哦,上面说的是:“创建一个非可视的自己写的类的对象”

还有,我原来是没有创建InitClass的对象(应该是没有调用Create),该怎么创建呢?
 
用OverLoad关键字过载TInitClass类的Create方法既可!不过,在Create方法中别忘记加入Inherited关键字!
 
constructor create(AOwner: TComponent)
reintroduce
overload;
 
晕啊!
我在InitClass中 增加了:
constructor create(AOwner: TComponent)
reintroduce
overload;
它的实现语句为:
Inherited create;
然后在工程中的代码如下:
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TfrmErrorBail, frmErrorBail);
InitClass.create(nil);
InitClass.ErrForm := frmErrorBail;
Application.Run;
怎么还在InitClass.create(nil);处报地址错呢?
 
我的InitClass如下:
type
TInitClass = class(TObject)
private
FErrForm: TForm;
public
property ErrForm: TForm read FErrForm write FErrForm;
constructor create(AOwner: TComponent);reintroduce;overload;
end;
var
InitClass: TInitClass

implementation
 
你的frmMain从代码来看是主窗体,那么你应当把
InitClass.create(nil);
InitClass.ErrForm := frmErrorBail;
两行代码写在frmMain窗体的Create事件中,这样应该就不会有地址访问错误了
 
哦,是不是需要把不可视的类对象,如果在主窗体显示前要使用的话,必须放在已经创建的可视类的create方法中进行创建?
呵呵,我还没实践楼上的建议哈:)
随便问问,晚上回去试。觉得很有可能成功哦:)
 
咦,那我把
InitClass.create(nil);
InitClass.ErrForm := frmErrorBail;
放在工程的源文件中应该也可以啊?反正它会在Application.run前进行创建啊?
有没有人帮忙解释下这个问题?谢谢
 
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TfrmErrorBail, frmErrorBail);
InitClass := TInitClass.create(nil);////////////////////////////
InitClass.ErrForm := frmErrorBail;
Application.Run;
 
InitClass还没创建怎么能进行InitClass.Create(nil);操作呢?
应该这样:
InitClass :=TInitClass.create(nil);
InitClass.ErrForm := frmErrorBail;
Application.Run;
另,TInitClass是继承自TObject,构造方法overload以后,应该在里面继承TObject本身的
Create:
constructor TInitClass.create(AOwner: TComponent);
begin
.....//你的初始化代码
inherited Create
//继承原来的Create
end;
 
天啊!~~
我初始化的方法错了啊~~~
该用InitClass :=TInitClass.create(nil);
[:(]
还有,为什么要把自己的初始化代码放在Iherited create;前面呢?
我觉得该先有父类的创建,才有自己的初始化啊?呵呵,不晓得对不
 
to 楼主:你的理解正确,Delphi也是这么执行的,如override虚构造和析构函数后,
让Delphi自动生成代码,就会是这样:
constructor TXXX.Create;
begin
inherited
//先继承
....//供添加代码
end;

destructor MyClass.Destroy;
begin
....// 先释放自定义的
inherited
//再继承
end;
这是一个好的习惯。
我这里说构造方法overload以后,应该在里面继承TObject本身的Create,没有指明顺
序。实际上在Create中先inherited和后inherited没有差别,因为编译器已经在Create
方法调用前自动将对象构造好了,Create下的代码只是执行了初始化动作(就是成员变量
的创建或赋值),比如按你的类设计,Create方法被调用时,编译器会自动先进行对象
构建(调用的是内置的全局过程_ClassCreate),分配好了变量空间,如FErrForm变量(可
理解为指针变量),但不负责FErrForm对象的构造(即内存空间的申请),须自己调用
TForm.Create(),然后将开辟的内存地址赋值给FErrForm :=TForm.Create(FErrForm);
所以,在inherited前后添加成员的初始化代码都不会错。但Destroy里面就不同了,一
定要先释放自定义的,再inhrited;
 
后退
顶部