|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите разобраться с PageControl
У меня приложение 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
|
|||
|
|||
Цитата:
Ну, вариантов почему м.б. много. Например, юзер может открыть несколько форм одного типа. Еще вариант - просто отдельные формы дизайнить легче. |