如何用PageControl动态控制子窗体

visualcdotnet 2009-07-14 04:02:38
要求窗体的新增与销毁与PageControl动态对应,即每个PageControl的tab页与各个子窗体一一对应,并且每个PageControl的tab页的标题栏为子窗体的标题。
...全文
863 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
scutLiu 2009-07-17
  • 打赏
  • 举报
回复
mark
zzj850902 2009-07-17
  • 打赏
  • 举报
回复
学习了
ccrun.com 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yhf365 的回复:]
楼主300分怎么发的?
为什么我最多只能发100分的帖子?
不解中...
[/Quote]

因为楼主的非技术分(也就是灌水分)是双星,所以能发300分的帖子。
ron_xin 2009-07-17
  • 打赏
  • 举报
回复
mark
蝈蝈俊 2009-07-17
  • 打赏
  • 举报
回复
test
蝈蝈俊 2009-07-17
  • 打赏
  • 举报
回复
test
xiaowei_001 2009-07-17
  • 打赏
  • 举报
回复
mark!
yhf365 2009-07-17
  • 打赏
  • 举报
回复
楼主300分怎么发的?
为什么我最多只能发100分的帖子?
不解中...

你可以把某一个窗体的parent设置成PageControl的TabSheet,
再将对齐方式改为alClient,
TabSheet的标题改为原来的窗体标题。
橘子香水 2009-07-17
  • 打赏
  • 举报
回复
使用自动停靠技术,很简单的.
天成01 2009-07-16
  • 打赏
  • 举报
回复
implementation
uses Unit5,Unit2,Unit4;
{$R *.dfm}
procedure TForm1.N4Click(Sender: TObject);
var
ts: TRzTabSheet;
Form2:TForm2;
i,j:integer;
begin
i:=0;
j:=0;
if TForm2(FindComponent('form2')) = nil then
begin
ts:= TRzTabSheet.Create(Self);
ts.PageControl := RzPageControl1;
Form2 := TForm2.Create(Self);
ts.Caption:='form2';
Form2.Parent := ts;
Form2.Align := alClient;
Form2.BorderStyle := bsNone;
Form2.Show;
Rzpagecontrol1.ActivePage:=ts;
end
else
begin
for i:=0 to rzpagecontrol1.PageCount -1 do
begin
if rzpagecontrol1.Pages.Caption ='form2' then
begin
j:=i;
break;
end;
end;
RzPageControl1.ActivePage :=RzPageControl1.Pages[j];
end;
end;
procedure TForm1.N3Click(Sender: TObject);
var
ts: TRzTabSheet;
Form4:TForm4;
i,j:integer;
begin
i:=0;
j:=0;
if TForm4(FindComponent('form4')) = nil then
begin
ts:= TRzTabSheet.Create(Self);
ts.PageControl := RzPageControl1;
Form4 := TForm4.Create(Self);
ts.Caption:='form4';
Form4.Parent := ts;
Form4.Align := alClient;
Form4.BorderStyle := bsNone;
Form4.Show;
Rzpagecontrol1.ActivePage:=ts;
end
else
begin
for i:=0 to rzpagecontrol1.PageCount -1 do
begin
if rzpagecontrol1.Pages.Caption ='form4' then
begin
j:=i;
break;
end;
end;
RzPageControl1.ActivePage :=RzPageControl1.Pages[j];
end;
end;
procedure TForm1.RzPageControl1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
index:integer;
begin
if (Button = mbLeft) and (ssDouble in Shift) then
begin
Index := RzPageControl1.TabAtPos (X, Y);
if rzpagecontrol1.PageCount >1 then
begin
if index<rzpagecontrol1.PageCount-1 then
begin
RzPageControl1.Pages[Index].Free;
RzPageControl1.ActivePage :=RzPageControl1.Pages[index];
end
else
begin
RzPageControl1.Pages[Index].Free;
RzPageControl1.ActivePage :=RzPageControl1.Pages[index-1];
end;

end
else
RzPageControl1.Pages[Index].Free;
end;
end;
////////////////注意下载三方控件RzPageControl1 要原程序 就留E-Mial
jhldelphi 2009-07-15
  • 打赏
  • 举报
