从一个控件BUG想到的:如何判断类未被初始化! ( 积分: 100 )

  • 主题发起人 主题发起人 bamfk1023
  • 开始时间 开始时间
B

bamfk1023

Unregistered / Unconfirmed
GUEST, unregistred user!
type
pp1 = class
private
i: Tbutton;
end ;
........
........
........

procedure TForm1.Button1Click(Sender: TObject);
var pp2: pp1 ;
begin
if (pp2<>nil) and (Assigned(pp2)) then // 因为这个判断不对!!!!!!!!!!!
begin
showmessage('Not nil') ;
pp2.i := TButton.Create(Form1)
// 这个建立在未知内存区,所以窗体关闭时,有AV内存溢出的错误
end ;
end;

不知道如何判断这个新类未被新建!
(这个只是一个举例,这个类没有任何实际意义!)
 
没看明白楼主的意思!!

才疏学浅!不好意思
 
这个需要自己写程序的时候控制
声明一个变量(无论简单类型还是类等复杂类型),记得要初始化,对于对象来说就是赋值为nil
使用之前要看这个变量是否为nil,如果是则没有创建
(Assigned就是判断是否为nil的函数,你的例子中if (pp2<>nil) and (Assigned(pp2)) then 两个判断是一样的作用)
在释放这个对象后记得随手要将它赋值为nil(可以使用FreeAndNil过程)

总之对于内存的控制要格外小心,养成良好的编程习惯可以避免出错
 
楼主的意思是如何pp2是否已被创建?
可以在类内部做个创建标记。
 
楼主的意思是不是如何判断对象是否建立,用pp2<>nil是不准的。
 
如何判断一个类Class 是否已被 Create;
var
MaxCells,i: integer;
TheCell: TCell
// TCell=class 也是一个类
begin
MaxCells:= grid.CellCount;
for i := 0 to count - 1 do begin
if i = MaxCells then break;
TheCell:= Cell(i);
if TheCell <> nil then ///// 这个判断不对
TheCell.fSelected := false
///// 所以这个会溢出
end;
grid.SelectedStartIndex := -1;
grid.SelectedEndIndex := -1;
inherited;
end;

以上是控件的源码; 点快几次都有弹出AV错误 !
 
局部变量是在栈内分配的,栈内存不清空的,所以这个pp的指针的值是不确定的。只有你在声明这个变量的地方初始化它,才能做判断
procedure TForm1.Button1Click(Sender: TObject);
var pp2: pp1 ;
begin
pp2 := nil;
if (pp2<>nil) and (Assigned(pp2)) then
...
end;
 
可能没有办法吧,不过Delphi倒是有个提示,没有初始化
 
Inaccessiable Value ...
 
设全局变量啊,全局变量如果为NIL就是没有初始化。
 
局部变量一定没初始化

全局变量 刚启动是初始化为空,

你创建后, 在释放时 用 freeandnil 来释放, 手工处理吧
 
自己写当然知道;问题是用第三方控件发现的问题;
上面 AV 错误中的 TCell 是另外一个类;
我只能做判断 没有办法改结构;
如果没有办法判断,只能想其它方法解决了!

有人用过 Jazmine Calendar 控件吗;
修改该控件的 viewKind 有这个溢出BUG;
jzCalendarManager1.DayViewControl.ViewKind := vk1Day ;
jzCalendarManager1.DayViewControl.ViewKind := vk7Days ;
jzCalendarManager1.DayViewControl.ViewKind := vkMonth ;
我用的是D7 + JZ 3.02 + window2000
 
procedure TForm1.Button1Click(Sender: TObject);
var pp2: pp1 ;
begin
pp2 := nil;
if (pp2<>nil) and (Assigned(pp2)) then <--这句不就成了废话????
...
end


任何一个对象 释放资源不使用freeandnil 或者变量本身不赋值为nil
靠assinged是没法判断的
 
观注。。。
 
今天同样遇到这一个问题, 你可以加个try except end来处理, 判断是否有溢出??
 
溢出的错误用TRY 没有办法隐藏 。。。
 
恩, 这样吧,你可不可以加一个变量, CheckExist:Boolean
如果创建刚设为True, 否则设为False, 恩,可在你pp2: pp1创建的时候做这个检查, 应该不会很是影响你的程序的结构, 如果你耽心线程的话,可以加个临界!
 
控件自身BUG,已解决!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部