在窗体上放一个pageControl然后在窗体上放置一个button,每点击一次button就多出现一个tabsheet,每tabsheet上有一个按钮与状态条,点击tabsheet上的按钮后释放当前的tabsheet,但是在释放的时候出错了
窗体上按钮的代码
var
mytab:TTabSheet;
myStatus:TstatusBar;
mybutton:Tbutton;
begin
mytab:=TTabSheet.Create(self);
mytab.PageControl:=PageControl1;
myStatus:=TstatusBar.Create(mytab);
myStatus.Parent:=mytab;
mybutton:=TButton.Create(mytab);
mybutton.Parent:=mytab;
mybutton.OnClick:=self.on_the_click;
end;self.on_the_click的代码
Procedure TForm1.on_the_click(Sender:TObject);
var
aparent:TTabSheet;
begin
try
aParent:=TTabSheet((Sender as TButton).Parent);
aparent.Free;//这时的parent的却是tabsheet,但是释放以后却出错,
// 报错access viloation at *************
// 而我自己的异常却没有捕获到,这是怎么回事情呢?
except
ShowMessage('error');
end;
end;
窗体上按钮的代码
var
mytab:TTabSheet;
myStatus:TstatusBar;
mybutton:Tbutton;
begin
mytab:=TTabSheet.Create(self);
mytab.PageControl:=PageControl1;
myStatus:=TstatusBar.Create(mytab);
myStatus.Parent:=mytab;
mybutton:=TButton.Create(mytab);
mybutton.Parent:=mytab;
mybutton.OnClick:=self.on_the_click;
end;self.on_the_click的代码
Procedure TForm1.on_the_click(Sender:TObject);
var
aparent:TTabSheet;
begin
try
aParent:=TTabSheet((Sender as TButton).Parent);
aparent.Free;//这时的parent的却是tabsheet,但是释放以后却出错,
// 报错access viloation at *************
// 而我自己的异常却没有捕获到,这是怎么回事情呢?
except
ShowMessage('error');
end;
end;
:
在窗体上放一个pageControl,然后在pageControl外的窗体上放置一个button,每点击一次button,在pageControl上就多出现一个tabsheet,每tabsheet上有一个按钮与状态条,点击tabsheet上的按钮后释放当前的tabsheet,但是在释放的时候出错了
窗体上按钮的代码
var
mytab:TTabSheet;
myStatus:TstatusBar;
mybutton:Tbutton;
begin
mytab:=TTabSheet.Create(self);
mytab.PageControl:=PageControl1;
myStatus:=TstatusBar.Create(mytab);
myStatus.Parent:=mytab;
mybutton:=TButton.Create(mytab);
mybutton.Parent:=mytab;
mybutton.OnClick:=self.on_the_click;
end;self.on_the_click的代码
Procedure TForm1.on_the_click(Sender:TObject);
var
aparent:TTabSheet;
begin
try
aParent:=TTabSheet((Sender as TButton).Parent);
aparent.Free;//这时的parent的却是tabsheet,但是释放以后却出错,
// 报错access viloation at *************
// 而我自己的异常却没有捕获到,这是怎么回事情呢?
except
ShowMessage('error');
end;
end;
而这个BUTTON则是你事件的载体BUTTON释放时,事件并没有执行完成。。这时出异常是显然的。
FREE改成Release试试。。
象你那样说得话,就是在一个form上放一个button,然后把button的代码写成form1.free
那么 也就是同时也要释放form1上的BUTTON。而这个BUTTON则是我事件的载体BUTTON释放时,事件并没有执行完成。。也应该发出异常了?
改成mybutton:=TButton.Create(self);以后还是报错的,奇怪啊!
var
aparent:TTabSheet;
begin
try
aParent:=TTabSheet((Sender as TButton).Parent);
TButton(Sender).ControlStyle:=TButton(Sender).ControlStyle+[csNoStdEvents];
aParent.Free;//这时的parent的却是tabsheet,但是释放以后却出错,
// 报错access viloation at *************
// 而我自己的异常却没有捕获到,这是怎么回事情呢?
except
ShowMessage('error');
end;
end;就不会出错了,这样做就是屏蔽掉后面剩下的一个事件处理,让她不处理了。
这真是奇怪透顶了,后来追踪发现,好像不是Windows残余的消息,但不是windows残余消息,那么又是从哪里来的呢?莫名其妙的。
--------------------------------------------------
TTabSheet是在TPageConotrol放置之后,右键new添加的。
terminate了,所以,这时候button的句柄也就释放了,不会有错。
解决办法好像是要调用destory...忘了,现在书不在手边,看了直后在说。
const
MY_DELETETABSHEET = WM_USER + 10;type
TForm1 = class(TForm)
Button1: TButton;
PageControl1: TPageControl;
procedure Button1Click(Sender: TObject);
private
procedure on_the_click(Sender: TObject);
procedure DeleteTabSheet(var Msg: TMessage); message MY_DELETETABSHEET;
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
myTab: TTabSheet;
myStatus: TStatusBar;
myButton: TButton;
begin
myTab := TTabSheet.Create(Self);
myTab.PageControl := PageControl1;
myStatus := TStatusBar.Create(myTab);
myStatus.Parent := myTab;
myButton := TButton.Create(myTab);
myButton.Parent := mytab;
myButton.OnClick := on_the_click;
end;procedure TForm1.DeleteTabSheet(var Msg: TMessage);
begin
if Msg.WParam <> 0 then TTabSheet(Msg.WParam).Free;
end;procedure TForm1.on_the_click(Sender: TObject);
begin
PostMessage(Handle, MY_DELETETABSHEET, Integer(TButton(Sender).Parent), 0);
end;
麻烦你能否详细解释一下你的意思呢?
还有就是PostMessage(Handle, MY_DELETETABSHEET, Integer(TButton(Sender).Parent), 0);
这句代码的handle具体是谁的handle呢?
谁执行消息函数,就是谁的句柄这个两个写法没区别
Self.Handle
Handle
var
mytab:TTabSheet;
myStatus:TstatusBar;
mybutton:Tbutton;
begin
mytab:=TTabSheet.Create(self);
mytab.PageControl:=PageControl1;
myStatus:=TstatusBar.Create(mytab);
myStatus.Parent:=mytab;
mybutton:=TButton.Create(mytab);
mybutton.Parent:=mytab;
mybutton.OnClick:=self.on_the_click;
end;Procedure TForm1.on_the_click(Sender:TObject);
var
aparent:TTabSheet;
begin
try
aParent:=TTabSheet((Sender as TButton).Parent);
(Sender as TButton).Parent := nil; //加上这句也可以正常
aparent.Free;
except
ShowMessage('error');
end;
end;//我实在不太愿意化太多时间想道理,那着代码改改测测出来就成了
如果报错access viloation at address 00000000. read of address 00000000.
可能是什么问题呢?
可能是什么问题呢?访问空指针
变量没有初始化
指针已经被释放
……