管理动态数组表单(在页面控件内)

时间:2014-02-22 06:58:28

标签: delphi

我可以使用此处TAB AT RUN TIME 给出的解决方案在运行时创建TABSHEETS。 在我的用例中,我需要创建一个动态数量的表单,我在该页面控件上创建3个不同的子表单。

如何创建动态的表单集以及如何在运行时处理这些控件?

MyForm1 := CreateTabAndForm_type_1;
MyForm2 := CreateTabAndForm_type_1;
MyForm3 := CreateTabAndForm_type_1;
....
???

2 个答案:

答案 0 :(得分:2)

创建包含标签页和表单的记录:

type 
  TTabsheetAndForm = record
    Tabsheet: TTabsheet;
    Form: TMyForm;
  end;

然后使用动态数组:TArray<TTabsheetAndForm>array of TTabsheetAndForm。或者是通用容器:TList<TTabsheetAndForm>

然后在实例化GUI控件时填充数组或列表。

如果你提示这些东西中总有三个,那么也许你甚至不需要这个数组。三个变量将完成这项工作。

答案 1 :(得分:2)

以下是如何向PageControl添加表单以及如何从TabSheet返回表单实例的小示例。

  • 表单通过TControl.ManualDock
  • 停靠在PageControl上
  • 所以停靠的表单可以通过TTabSheet.Controls[0]访问(表单是此TabSheet上的第一个控件)

此示例只是一个POC,并未涵盖您将在实际应用中执行的所有检查。


MainForm

type
  TMainForm = class( TForm )
    PageControl1 : TPageControl;
    Button_Panel : TPanel;
    AddForm_Button : TButton;
    PressButtonOnSubForm_Button: TButton;
    procedure AddForm_ButtonClick( Sender : TObject );
    procedure PressButtonOnSubForm_ButtonClick(Sender: TObject);
  private
    function CreateFormInPageControl( AFormClass : TFormClass; APageControl : TPageControl ) : TForm;
    function GetFormFromTabSheet( ATabSheet : TTabSheet ) : TForm;
    function GetActivePageControlForm( APageControl : TPageControl ) : TForm;
  public
    { Public-Deklarationen }
  end;

implementation

uses
  FormSub;

procedure TMainForm.PressButtonOnSubForm_ButtonClick(Sender: TObject);
begin
  // push the button
  if Assigned( PageControl1.ActivePage ) then
    ( GetActivePageControlForm(PageControl1) as TSubForm ).Button1.Click;
end;

procedure TMainForm.AddForm_ButtonClick( Sender : TObject );
var
  LForm : TForm;
begin
  LForm := CreateFormInPageControl( TSubForm, PageControl1 );
end;

function TMainForm.CreateFormInPageControl( AFormClass : TFormClass; APageControl : TPageControl ) : TForm;
begin
  // create a new form from the given form class
  Result := AFormClass.Create( Self );
  // dock the form to the give page control
  Result.ManualDock( APageControl, nil, alClient );
  // show the form
  Result.Show;
end;

function TMainForm.GetActivePageControlForm( APageControl : TPageControl ) : TForm;
begin
  Result := GetFormFromTabSheet( APageControl.ActivePage );
end;

function TMainForm.GetFormFromTabSheet( ATabSheet : TTabSheet ) : TForm;
begin
  Result := ATabSheet.Controls[0] as TForm;
end;

SubForm

type
  TSubForm = class( TForm )
    Button1 : TButton;
    ListBox1 : TListBox;
    procedure Button1Click( Sender : TObject );
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

procedure TSubForm.Button1Click( Sender : TObject );
begin
  // just to put some action to this form
  ListBox1.ItemIndex := ListBox1.Items.Add( 'Button pressed' );
end;

更新

如果你想摆脱停靠的表格,你只需致电(对于当前的活动表格)

GetActivePageControlForm( PageControl1 ).Release;

TabSheet也会消失。