比如
var ado:adoquery;
我怎么判断ado是否调用了
ado.create(nil);
然后我把它ado.free掉?
var ado:adoquery;
我怎么判断ado是否调用了
ado.create(nil);
然后我把它ado.free掉?
解决方案 »
- 讨论合作群+++,人数限量,具体点击标题
- 连接到sql server 2000时提示“连接串属性无效!"
- 【求助】求ZlibEx.pas等3个标准文件
- delphi 有没有读取文本内容为源代码的函数
- delphi DDE 7年没解决的问题!!
- 我想要在界面设计上加深一下自己的能力...谁能给我点建议呢~!!!
- TEdit[QStdCtrls] 与TEdit[StdCtrls] 有什么区别呀?
- 请问,那里有人事管理(简单的)系统源代码下载!(delphi的)
- Delphi初级问题(高分请教).
- 在窗口中动态创建了几个控件……
- 怎么将内存地址转化为Integer类型?
- 关于widechar的问题,用WideChar(12345),发现写返回的是?
Warning: Obj must be an instance of a TObject descendant.
没有create的话,不能算是instance.
ado.free;
var ado,ado1:tadoquery;
begin
ado1:=tadoquery.create(self);
ShowMessage(IntToStr(int64(@ado1)));
//结果返回1242660
ShowMessage(IntToStr(int64(@ado)));
//结果返回1242664,由此可知ado不是nil=0
//例外这两个数字不会因为重新启动delphi而变化,脱离ide不变,self改变为nil,form1仍不变
if ado is tadoquery then
ShowMessage('isTadoquery!');
//结果返回is
if assigned(ado) then
ShowMessage('assigned!');
//结果返回已经assign
if ado.IsEmpty then
ShowMessage('Empty!');
//结果返回不是empty
由此可知,对象在未初始化前,已经assigned,并且类型就是tadoquery.现在的问题是我能否使用1242664和1242660作为是否调用create初始化的标志呢?
var ed,ed1:tedit;
begin
ed1:=tedit.Create(form1);
ShowMessage(IntToStr(int64(@ed)));
ShowMessage(IntToStr(int64(@ed1)));
结果和tadoquery一样,将int64改为integer结果一样.
都是初始化后返回1242660,未初始化返回1242664;急待大家帮忙测试一下!!
end;
但ado不是nil,所以不能被free.
是有地址的,初始化后返回1242660,未初始化返回1242664;例外,这个值是随即的,不能用来判断是否初始化.
我读对象的第一个Dword看它是否为'0',这样就能确定对象是否创建var ado,ado1:TADOQUERY;
FirstWord:^Dword;
begin
ado1:=TADOQUERY.Create(self);
FirstWord:=@ado1;//测试代码请改成@ado
if Trim(IntToStr(FirstWord^))='0' then
showmessage('Not Creat Yet!')
else
showmessage('Created Yeah!');还望高手指点迷津
当ado被声明后他的前4字节不一定是0,我该如何判断呢?难道只能try/except?
应该写成: ado := TADOxxxx.Create( nil ); 比如 TADOQuery, TADOCommand没有太聪明的办法,你只有在begin后先将它赋一个nil的值,然后在一个大的try的finally部分释放:
var
ado: TADOQuery;
begin
ado := nil;
try
你的程序代码
finally
FreeAndNil( ado ); // 会自动判断是否为nil
end;