我可以使用此处TAB AT RUN TIME 给出的解决方案在运行时创建TABSHEETS。 在我的用例中,我需要创建一个动态数量的表单,我在该页面控件上创建3个不同的子表单。
如何创建动态的表单集以及如何在运行时处理这些控件?
MyForm1 := CreateTabAndForm_type_1;
MyForm2 := CreateTabAndForm_type_1;
MyForm3 := CreateTabAndForm_type_1;
....
???
答案 0 :(得分:2)
创建包含标签页和表单的记录:
type
TTabsheetAndForm = record
Tabsheet: TTabsheet;
Form: TMyForm;
end;
然后使用动态数组:TArray<TTabsheetAndForm>
或array of TTabsheetAndForm
。或者是通用容器:TList<TTabsheetAndForm>
。
然后在实例化GUI控件时填充数组或列表。
如果你提示这些东西中总有三个,那么也许你甚至不需要这个数组。三个变量将完成这项工作。
答案 1 :(得分:2)
以下是如何向PageControl添加表单以及如何从TabSheet返回表单实例的小示例。
TControl.ManualDock
TTabSheet.Controls[0]
访问(表单是此TabSheet上的第一个控件)此示例只是一个POC,并未涵盖您将在实际应用中执行的所有检查。
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;
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也会消失。