今天写一个东西,竟然不能访问自己的 private 成员!郁闷……请各路高手帮帮忙。=======================================
下面是源代码,编译没有任何错误和警告:unit XxxUnit;interfacetype
TMyClass = class
private
b: boolean;
public
function isB: boolean;
procedure setB(bb: boolean);
end;var
MyClass: TMyClass = nil;implementationfunction TMyClass.isB: boolean;
begin
result := b;
end;procedure TMyClass.setB(bb: boolean);
begin
b := bb;
end;end.======================================
下面是在一个 Form 里,找个按钮写的代码:....uses ..... XxxUnit;....procedure ...... ;
begin
MyClass := TMyClass.Create;
MyClass.setB(true); { 这里没有问题 } MyClass.getB; { 妈的,这里就出问题了 }
end;=============================================出现 “Access violation at address xxxxxxx”的错误。然后调试代码,追踪到 “result := b;”这一行就错误了。然后 Add Watch,对 b 查看,那个 Watch List 窗口里面竟然出现:“b: Inaccessiable value”!各路大侠帮忙,成员函数竟然不能访问自己的 private 成员,天理何在!:~(注: Delphi 6 下运行。
下面是源代码,编译没有任何错误和警告:unit XxxUnit;interfacetype
TMyClass = class
private
b: boolean;
public
function isB: boolean;
procedure setB(bb: boolean);
end;var
MyClass: TMyClass = nil;implementationfunction TMyClass.isB: boolean;
begin
result := b;
end;procedure TMyClass.setB(bb: boolean);
begin
b := bb;
end;end.======================================
下面是在一个 Form 里,找个按钮写的代码:....uses ..... XxxUnit;....procedure ...... ;
begin
MyClass := TMyClass.Create;
MyClass.setB(true); { 这里没有问题 } MyClass.getB; { 妈的,这里就出问题了 }
end;=============================================出现 “Access violation at address xxxxxxx”的错误。然后调试代码,追踪到 “result := b;”这一行就错误了。然后 Add Watch,对 b 查看,那个 Watch List 窗口里面竟然出现:“b: Inaccessiable value”!各路大侠帮忙,成员函数竟然不能访问自己的 private 成员,天理何在!:~(注: Delphi 6 下运行。
begin
result := TMyClass.Create;
end;这个东西会不会在 procedure 范围外被 destroy 掉?
begin
result := TMyClass.Create;
end;这个东西不会在 procedure 范围外被 destroy 掉
begin
result := TMyClass.Create;
end;
我刚才调试了一阵子,发现 Create 、setB、isB 写在同一个函数内,则不会有错误,如果 Create 是另外处理,那么就会出现 AV 错误(我保证 Create 在 setB、isB 前调用)。
var
m:boolean;
begin
MyClass := TMyClass.Create;
MyClass.setB(true); { 这里没有问题 }
m:=MyClass.isB; { 妈的,这里就出问题了 }
showmessage(inttostr(ord(m)));
end;
我的返回结果是1,你的机器有问题吧??
TMyClass = class
private
b: boolean;
public
function IsB: boolean;
procedure SetB(bb: boolean);
end;var
MyClass: TMyClass = nil;implementationfunction TMyClass.IsB: boolean;
begin
result := b;
end;procedure TMyClass.setB(bb: boolean);
begin
b := bb;
end;end.
-------------
procedure TForm1.Button1Click(Sender: TObject);
begin
MyClass := TMyClass.Create;
MyClass.SetB(true); { 这里没有问题 } MyClass.IsB; { 妈的,这里就出问题了 }
showmessage(inttostr(ord(MyClass.IsB)));
end;
------------
没有问题呀
begin
MyClass := TMyClass.Create;
MyClass.SetB(true); { 这里没有问题 } MyClass.IsB; { 妈的,这里就出问题了 }
showmessage(inttostr(ord(MyClass.IsB)));
Button2Click(nil);
end;procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(MyClass) then
begin
MyClass.Free;
ShowMessage('结束');
end;
end;
-------------
MyClass相当于unit1中的全局变量,在退出Button1Click过程之后,MyClass对象并没有释放,但可以在别的地方释放
TMyClass = class
private
fb: boolean;
public
function IsB: boolean;
//procedure SetB(true);
published
property b: boolean read fb write fb;
end;var
MyClass: TMyClass = nil;implementationfunction TMyClass.IsB: boolean;
begin
result := fb;
end;//procedure TMyClass.setB(bb: boolean);
//begin
// b := bb;
//end;end.
procedure TForm1.Button1Click(Sender: TObject);
begin
MyClass := TMyClass.Create;
//MyClass.SetB(true); { 这里没有问题 }
MyClass.b:= true;
MyClass.IsB; { 妈的,这里就出问题了 }
showmessage(inttostr(ord(MyClass.IsB)));
end;
begin
SomeObject:=TSomeClass.create;
end;注意,一定要有var关键字。//var SomeObject
procedure CreateSomeObject(SomeClass:TSomeClass,var SomeObject)
begin
SomeObject:=SomeClass.create;
endSomeClass是类引用。
重装delphi
begin
MyClass := TMyClass.Create;
MyClass.setB(true); { 这里没有问题 } MyClass.isB; { 妈的,这里就出问题了 }
end;
我做也不出问题呀。
是否有这种可能,是你程序中的其他地方的一个非法操作(如越界)破坏了b的值?