Как работать с формой, куда динамически передаются страницы (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.


Далее: Клавиши-акселераторы для TPageControl »»