WriteComponentResFile 不包括动态添加到 TTabSheet 的组件

发布于 2024-08-16 22:45:36 字数 2629 浏览 6 评论 0原文

我正在尝试将使用自定义工具创建的一组表单转换为 Delphi 表单。我试图在运行时添加所有必需的组件,然后使用 WriteComponentResFile 创建 DFM 文件。

我所有的初始测试看起来都不错,直到我尝试添加 TPageControl 和 TabSheets。当前的表单可以有多个页面,因此我将使用 PageControl 来镜像它。问题是我添加到 TabSheet 的任何组件都不会流式传输到 DFM。如果我显示表单,看起来不错,但 WriteComponentResFile 缺少一些内容。

我正在写一个相应的 pas 文件,这样我就可以在完成后在 IDE 中打开它。我们的目标是摆脱自定义表单设计器并开始使用 Delphi IDE 作为我们的表单设计器。

下面是一些示例代码,展示了我如何创建组件:

procedure WriteFormAsDFM(OutputFileName: string);
var
  PageIndex: integer;
  PageCount: Integer;
  OutputForm: TForm;
  Pages: TPageControl;
  NewPage: TTabSheet;
  NewLabel: TLabel;
begin

  OutputForm := TForm.Create(nil);
  OutputForm.Name := ChangeFileExt(ExtractFileName(OutputFileName), '');
  OutputForm.Caption := OutputForm.Name;
  OutputForm.Height := 300;
  OutputForm.Width := 300;

  Pages := TPageControl.Create(OutputForm);
  Pages.Parent := OutputForm;
  Pages.Top := 50;
  Pages.Left := 0;
  Pages.Height := 200;
  Pages.Width := 200;

  NewLabel := TLabel.Create(OutputForm);
  NewLabel.Parent := OutputForm;
  NewLabel.Caption := 'Label on Form';

  //write pages
  PageCount := 2;

  for PageIndex := 0 to PageCount - 1 do
  begin
    NewPage := TTabSheet.Create(Pages);
    NewPage.Parent := Pages;
    NewPage.PageControl := Pages;
    NewPage.Caption := 'Page ' + IntToStr(PageIndex);
    NewPage.Name := 'tsPage' + IntToStr(PageIndex);

    NewLabel := TLabel.Create(NewPage);
    NewLabel.Parent := NewPage;
    NewLabel.Caption := 'Label on ' + NewPage.Caption;
  end;

  WriteComponentResFile(OutputFileName, OutputForm);
  //WritePasFile(OutputFileName, OutputForm);

  OutputForm.ShowModal;

  FreeAndNil(OutputForm);
end;

这是输出的 DFM 文件。您可以看到表单上的标签已创建,但看不到添加到 TabSheets 的标签。

object Form123: TForm
  Left = 69
  Top = 69
  Caption = 'Form123'
  ClientHeight = 264
  ClientWidth = 284
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object TLabel
    Left = 0
    Top = 0
    Width = 67
    Height = 13
    Caption = 'Label on Form'
  end
  object TPageControl
    Left = 0
    Top = 50
    Width = 200
    Height = 200
    ActivePage = tsPage0.Owner
    TabOrder = 0
    object tsPage0: TTabSheet
      Caption = 'Page 0'
      ExplicitLeft = 0
      ExplicitTop = 0
      ExplicitWidth = 0
      ExplicitHeight = 0
    end
    object tsPage1: TTabSheet
      Caption = 'Page 1'
      ExplicitLeft = 0
      ExplicitTop = 0
      ExplicitWidth = 0
      ExplicitHeight = 0
    end
  end
end

I am trying to convert a set of forms that were created with a custom tool to Delphi forms. I am trying to add all the necessary components at runtime and then use WriteComponentResFile to create the DFM file.

All of my initial tests looked good until I tried adding a TPageControl and TabSheets. The current forms can have multiple pages so I was going to mirror this using the PageControl. The problem is any components I add to a TabSheet are not streamed out to the DFM. It looks good if I show the form but something is missing for WriteComponentResFile.

I am writing out a corresponding pas file so I can open this up in the IDE once they are done. The goal is to move away from the custom form designer and start to use the Delphi IDE for our form designer.

Here is some sample code showing how I am creating the components:

procedure WriteFormAsDFM(OutputFileName: string);
var
  PageIndex: integer;
  PageCount: Integer;
  OutputForm: TForm;
  Pages: TPageControl;
  NewPage: TTabSheet;
  NewLabel: TLabel;
begin

  OutputForm := TForm.Create(nil);
  OutputForm.Name := ChangeFileExt(ExtractFileName(OutputFileName), '');
  OutputForm.Caption := OutputForm.Name;
  OutputForm.Height := 300;
  OutputForm.Width := 300;

  Pages := TPageControl.Create(OutputForm);
  Pages.Parent := OutputForm;
  Pages.Top := 50;
  Pages.Left := 0;
  Pages.Height := 200;
  Pages.Width := 200;

  NewLabel := TLabel.Create(OutputForm);
  NewLabel.Parent := OutputForm;
  NewLabel.Caption := 'Label on Form';

  //write pages
  PageCount := 2;

  for PageIndex := 0 to PageCount - 1 do
  begin
    NewPage := TTabSheet.Create(Pages);
    NewPage.Parent := Pages;
    NewPage.PageControl := Pages;
    NewPage.Caption := 'Page ' + IntToStr(PageIndex);
    NewPage.Name := 'tsPage' + IntToStr(PageIndex);

    NewLabel := TLabel.Create(NewPage);
    NewLabel.Parent := NewPage;
    NewLabel.Caption := 'Label on ' + NewPage.Caption;
  end;

  WriteComponentResFile(OutputFileName, OutputForm);
  //WritePasFile(OutputFileName, OutputForm);

  OutputForm.ShowModal;

  FreeAndNil(OutputForm);
end;

and here is the DFM file that is output. You can see the label on the form is created but not the labels added to the TabSheets.

object Form123: TForm
  Left = 69
  Top = 69
  Caption = 'Form123'
  ClientHeight = 264
  ClientWidth = 284
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object TLabel
    Left = 0
    Top = 0
    Width = 67
    Height = 13
    Caption = 'Label on Form'
  end
  object TPageControl
    Left = 0
    Top = 50
    Width = 200
    Height = 200
    ActivePage = tsPage0.Owner
    TabOrder = 0
    object tsPage0: TTabSheet
      Caption = 'Page 0'
      ExplicitLeft = 0
      ExplicitTop = 0
      ExplicitWidth = 0
      ExplicitHeight = 0
    end
    object tsPage1: TTabSheet
      Caption = 'Page 1'
      ExplicitLeft = 0
      ExplicitTop = 0
      ExplicitWidth = 0
      ExplicitHeight = 0
    end
  end
end

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空心空情空意 2024-08-23 22:45:36

尝试将表单用作组件的所有者。

NewPage := TTabSheet.Create(OutputForm);

NewLabel := TLabel.Create(OutputForm);

Try to use the form as owner of the components.

NewPage := TTabSheet.Create(OutputForm);

NewLabel := TLabel.Create(OutputForm);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文