如果关闭tabsheet时同时也关闭其中的form?

kvyd 2009-10-15 09:21:13
源程序在

http://www.abis.com.cn/upload/PageControl.rar


点击btn1和btn2时可激活两个页面,同时将form1和form2在tabsheet中打开,点击form中的btnClose时可关闭页面和窗口。

我想点击btnPageClose也能关闭当前激活的tabsheet,同时也关闭tabsheet中的form,但不知道如何实现

麻烦大家帮帮忙。 多谢
...全文
253 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
风之谷 2009-10-15
  • 打赏
  • 举报
回复
owner只读的话 就创建时赋呗
禹爸爸 2009-10-15
  • 打赏
  • 举报
回复
owner属性是只读的!!
不知道楼主是否使用过DUnit,在其源码中就有一段关于将Form嵌入到其他Control中的代码,其思路是先在Form上放置一个Panel,将所有元素都放置在这个Panel上,嵌入窗体时只需对该Panle重新设置Parent属性即可。

type
TEmbeddableForm = class(TForm)
private
FHostForm: TForm;
protected
procedure ReParent(hostControl: TWinControl; preserveItems: boolean = True);
procedure OnCloseHostForm(Sender: TObject);
public

class function CreateInto(hostForm: TForm; hostControl: TWinControl): TEmbeddableForm;
procedure IntegrateInto(hostForm: TForm; hostControl: TWinControl);
procedure RemoveFrom(hostForm: TForm; hostControl: TWinControl);
end;



{==============================================================================}
implementation

{$R *.DFM}


class function TEmbeddableForm.CreateInto(hostForm: TForm; hostControl: TWinControl): TEmbeddableForm;
begin
assert(Assigned(hostForm));
assert(Assigned(hostControl));
result:= TEmbeddableForm.Create(hostForm);
result.IntegrateInto(hostForm, hostControl);
end;


procedure TEmbeddableForm.IntegrateInto( hostForm: TForm; hostControl: TWinControl );
begin
FHostForm:= hostForm;
ReParent(hostControl);
CloseButton.OnClick := OnCloseHostForm;
end;


procedure TEmbeddableForm.RemoveFrom(hostForm: TForm; hostControl: TWinControl);
begin
ReParent(Self, False);
end;


procedure TEmbeddableForm.ReParent(hostControl: TWinControl; preserveItems: boolean = True);
var
subItemText: string;
begin
assert(Assigned(hostControl));
if preserveItems then
begin
{ item and subitems get lost when the list view is re-parented; Delphi bug! }
subItemText := ResultsView.Items[0].SubItems.Text;
end;
BottomPanel.Parent := hostControl;
BodyPanel.Parent := hostControl;
if preserveItems then
begin
with ResultsView.Items.Add do
begin
SubItems.Text := subItemText;
end;
end;
end;


procedure TEmbeddableForm.OnCloseHostForm(Sender: TObject);
begin
assert(Assigned(FHostForm));
if FTestResult <> nil then
FTestResult.stop;
FHostForm.Close;
end;


使用示例:

procedure TFormMain.FormCreate(Sender: TObject);
begininherited;
FDialog:= TEmbeddableForm.CreateInto( Self, Self.TabPage1 );
end;

procedure TFormMain.FormDestroy(Sender: TObject);
begin
if Assigned( FDialog ) thenbegin
FDialog.RemoveFrom( Self, Self.TabPage1 );
FreeAndNil( FDialog );
end;
inherited;
end;

starluck 2009-10-15
  • 打赏
  • 举报
回复
property Owner: TComponent read FOwner;


是只读的, 你应该是在 Create(Tabl);
kvyd 2009-10-15
  • 打赏
  • 举报
回复
感谢楼上各位。

我把程序中的
AForm.Parent := tab1;下面一行加上

AForm.Owner := tab1;

结果报错,错误内容为:

[Error] MainFrm.pas(78): Cannot assign to a read-only property

再请楼上指点一下
风之谷 2009-10-15
  • 打赏
  • 举报
回复
创建form时,置其parent为某个tabsheet,如果这个tabsheet释放,form也会自动释放.


---------------
修正一下,创建Form是 Form.owner:=Ttabsheet 这样才会释放

parent是绘制
owner是管理
starluck 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 kvyd 的回复:]
源程序在

http://www.abis.com.cn/upload/PageControl.rar


点击btn1和btn2时可激活两个页面,同时将form1和form2在tabsheet中打开,点击form中的btnClose时可关闭页面和窗口。

我想点击btnPageClose也能关闭当前激活的tabsheet,同时也关闭tabsheet中的form,但不知道如何实现

麻烦大家帮帮忙。 多谢

[/Quote]

每个 TabSheet 的 Tag 设为与其关联的 Form 的Handle



for i := Page.Count -1 downto 0 do
begin
if page.page[i].tag <> 0 then
begin
SendMessage(Page.Page[i].tag,WM_Close...);
Free...
end;
end;

大致是这样的,再根据自己的需要改改

kvyd 2009-10-15
  • 打赏
  • 举报
回复
呵呵,楼上的老大,能否再给我解决的办法?谢谢
禹爸爸 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 try__again 的回复:]
form能够在tabsheet中显示?
我落伍了,完全不知所云
[/Quote]

参看 http://topic.csdn.net/u/20091013/08/d9d61e23-c72d-406f-a00e-cef371627b2f.html
iseekcode 2009-10-15
  • 打赏
  • 举报
回复
创建form时,置其parent为某个tabsheet,如果这个tabsheet释放,form也会自动释放.
try__again 2009-10-15
  • 打赏
  • 举报
回复
form能够在tabsheet中显示?
我落伍了,完全不知所云

5,388

社区成员

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

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