求教,报错原因!!Variable 'MyDBManager' might not have been initialized (30分)

  • 主题发起人 主题发起人 cowbird
  • 开始时间 开始时间
C

cowbird

Unregistered / Unconfirmed
GUEST, unregistred user!
我创建对象TDBManager
TDBManager= Class(TObject)
private
public
procedure DB_append(Company_type:TCompany_type);overload;
end;

在编译的时候,报没有初始化的提示 "Variable 'MyDBManager' might not have been initialized"
procedure TForm81.BitBtn1Click(Sender: TObject);
var
MyDBManager:TDBManager;
Begin
{iamhere}
MyDBManager.DB_append(Company_type);
end;
当加了在{iamhere}的地方加了 MyDBManager:=TDBManager.create;就好了.

问题一:原因是什么?
问题二:不加MyDBManager:=TDBManager.create也能用,这行代码必要么?
 
var MyDBManager:TDBManager;
你聲明了一個實例, 理論上一定要創建後才能用的!

>>不加MyDBManager:=TDBManager.create也能用,这行代码必要么?
這樣有時确實還能用, 前DB_append中沒有引用類中聲明的變量時, 确實可用!這個與VMT結構有關, 但我一時無法表達很清楚
 
我觉得加了MyDBManager:=TDBManager.create,
必定要加MyDBManager.free

可是他们都是属于TObject的.有必要在创建再释放么?
看来还是没有大彻大悟境界啊:(
 
>> 可是他们都是属于TObject的.有必要在创建再释放么?
Delphi 所有的对象都要手工创建,手工释放。

>> 问题二:不加MyDBManager:=TDBManager.create也能用,这行代码必要么?
如果你设计的函数与对象实例无关,确实不需要调用 Create,可是这样的话为什么不设计为静态函数,而要设计为类?
只要设计为类,就要调用构造函数,否则会因找不到对像实例的成员变量而出错。
 
>>如果你设计的函数与对象实例无关,确实不需要调用 Create,可是这样的话为什么不设计为静态函数,而要设计为类?
答:TDBManager封装了对数据表的一系列操作.所以设计为类了.

>>Delphi 所有的对象都要手工创建,手工释放。
答:form也是类,为何不见调用Create?

>>只要设计为类,就要调用构造函数,否则会因找不到对像实例的成员变量而出错
答:var MyDBManager:TDBManager
//这不是申明实例了么?
再有,只是报提示信息("Variable 'MyDBManager' might not have been initialized"),但是可以运行的.
 
>> TDBManager封装了对数据表的一系列操作.所以设计为类了.
如果只是函数,并且与数据表的关联都是通过参数来传送的,不如设计为一个单元。比如设计一个 DBManager.pas,调用时可以用 DBManager.DB_append,与类的操作很类似,但不必考虑对象的初始化等操作。

>> Form也是类,为何不见调用Create ?
你说的 Form 是在 Project 文件中用 Application.CreateForm 创建的,CreateForm 中调用了 Form.Create,也属于“手工”创建。

>> var MyDBManager:TDBManager
//这不是申明实例了么?
这和 C++ 不一样,这里只声明了一个指针,这个指针可以指向 TDBManager 对象,但必须使用类的构造函数建立对象后才算生成了实例。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
965
import
I
I
回复
0
查看
530
import
I
后退
顶部