Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования)

Delphi , Компоненты и Классы , Вкладки и Страницы

Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования)

Автор: Nomadic

Кидаю проект-болванку, сделанную перед началом работы над основным


unit Unit1; //базовая форма хранителя страницы
interface
uses...
type

  TBPgFrm = class(TForm)
    Panel1: TPanel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Label1: TLabel;
  public
    function PgInit: boolean; virtual;
    function PgValid: boolean; virtual;
  end;

implementation

{$R *.DFM}

function TBPgFrm.PgInit: boolean;
begin

  result := MessageDlg(Label1.Caption + ': PgInit',
    mtConfirmation, mbOkCancel, 0) = mrOK;
end;

function TBPgFrm.PgValid: boolean;
begin

  result := MessageDlg(Label1.Caption + ': PgValid',
    mtConfirmation, mbOkCancel, 0) = mrOK;
end;

end.

// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

unit Unit2; //главная форма проекта; содержит первую страницу
interface //и кнопки Cancel, Prev & Next/Finish.
uses...

type
  TPagesDlg = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Prev: TButton;
    CancelBtn: TButton;
    Next: TButton;
    Label1: TLabel;
    procedure CancelBtnClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure NextClick(Sender: TObject);
    procedure PrevClick(Sender: TObject);
  private
    Frms: TList;
    procedure AddForms;
  end;

var
  PagesDlg: TPagesDlg;

implementation

uses Unit1, Unit3, Unit4, Unit5;

{$R *.DFM}

procedure TPagesDlg.AddForms; //размещение динамических страниц
var
  i: word;
begin

  Frms := TList.Create;
  Frms.Add(TBPgFrm1.Create(Self));
  Frms.Add(TBPgFrm2.Create(Self));
  for i := 0 to 1 do
    TBPgFrm(Frms[i]).TabSheet1.PageControl := PageControl1
end;

procedure TPagesDlg.CancelBtnClick(Sender: TObject);
begin
  Close;
end;

procedure TPagesDlg.FormDestroy(Sender: TObject);
var
  i: word;
begin

  for i := Frms.Count - 1 downto 0 do
    TBPgFrm(Frms[i]).Free;
  Frms.Free;
end;

procedure TPagesDlg.NextClick(Sender: TObject);
var

  i: word;
  vi: Boolean;
begin

  Next.Enabled := false;
  if PageControl1.PageCount = 1 then
    AddForms;
  i := PageControl1.ActivePage.PageIndex;
  if i = 0 then
    vi := true
  else
    vi := TBPgFrm(Frms[i - 1]).PgValid;
  if vi then
    with PageControl1 do
      if i = PageCount - 1 then
      begin
        CancelBtnClick(Sender);
        exit;
      end
      else
      begin
        ActivePage := FindNextPage(ActivePage, True, false);
        if ActivePage.PageIndex = PageCount - 1 then
          Next.Caption := 'Finish';
        Prev.Enabled := true;
        if TBPgFrm(Frms[i]).PgInit then
          Next.Enabled := true
        else
          PrevClick(Sender);
      end
    else
      Next.Enabled := true;
end;

procedure TPagesDlg.PrevClick(Sender: TObject);
begin

  Prev.Enabled := false;
  with PageControl1 do
  begin
    ActivePage := FindNextPage(ActivePage, false, false);
    Prev.Enabled := ActivePage.PageIndex > 0;
  end;
  Next.Caption := 'Next';
  Next.Enabled := true;
end;

end.

// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

unit Unit3; //наследник с RadioGroup.
interface
uses...
type

  TBPgFrm3 = class(TBPgFrm)
    RadioValid: TRadioGroup;
  public
    function PgValid: boolean; override;
  end;

implementation

{$R *.DFM}

function TBPgFrm3.PgValid: boolean;
begin

  result := RadioValid.ItemIndex = 0;
end;

end.

// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

