如何动态创建自定义Tab Sheet运行时

时间:2014-11-28 12:40:57

标签: delphi dynamic types ttabsheet

我想创建一个必须在运行时创建的TTabsheet。 TTabSheet有几个组件,但所有这些组件在每个选项卡上都是相同的。是否可以创建一个“类型”变量,每次都会创建这些选项卡?

谢谢

2 个答案:

答案 0 :(得分:2)

是。您可以从TTabSheet

创建继承的类
TCustomTabSheet = class(TTabSheet)
public
  constructor Create(AOwner : TComponent); override;
public
   FTestButton : TButton;
end;

constructor TCustomTabSheet.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  FTestButton := TButton.Create(Self);
  FTestButton.Parent := Self;
  FTestButton.Left := 1;
  FTestButton.Top := 1;
  FTestButton.Width := 20;
  FTestButton.Heigth := 10;
  FTestButton.Caption := 'Cool button!';
  FTestButton.Name := 'TestButton';
end;

您还可以在设计时使用自定义控件创建一个框架(TFrame),并将其实例托管到所有新标签。

答案 1 :(得分:0)

只是为了它的乐趣,这里有一段代码我定期用来向TPageControl添加一个标签页,上面有一个TMemo。例如,如果您有一个用于编辑文本文件的表单,则可以使用此选项。您可以将此标记添加为新标签,文件名为标题,然后从文件的内容中加载备忘录的.Line属性。

function TMy_form.add_ts_mmo( ntbk : TPageControl; caption : string ) : TTabSheet;
var mmo : TMemo;
begin
  Result := TTabSheet.Create(self);
  Result.PageControl := ntbk;
  Result.Caption := caption;
  mmo := TMemo.Create(self);
  Result.Tag := Integer(mmo);
  mmo.Parent := Result;
  mmo.Font.Name := 'Courier New';
  mmo.Font.Size := 10;
  mmo.Align := alClient;
  mmo.ScrollBars := ssBoth;
  mmo.WordWrap := true;
end;

您可以通过向其添加要添加到其中的PageControl以及标签中使用的标题来调用它。

var
  ts : TTabSheet;
. . .
  ts := add_ts_mmo( myPageControl, ExtractFileName( text_file_nm ) );

请注意,我将新备忘录的指针保存在ts.Tag中,以便稍后通过演员轻松获取。

TMemo(ts.Tag).Lines.LoadFromFile( text_file_nm );

不需要子类化。您可以在Result.Caption := caption行之后创建标签页上可能需要的任何其他组件。请务必将.Parent属性设置为Result

可以在设计时或运行时创建PageControl。