PageControl里显示窗体,窗体里按钮关闭时有时会报异常

dfoversky 2015-01-07 09:45:01
网上找的下边这段代码,窗体里关闭按钮点击后有时就出地址码错误或者提示:Abstract Error.

我跟踪是在关闭按钮代码:Close; 后边报错(Close;后边就是end;了)
我用的TRzPageControl,改成TPageControl测试也是偶尔出现这种情况。
新建立了个单独的工程,整了几个窗口,每个窗口上边只放个memo和Button,测试也是偶尔这样。

MyForm := PFormClass.Create(Self);
改成
MyForm := PFormClass.Create(MyTabSheet );
也是一样不行。

后来改进成TForm和TTabSheet都单独释放也是不行

谁给我指条明路吧。。。



以下为网上的代码,各种改进测试都无效,难道是窗体释放异常?
-----------------------------------------------------------------------------------------------
delphi 使用PageControl嵌套显示窗体,需要必须实现两个部分:

1.创建标签页和创建窗体。

2.指定窗体关闭函数,该函数包含关闭当前标签页。



1.创建标签页和创建窗体。

//如果不存在就创建标签页和窗体,如果存在,就找到。
//PFormClass:要创建的窗体的类,CName:窗体的Cption;EName :窗体的Name
procedure TMainForm.CreateTabSheet(PFormClass: TFormClass;CName,EName:string);
const
MyTabSheetFirstName = 'MyTabSheet_';
var
MyForm:TForm;
MyTabSheet : TTabSheet;
MyTabSheetName :string;
begin
MyTabSheetName := MyTabSheetFirstName + EName;
//查找该标签页是否已经存在
MyTabSheet := TTabSheet(self.FindComponent(MyTabSheetName));
//不存在,就创建出新的标签页
if MyTabSheet = nil then
begin
try
//创建新标签页
MyTabSheet := TTabSheet.Create(self);
MyTabSheet.Name := MyTabSheetName;
MyTabSheet.PageControl := pgcMain;
MyTabSheet.Caption := CName;
MyTabSheet.Align := alClient;
//创建窗口
try
MyForm := PFormClass.Create(self);
myform.Name := EName;
MyForm.Parent := MyTabSheet;
MyForm.BorderStyle := bsNone;
MyForm.Top := 0;
MyForm.Left := 0;
MyForm.Width := MyTabSheet.Width;
MyForm.Height := MyTabSheet.Height;
MyForm.Align := alClient;
//关联窗体关闭时,执行的函数。
MyForm.OnClose := CloseTabSheet;
MyForm.Show;
except
FreeAndNil(MyForm);
Abort;
end;
except
FreeAndNil(MyTabSheet);
Exit;
end;
end;
//设置当前的标签页为活动页
pgcMain.ActivePage := MyTabSheet;
end;



2.指定窗体关闭函数,该函数包含关闭当前标签页。

//关闭窗体时,也关闭其所处的标签页
procedure TMainForm.CloseTabSheet(Sender: TObject; var Action: TCloseAction);
begin
if (sender as TForm).Parent <> nil then
begin
TTabSheet((sender as TForm).Parent).free;
//把关闭的标签页的前一页设为活动页
pgcMain.SelectNextPage(false);
abort;
end;
end;
...全文
176 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
Sender 是TMainForm ? TMainForm 的parent是什么? 你自己检查一下吧
  • 打赏
  • 举报
回复
打印一下看看 Sender .ClassName
dfoversky 2015-01-08
  • 打赏
  • 举报
回复
引用 1 楼 linuxpingwangping 的回复:
if (sender as TForm).Parent <> nil then begin TTabSheet((sender as TForm).Parent).free; //把关闭的标签页的前一页设为活动页 pgcMain.SelectNextPage(false); abort; end; 你确定 sender是TForm类型???????(sender as TForm).Parent 是TTabSheet???? 我怎么觉得Sender是PageControl?
(Sender as TForm).Parent 是TTabSheet Sender是TForm
  • 打赏
  • 举报
回复
if (sender as TForm).Parent <> nil then begin TTabSheet((sender as TForm).Parent).free; //把关闭的标签页的前一页设为活动页 pgcMain.SelectNextPage(false); abort; end; 你确定 sender是TForm类型???????(sender as TForm).Parent 是TTabSheet???? 我怎么觉得Sender是PageControl?

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