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;不知道如何判断这个新类未被新建!
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;不知道如何判断这个新类未被新建!
一般用ASSIGNED来判断有个前提就是该对象在释放的时候是使用FreeAndNil来做才行,也就是要进行ps := nil;这个才能确保。
只是这样比较容易显示出BUG!
E : TEdit;procedure TForm1.Button2Click(Sender: TObject);
begin
if not Assigned(E) then
begin
E := TEdit.Create(self);
E.Parent := self;
end;
end;与代码二:procedure TForm1.Button2Click(Sender: TObject);
var
E : TEdit;
begin
if not Assigned(E) then
begin
E := TEdit.Create(self);
E.Parent := self;
end;
end;运行之后,有何不同?-------因为:局部指针变量不会被初始化为nil,只是被指向了一个随机的地址;而全局指针变量却被初始化为nil--------这就是为什么局部变量声明后立即用not Assigned(P)或 if P <>nil无效的原因!2、pp2.i := TButton.Create(Form1); // 这个建立在未知内存区,所以窗体关闭时,有AV内存溢出的错误
这样用,本身就是不对的,原因我在二楼已说,现不多言。
局部变量被动态地在“堆”内存分配,不初始化,而从堆里分配的内存,极可能是刚刚被释放的,仍保留着前面用过的数据......
我只是捕捉到它的 值为 inaccessiable value ,而且是一个基于TObject类的一个对象;
所以我只能判断,而不能改他控件的结构;
有点麻烦就是如何判断一个对象或类的值为 Inaccessiable Value ;
不知道怎么回事; 是不是第三方控件写得不严密
控件名 Jazmine Calendar 3.02 版
环境:D7 , Win2K Server
出现问题:
jzCalendarManager1.DayViewControl.ViewKind := vkMonth ;
在 vkMonth vk1Day vk7Days 三种状态切换的时候;多点几次,常常会出现溢出了;
如果谁要测试 我可以发控件包; 网上搜索也行 ...
这个应该写成 TButton.Create(Self);
按钮在构造时候,指明物主为当前窗体,在窗体销毁时,会自动销毁该按钮。这个可以参阅 TComponent源代码.