Кидаю проект-болванку, сделанную перед началом работы над основным
unit Unit1; //базовая форма хранителя страницыinterfaceuses...
type
TBPgFrm = class(TForm)
Panel1: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Label1: TLabel;
publicfunction 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;
implementationuses 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;
beginfor 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 := trueelse
vi := TBPgFrm(Frms[i - 1]).PgValid;
if vi thenwith PageControl1 doif i = PageCount - 1 thenbegin
CancelBtnClick(Sender);
exit;
endelsebegin
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 := trueelse
PrevClick(Sender);
endelse
Next.Enabled := true;
end;
procedure TPagesDlg.PrevClick(Sender: TObject);
begin
Prev.Enabled := false;
with PageControl1 dobegin
ActivePage := FindNextPage(ActivePage, false, false);
Prev.Enabled := ActivePage.PageIndex > 0;
end;
Next.Caption := 'Next';
Next.Enabled := true;
end;
end.
// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*unit Unit3; //наследник с RadioGroup.interfaceuses...
type
TBPgFrm3 = class(TBPgFrm)
RadioValid: TRadioGroup;
publicfunction PgValid: boolean; override;
end;
implementation{$R *.DFM}function TBPgFrm3.PgValid: boolean;
begin
result := RadioValid.ItemIndex = 0;
end;
end.
// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*unit Unit4; // наследник с CheckBox.interfaceuses...
type
TBPgFrm2 = class(TBPgFrm)
CheckValid: TCheckBox;
publicfunction 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) от хранителей форм (используя наследование), вы можете следовать этим шагам:
Создайте базовую форму хранения класс TBPgFrm с свойствами, такими как Panel1, PageControl1 и TabSheet1. Этот класс будет служить родителем для других форм хранения.
Создайте дополнительные классы форм хранения, которые наследуются от TBPgFrm (например, TBPgFrm3, TBPgFrm4). Каждый из этих классов будет иметь свой собственный логик и компоненты.
В вашей основной форме (TPagesDlg) создайте список для хранения форм хранения (Frms) и процедуру AddForms, которая создает экземпляры каждой формы хранения и добавляет их в список.
В обработчике события NextClick вы можете динамически переключаться между страницами, установив активную страницу PageControl1. Вы также можете вызвать метод PgInit на текущей странице и проверить, является ли она валидной перед разрешением пользователю продолжать.
Вот пример реализации:
unitUnit2;interfaceuses...,Unit1,Unit3,Unit4;// включите единицы форм храненияtypeTPagesDlg=class(TForm)Panel1:TPanel;Panel2:TPanel;PageControl1:TPageControl;TabSheet1:TTabSheet;Prev:TButton;CancelBtn:TButton;Next:TButton;Label1:TLabel;procedureCancelBtnClick(Sender:TObject);procedureFormDestroy(Sender:TObject);procedureNextClick(Sender:TObject);procedurePrevClick(Sender:TObject);privateFrms:TList;// список форм храненияprocedureAddForms;// добавьте формы хранения в списокend;varPagesDlg:TPagesDlg;implementationuses...,Unit1,Unit3,Unit4;// включите единицы форм храненияprocedureTPagesDlg.AddForms;beginFrms:=TList.Create;Frms.Add(TBPgFrm1.Create(Self));Frms.Add(TBPgFrm2.Create(Self));// добавьте больше форм хранения, если нужноend;procedureTPagesDlg.NextClick(Sender:TObject);vari:integer;// индекс страницыvi:boolean;// флаг валидности страницыbeginNext.Enabled:=false;ifPageControl1.PageCount=1thenAddForms;i:=PageControl1.ActivePage.Index;ifi=0thenvi:=trueelsevi:=TBPgFrm(Frms[i-1]).PgValid;// вызовите метод PgValid на текущей страницеifvithenbeginwithPageControl1doActivePage:=FindNextPage(ActivePage,True,false);Next.Caption:='Finish';Prev.Enabled:=true;ifTBPgFrm(Frms[i]).PgInitthen// вызовите метод PgInit на текущей страницеNext.Enabled:=trueelsePrevClick(Sender);endelseNext.Enabled:=true;end;// ...
В этом примере предполагается, что каждый форм хранения имеет метод PgValid, возвращающий булевое значение, указывающее, является ли страница валидной, и метод PgInit, инициализирующий страницу. Вы можете модифицировать эти методы для соответствия вашим конкретным потребностям.
Обратите внимание, что в Delphi 4 у вас есть возможность прикреплять визуальные компоненты, включая формы, к различным контролам DockSite, включая TPageControl. Это делает более удобной управление множеством страниц. Кроме того, вы можете использовать TFormLoader из библиотеки VG для динамического загрузки форм.
Как работать с формой, куда динамически передаются страницы (PageControl) из форм-хранителей (с использованием наследования).
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.