Советы по Delphi

         

Как работать с формой, куда динамически


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. [001090]



Содержание раздела