Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.05.2018, 16:42
Ekler1 Ekler1 вне форума
Новичок
 
Регистрация: 12.06.2017
Сообщения: 90
Версия Delphi: RAD Studio XE7
Репутация: 10
По умолчанию Помогите разобраться с PageControl

У меня приложение MDI, три формы одна главная и две подчиненных, Повесил PageControl на главную форму. Вопрос, как сделать чтоб при создании подчиненных форм они отображались в PageControl в виде кнопок и уничтожались соответственно при закрытии подчиненных форм?
Ответить с цитированием
  #2  
Старый 26.05.2018, 20:47
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,234
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

А зачем тогда MDI?
Вместо дочерних ФОРМ сделай ФРЕЙМЫ и при создании просто "клади" их на вновь созданную страничку PageControl'а. Ну а при уничтожении - уничтожай оба - и фрейм и страничку.
Ответить с цитированием
  #3  
Старый 26.05.2018, 20:53
Ekler1 Ekler1 вне форума
Новичок
 
Регистрация: 12.06.2017
Сообщения: 90
Версия Delphi: RAD Studio XE7
Репутация: 10
По умолчанию

А без фреймов никак??
Ответить с цитированием
  #4  
Старый 27.05.2018, 19:35
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,234
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

Можно и без фреймов сделать тоже самое на формах. Создавать их через CreatePArented (вроде так) и класть на странички. Вообще, есть много способов получить желаемое. Только тут PageControl не нужен. Он хорош именно тем, что имеет странрички, на которые можно класть разные контролы. Если очень хочется иметь и формы и закладки, то там скорее всего нужен TTabControl, это у которого есть закладки, но нет самих страничек. В таком случае при создании формы надо запоминать ссылку на соответсвующую закладку и удалять ее при закрытии формы. Ну и у закладки сохранять ссылку на соотв. форму, что бы при нажатии на закладку активироапть соотв форму.
Ответить с цитированием
  #5  
Старый 27.05.2018, 20:25
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,234
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

Вот примерчик наваял с 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  
Старый 28.05.2018, 22:15
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,026
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Не, другой вопрос возник: а зачем тогда здесь отдельные формы,что, площади странички пейджконтролла не хватает?
Ответить с цитированием
  #7  
Старый 29.05.2018, 04:27
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,234
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

Цитата:
Сообщение от Alegun
Не, другой вопрос возник: а зачем тогда здесь отдельные формы,что, площади странички пейджконтролла не хватает?

Ну, вариантов почему м.б. много. Например, юзер может открыть несколько форм одного типа. Еще вариант - просто отдельные формы дизайнить легче.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2018

ВКонтакте   Facebook   Twitter