unit Unit4; // наследник с CheckBox.
interface
uses...
type

  TBPgFrm2 = class(TBPgFrm)
    CheckValid: TCheckBox;
  public
    function PgValid: boolean; override;
  end;

implementation

{$R *.DFM}

function TBPgFrm2.PgValid: boolean;
begin

  result := CheckValid.Checked;
end;

end.


В Delphi 4 появились новые возможности, в частности, возможность докинга визуальных компонент, в частности, форм, на различные DockSite, в том числе и на TPageControl. Это более удобно. Кроме того, Вы имеете возможность использования TFormLoader из библиотеки VG Library.

Для работы с формой, которая динамически получает страницы (PageControl) от хранителей форм (используя наследование), вы можете следовать этим шагам:

  1. Создайте базовую форму хранения класс TBPgFrm с свойствами, такими как Panel1, PageControl1 и TabSheet1. Этот класс будет служить родителем для других форм хранения.
  2. Создайте дополнительные классы форм хранения, которые наследуются от TBPgFrm (например, TBPgFrm3, TBPgFrm4). Каждый из этих классов будет иметь свой собственный логик и компоненты.
  3. В вашей основной форме (TPagesDlg) создайте список для хранения форм хранения (Frms) и процедуру AddForms, которая создает экземпляры каждой формы хранения и добавляет их в список.
  4. В обработчике события NextClick вы можете динамически переключаться между страницами, установив активную страницу PageControl1. Вы также можете вызвать метод PgInit на текущей странице и проверить, является ли она валидной перед разрешением пользователю продолжать.

Вот пример реализации:

unit Unit2;

interface

uses ..., Unit1, Unit3, Unit4; // включите единицы форм хранения

type
  TPagesDlg = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    Prev: TButton;
    CancelBtn: TButton;
    Next: TButton;
    Label1: TLabel;
    procedure CancelBtnClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure NextClick(Sender: TObject);
    procedure PrevClick(Sender: TObject);
  private
    Frms: TList; // список форм хранения
    procedure AddForms; // добавьте формы хранения в список
  end;

var
  PagesDlg: TPagesDlg;

implementation

uses ..., Unit1, Unit3, Unit4; // включите единицы форм хранения

procedure TPagesDlg.AddForms;
begin
  Frms := TList.Create;
  Frms.Add(TBPgFrm1.Create(Self));
  Frms.Add(TBPgFrm2.Create(Self)); // добавьте больше форм хранения, если нужно
end;

procedure TPagesDlg.NextClick(Sender: TObject);
var
  i: integer; // индекс страницы
  vi: boolean; // флаг валидности страницы
begin
  Next.Enabled := false;
  if PageControl1.PageCount = 1 then
    AddForms;
  i := PageControl1.ActivePage.Index;
  if i = 0 then
    vi := true
  else
    vi := TBPgFrm(Frms[i-1]).PgValid; // вызовите метод PgValid на текущей странице
  if vi then
    begin
      with PageControl1 do
        ActivePage := FindNextPage(ActivePage, True, false);
      Next.Caption := 'Finish';
      Prev.Enabled := true;
      if TBPgFrm(Frms[i]).PgInit then // вызовите метод PgInit на текущей странице
        Next.Enabled := true
      else
        PrevClick(Sender);
    end
  else
    Next.Enabled := true;
end;

// ...

В этом примере предполагается, что каждый форм хранения имеет метод PgValid, возвращающий булевое значение, указывающее, является ли страница валидной, и метод PgInit, инициализирующий страницу. Вы можете модифицировать эти методы для соответствия вашим конкретным потребностям.

Обратите внимание, что в Delphi 4 у вас есть возможность прикреплять визуальные компоненты, включая формы, к различным контролам DockSite, включая TPageControl. Это делает более удобной управление множеством страниц. Кроме того, вы можете использовать TFormLoader из библиотеки VG для динамического загрузки форм.

Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования).


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Вкладки и Страницы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-11-30 11:42:55
2024-12-21 14:38:37/0.0041799545288086/0