回复
支持
haitao 2009-07-14
  • 打赏
  • 举报
回复
哦,子窗体直接在tabsheet里啊,
我都是使用frame做模块,运行时动态创建并嵌入tabsheet的
fairchild811 2009-07-14
  • 打赏
  • 举报
回复
parent指向tab
骑牛上铂金 2009-07-14
  • 打赏
  • 举报
回复
学习!
火龙岛主 2009-07-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 callzjy 的回复:]
同时修改CHILDWIN单元的关闭事件
Delphi(Pascal) codeunit CHILDWIN;

interface

uses Windows, Classes, Graphics, Forms, Controls, StdCtrls;typeTMDIChild=class(TForm)
Memo1: TMemo;procedureFormClose(Sender: TObject;varAction: TCloseAction);
private{Private declarations}public{Public declarations}end;

implementation

uses MAIN;{$R *.dfm}procedureTMDIChild.FormClose(Sender: TObject;varAction: …
[/Quote]
耦合性太强,扩展性不好,使用插件的方式就更加麻烦了。
不过想法还是值得肯定的。
可以使用变通的方法如:
MainForm更换成Application.MainForm就更好了。
cloudtarget 2009-07-14
  • 打赏
  • 举报
回复
PageControl的对齐设置为向上对齐,高度为20就可以了,子窗口的父窗口设置PageControl的TABSHEET,试了不太稳定,还是用这种方法比较稳定
bdmh 2009-07-14
  • 打赏
  • 举报
回复
创建新窗体,然后创建新tab,将窗体的parent指向为tab

//根据名称检查tab是否已经存在
function FindTab(pagecontrol:TPageControl;tabName:string):integer;
var
i:integer;
begin
Result := -1;
for i := 0 to pagecontrol.PageCount - 1 do
begin
if pagecontrol.Pages[i].Name = tabName then
begin
Result := i;
Break;
end;
end;
end;

procedure FormToSheet(pagecontrol:TPageControl;frm:TForm;tabName,tabCaption:string);
var
i:integer;
tab:TTabSheet;
begin
i := FindTab(pagecontrol,tabName);
if i > 0 then
begin
pagecontrol.Pages[i].TabVisible := True;
pagecontrol.ActivePageIndex := i;
end
else
begin
tab := TTabSheet.Create(pagecontrol);
tab.Name := tabName;
tab.Caption := tabCaption;
tab.PageControl := pagecontrol;
pagecontrol.ActivePage := tab;
frm.ParentWindow := tab.Handle;
frm.Tag :=tab.TabIndex;
tab.InsertControl(frm);
frm.Show;
end;
frm.Show;
end;
销毁时,可以查找tab上的组件,找到窗体,然后freeandnil,当然也可以通过指针处理,在tag中保存窗体指针地址,销毁时根据这个地址去处理
sanguomi 2009-07-14
  • 打赏
  • 举报
回复
你把窗口的父窗口设置PageControl的TABSHEET,就会对应起来的
cloudtarget 2009-07-14
  • 打赏
  • 举报
回复
以上代码测试运行稳定正常,已经运用于多个项目中。
cloudtarget 2009-07-14
  • 打赏
  • 举报
回复
同时修改CHILDWIN单元的关闭事件

unit CHILDWIN;

interface

uses Windows, Classes, Graphics, Forms, Controls, StdCtrls;

type
TMDIChild = class(TForm)
Memo1: TMemo;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

implementation

uses MAIN;

{$R *.dfm}

procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
var
temp ,I,J : Integer;
begin
Action := caFree;
if MainForm.MouseClose then Exit;
temp := 0;
for I := 0 to MainForm.pc.PageCount - 1 do
begin
if MainForm.ActiveMDIChild = MainForm.Formarray[I] then
begin
MainForm.len:=MainForm.len-1;
if I < MainForm.pc.PageCount - 1 then
begin
for J := I to MainForm.pc.PageCount - 1 do
MainForm.Formarray[J] := MainForm.Formarray[J + 1];
end;
temp := MainForm.pc.PageCount - 1;
MainForm.Formarray[temp] := nil;
MainForm.pc.Pages[I].Destroy;
Break;
end;
end;
end;

end.
加载更多回复(4)

5,928

社区成员

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

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