父窗体和子窗体的问题(100分)

  • 主题发起人 主题发起人 violetxh
  • 开始时间 开始时间
V

violetxh

Unregistered / Unconfirmed
GUEST, unregistred user!
在父窗体中有一个PageControl如何将子窗体显示在PageControl上?
 
不知道你的窗体都是什么类型的。
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2:=TForm2.create(NIL);
Form2.Parent:=form1.PageControl1.Pages[0];
Form2.show;
end;
你试试这段代码。
 
我试过了没用
 
只要设置子窗体的parent为父窗体即可
 
给你一段参考代码:(ChildDM:子窗体)
TabSheet := TTabSheet.Create(Self);
TabSheet.PageControl := pgcMain;
Inc(PageCount);
TabSheet.Name := 'TabSheet' + IntToStr(PageCount);
TabSheet.Caption := ChildFM.Caption;
TabSheet.Show;
ChildFM.Parent := TabSheet;
ChildFM.Align := alClient;
ChildFM.BorderStyle := bsNone;
ChildFM.Width := TabSheet.Width;
ChildFM.Height := TabSheet.Height;
ChildFM.Show;
 
最好能像WPS的文档标签一样可以在各个Form之间自由切换,我以前做过好像是用TabControl 好长时间没用忘记了![:(],哪位能帮小弟一个忙?
 
这种情况就应该用frame 而不是form
 
用pagecontrol不能切换?
 
ball_cao 具体怎么做?能做个例子吗? 我的邮箱 violetjs@163.com 14564807@qq.com
 
帖一个高手的代码,晕就是看不太懂!
//根据类名查找类信息
FC := TFormClass(GetClass(DMBase.CDSUserRight.fieldbyname('APPCLASS').asstring));
if Fc <> nil then
begin
try
//创建类实例
fm := fc.Create(self);
new(temp);
temp^.FForm := fm;
// temp^.Privages:=DMBase.CDSUserRight.fieldbyname('app_drg').asinteger;
// temp^.Pkg:=PkgHandle;
// temp^.Pkg^.RefCount:=temp^.Pkg^.RefCount+1;
temp^.Appid := DMBase.CDSUserRight.fieldbyname('appid').asstring;
temp^.tab := TRzTabSheet.Create(self);
temp^.tab.PageControl := RzPageControl1;
temp^.tab.Caption := DMBase.CDSUserRight.fieldbyname('APPNAME').asstring;
fm.Parent := temp^.tab;
fm.BorderStyle := bsnone;
fm.Align := alClient;
try
fm.Show;
RzPageControl1.ActivePage := temp^.tab;
setlength(Modules, high(Modules) + 2);
Modules[high(Modules)] := temp;
if ActiveModule <> nil then
ActiveModule^.FForm.Enabled := false;
ActiveModule := Temp;
except
fm.Free;
temp^.tab.Free;
// UnLoadRuntimePkg(temp^.Pkg);
dispose(temp);
raise Exception.Create('显示模块“' + DMBase.CDSUserRight.fieldbyname('APPNAME').asstring + '”时出错!');
end;
except
// UnLoadRuntimePkg(PkgHandle);
raise Exception.Create('创建模块“' + DMBase.CDSUserRight.fieldbyname('APPNAME').asstring + '”时出错!');
end;
end;
 
TO ball_cao 老兄帮帮忙!
 
一个困扰我二天的问题解决了,心里非常高兴。现将代码拿出来共享如(兄弟水平很低)如有更好的方法请和我联系
QQ:14564807
一个关于主从窗体的程序的示例,从窗体显示在主窗体的pagecontrol上,
难点:打开关闭后再打开就出错
原因:Form.free后指针不为NIL所以用 if not Assigned(form3) then
判断出错,
解决方法:使用Stringlist动态跟踪Form的创建情况。
/////////////////////////////////////////
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, Menus, StdCtrls, Buttons;
type
TForm1 = class(TForm)
tlb1: TToolBar;
btn1: TToolButton;
btn2: TToolButton;
pgc1: TPageControl;
lbl1: TLabel;
lbl2: TLabel;
pm1: TPopupMenu;
N1: TMenuItem;
lst1: TListBox;
procedure btn1Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure pgc1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Tabsheet:TTabSheet;
Index: Integer;
Formlist:TStringList;
implementation
{$R *.dfm}
uses Unit2,unit3;
procedure TForm1.btn1Click(Sender: TObject);
var
i:Integer;
begin
if Formlist.IndexOf('Form2')<0 then
//if not Assigned(form2) then
begin
tabsheet:=TTabSheet.Create(nil);
Tabsheet.PageControl:=pgc1;
form2:=Tform2.Create(nil);
Tabsheet.Caption:=Form2.Caption;
Tabsheet.Name:='Form2';
Formlist.Add('Form2');
lst1.Items:=Formlist;
Form2.Parent:=Tabsheet;
Form2.Show;
end;
For i:=0 to pgc1.PageCount-1do
if pgc1.Pages.Name='Form2' then
begin
pgc1.Pages.TabVisible:=True;
pgc1.ActivePage:=pgc1.Pages;
Exit;
end;
end;

procedure TForm1.N1Click(Sender: TObject);
begin
Formlist.Delete(Formlist.IndexOf(pgc1.Pages[Index].Name));
pgc1.Pages[Index].Free;
lst1.Items:=Formlist;
end;

procedure TForm1.btn2Click(Sender: TObject);
var
i:Integer;
begin
if Formlist.IndexOf('Form3')<0 then
//if not Assigned(form3) then
begin
tabsheet:=TTabSheet.Create(nil);
Tabsheet.PageControl:=pgc1;
Form3:=TForm3.create(NIL);
Tabsheet.Name:='Form3';
Tabsheet.Caption:=Form3.Caption;
Formlist.Add('Form3');
lst1.Items:=Formlist;
Form3.Parent:=Tabsheet;
Form3.Show;
end;
For i:=0 to pgc1.PageCount-1do
if pgc1.Pages.Name='Form3' then
begin
pgc1.Pages.TabVisible:=True;
pgc1.ActivePage:=pgc1.Pages;
Exit;
end;
end;

procedure TForm1.pgc1MouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState;
X, Y: Integer);
begin
if (Button = mbLeft) and (ssDouble in Shift) then
begin
Index :=pgc1.IndexOfTabAt(X, Y);
if Index >= 0 then
begin
Formlist.Delete(Formlist.IndexOf(pgc1.Pages[Index].Name));
pgc1.Pages[Index].Free;
lst1.Items:=Formlist;
end
end
else
begin
if Button=mbRight then
begin
Index :=pgc1.IndexOfTabAt(X, Y);
if Index >= 0 then
pm1.Popup(Mouse.CursorPos.x,Mouse.CursorPos.y);
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FormList:=TStringList.Create;
end;

end.
代码付上:
 
后退
顶部