Delphi World - Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования)
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как работать с формой, куда динамически передаются страницы (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.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования