我们在一个窗口上放置了一个pageControl,我们知道一个pageControl上可以放置多个pageControl,而且这多个pageControl功能相对独立,没有耦合。我们可以这样做:建立这个主窗体放置一个空的PageControl,然后声明一个TInterfaceList变量用来存储PageControl的具体实现。每一个PageControl动态创建,使用注册的Frame来填充。代码如下:

unit frmStartPage;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ImgList,Contnrs, ComCtrls, ExtCtrls;

Type

//填充pageControl的Frame基类

TPageFrame = class(TFrame)

protected

function Caption :String ; virtual; abstract;

end;

TPageFrameClass = class of TPageFrame ;

TStartPage = class(TForm)

PageControl1: TPageControl;

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

StartPage :TStartPage ;

RegTabSheetClasses: TClassList;

procedure RegisterStartPageTabSheet( AFrameClass :TPageFrameClass);

implementation

{$R *.dfm}

procedure TStartPage.FormCreate(Sender: TObject);

var

i:integer;

lTabSheet : TTabSheet;

lFrame : TPageFrame;

begin

for i:= 0 to RegTabSheetClasses.Count -1 do

begin

lTabSheet := TTabSheet.Create(PageControl1);

lFrame := TPageFrameClass( RegTabSheetClasses[i]).Create(self) as TPageFrame;

lTabSheet.Caption := lFrame.Caption ;

lFrame.Align := alClient;

lTabSheet.InsertControl(lFrame);

lTabSheet.PageControl := PageControl1;

lTabSheet.PageIndex := 0 ;

end;

end;

procedure RegisterStartPageTabSheet( AFrameClass :TPageFrameClass);

begin

RegTabSheetClasses.Add(AFrameClass);

end;

initialization

RegTabSheetClasses := TClassList.Create ;

finalization

RegTabSheetClasses.Free;

end.

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs,frmStartPage, StdCtrls;

type

TFrame2 = class(TPageFrame)

Label1: TLabel;

private

{ Private declarations }

protected

{ Public declarations }

function Caption :String ; override;

public

end;

implementation

{$R *.dfm}

{ TFrame2 }

function TFrame2.Caption: String;

begin

result := ‘Frame1‘;

end;

initialization

RegisterStartPageTabSheet(TFrame2);

end.