![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
У меня приложение MDI, три формы одна главная и две подчиненных, Повесил PageControl на главную форму. Вопрос, как сделать чтоб при создании подчиненных форм они отображались в PageControl в виде кнопок и уничтожались соответственно при закрытии подчиненных форм?
|
|
#2
|
|||
|
|||
|
А зачем тогда MDI?
Вместо дочерних ФОРМ сделай ФРЕЙМЫ и при создании просто "клади" их на вновь созданную страничку PageControl'а. Ну а при уничтожении - уничтожай оба - и фрейм и страничку. |
|
#3
|
|||
|
|||
|
А без фреймов никак??
|
|
#4
|
|||
|
|||
|
Можно и без фреймов сделать тоже самое на формах. Создавать их через CreatePArented (вроде так) и класть на странички. Вообще, есть много способов получить желаемое. Только тут PageControl не нужен. Он хорош именно тем, что имеет странрички, на которые можно класть разные контролы. Если очень хочется иметь и формы и закладки, то там скорее всего нужен TTabControl, это у которого есть закладки, но нет самих страничек. В таком случае при создании формы надо запоминать ссылку на соответсвующую закладку и удалять ее при закрытии формы. Ну и у закладки сохранять ссылку на соотв. форму, что бы при нажатии на закладку активироапть соотв форму.
|
|
#5
|
|||
|
|||
|
Вот примерчик наваял с TTabSet,
Главная форма: Код:
unit MainFrm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, ChildBaseFrm, Vcl.ComCtrls,
Vcl.Tabs;
type
TMainForm = class(TForm)
MainMenu: TMainMenu;
miFile: TMenuItem;
miFileExit: TMenuItem;
miWindow: TMenuItem;
niWindowCreateA: TMenuItem;
miWindowCreateB: TMenuItem;
TabSet: TTabSet;
procedure miFileExitClick(Sender: TObject);
procedure niWindowCreateAClick(Sender: TObject);
procedure miWindowCreateBClick(Sender: TObject);
procedure TabSetChange(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
private
{ Private declarations }
procedure CreateChildForm(FrmClass : TChildClass);
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
uses ChildAFrm, ChildBFrm;
procedure TMainForm.CreateChildForm(FrmClass : TChildClass);
var
Frm : TChildBaseForm;
Idx : Integer;
begin
Frm := FrmClass.Create(Application);
Idx := TabSet.Tabs.Add(Frm.Caption);
TabSet.Tabs.Objects[Idx] := Frm;
TabSet.TabIndex := Idx;
Frm.SetTab(TabSet);
end;
procedure TMainForm.miFileExitClick(Sender: TObject);
begin
Close;
end;
procedure TMainForm.miWindowCreateBClick(Sender: TObject);
begin
CreateChildForm(TChildBForm);
end;
procedure TMainForm.niWindowCreateAClick(Sender: TObject);
begin
CreateChildForm(TChildAForm);
end;
procedure TMainForm.TabSetChange(Sender: TObject; NewTab: Integer;
var AllowChange: Boolean);
begin
AllowChange := True;
If NewTab <> TabSet.TabIndex Then
(TabSet.Tabs.Objects[NewTab] As TChildBaseForm).BringToFront;
end;
end.Базовая форма для MDIChild (там все MDIChild формы надо теперь наследовать от нее, в примере созданы 2 такие формы, на таких формах никакаой логики уже не надо, все в этой сделано) Код:
unit ChildBaseFrm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Tabs;
type
TChildBaseForm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
FTab : TTabSet;
public
{ Public declarations }
procedure SetTab(ATab : TTabSet);
end;
TChildClass = class of TChildBaseForm;
var
ChildBaseForm: TChildBaseForm;
implementation
{$R *.dfm}
procedure TChildBaseForm.FormActivate(Sender: TObject);
var
I : Integer;
begin
If Assigned(FTab) Then
For I := 0 To FTab.Tabs.Count-1 Do
If FTab.Tabs.Objects[i] = Self Then
Begin
FTab.TabIndex := I;
Break;
End;
end;
procedure TChildBaseForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
I : Integer;
begin
Action := caFree;
If Assigned(FTab) Then
Begin
For I := 0 To FTab.Tabs.Count-1 Do
If FTab.Tabs.Objects[i] = Self Then
Begin
FTab.Tabs.Delete(I);
If FTab.TabIndex > -1 Then
(FTab.Tabs.Objects[FTab.TabIndex] As TChildBaseForm).BringToFront;
Break;
End;
End;
end;
procedure TChildBaseForm.FormCreate(Sender: TObject);
begin
FTab := Nil;
end;
procedure TChildBaseForm.SetTab(ATab : TTabSet);
begin
FTab := ATab;
end;
end.Пример дочерней MDIChild формы (фактически, у формы только Caption поменян, ну и Name): Код:
unit ChildAFrm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ChildBaseFrm;
type
TChildAForm = class(TChildBaseForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
ChildAForm: TChildAForm;
implementation
{$R *.dfm}
end. |
|
#6
|
||||
|
||||
|
Не, другой вопрос возник: а зачем тогда здесь отдельные формы,что, площади странички пейджконтролла не хватает?
|
|
#7
|
|||
|
|||
|
Цитата:
Ну, вариантов почему м.б. много. Например, юзер может открыть несколько форм одного типа. Еще вариант - просто отдельные формы дизайнить легче. |