新建一个程序,在上面放一个panel1,再在panel1上放一个button1,在button1的单击事件里写panel1.free;结果出现如下错误:
Project Project1.exe raised exception class EAbstractError with message 'Abstract Error'. Process stopped. Use Step or Run to continue.奇怪的是再在窗体上放一个panel2,再在panel2上放一个button2,然后panel2.free就没有问题,但是点击button1仍然有问题。
这个问题好象只有delphi7才有,delphi6就不会有该问题。
Project Project1.exe raised exception class EAbstractError with message 'Abstract Error'. Process stopped. Use Step or Run to continue.奇怪的是再在窗体上放一个panel2,再在panel2上放一个button2,然后panel2.free就没有问题,但是点击button1仍然有问题。
这个问题好象只有delphi7才有,delphi6就不会有该问题。
解决方案 »
- FastReport报表在WEB中通过ActiveX实现打印
- 怎么将十六进制字符转换为中文?
- delphi property的问题
- 那位能给出后台是access2000的二进制数据存储?
- 问两个问题:1、字体下划线是什么属性;2、Imagelist中如何保持所有图的原始大小?
- 庆祝QQ被盗..散分!!!
- d3下的TFormDesigner这个类,在d5下如何使用,现在d5变成了IFormDesigner 的InterFace?
- 在delphi中使用ADO
- 怎样向数据库中添加图片
- 用TQuickRep控件如何显示多行文本?
- 关于adoquery中使用sql带参数查询的问题!!!新手!!急!!
- 查询问题?
所以你在panel1.free前必须先做好一件事:button1.parent := panel1.parent;
这个不是Delphi的Bug
容器释放,会将容器中的控件也释放procedure TForm1.Button1Click(Sender: TObject);
var
vParent: TWinControl;
begin
vParent := TControl(Sender).Parent;
TControl(Sender).Parent := nil;
vParent.Free;
TObject(Sender).Free;
end;//or-------------------------------const
WM_DELETEOBJECT = WM_USER + 10;type
TForm1 = class(TForm)
//...
procedure WMDELETEOBJECT(var Msg: TMessage); message WM_DELETEOBJECT;
end;//...procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
PostMessage(Handle, WM_DELETEOBJECT, Integer(SpeedButton1.Parent), 0);
end;procedure TForm1.WMDELETEOBJECT(var Msg: TMessage);
begin
if Msg.WParam <> 0 then TObject(Msg.WParam).Free;
end;
我写了简单的类型测试了下:
type
Txx=class
public
procedure test;dynamic;
procedure doo;
end;
{ Txx }procedure Txx.doo;
begin
self.Free;
test;
end;procedure Txx.test;
begin
showmessage('df');
end;调试代码
begin
xx:=Txx.Create;
xx.doo;
end;
结果会出错,如果去掉dynamic;则可以show出'df'来。