我如何创建一个新的框架实例以托管到 Tpagecontrol 中的每个动态选项卡中?

How can i create a new frame instance to be hosted into each dynamic tabsheet in Tpagecontrol?

我在页面控件中创建了动态标签表,然后每个页面都需要承载一个包含多个组件(如 Tedit 等)的框架。我框架中的这些 Tedit 主机数据来自 ini 文件。 如果我做我的 tabsheet 静态它工作!但是我需要做我的标签表动态...我试图创建一个框架但是当我放入我的循环时我得到错误

我该怎么做?

谢谢!

unit DlgXRechnung;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Xml.xmldom,
  Xml.XMLIntf, Vcl.Buttons, Xml.XMLDoc, IniFiles, Vcl.ComCtrls;

type
  TDlg_XRechnung = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    X_Rechnung: TXMLDocument;
    Memo_XML: TMemo;
    Btn_Laden: TBitBtn;
    OpenDialog_Datei: TOpenDialog;
    Panel5: TPanel;
    Label1: TLabel;
    Edit_LeitwegeID: TLabeledEdit;
    Edit_Bestellnummer: TLabeledEdit;
    Edit_Projektreferenz: TLabeledEdit;
    Edit_Vertragsnummer: TLabeledEdit;
    Edit_Rechnungsnummer: TLabeledEdit;
    Edit_Rechnungsdatum: TDateTimePicker;
    Label2: TLabel;
    Label3: TLabel;
    Edit_Leistungsdatum: TDateTimePicker;
    Edit_Bemerkung: TMemo;
    Label4: TLabel;
    Btn_XML_erstellen: TBitBtn;
    Btn_Close: TBitBtn;
    Panel6: TPanel;
    Label5: TLabel;
    Edit_Rechnungsersteller_Name: TLabeledEdit;
    Edit_Rechnungsersteller_Adresse: TLabeledEdit;
    Edit_Rechnungsersteller_PLZ: TLabeledEdit;
    Edit_Rechnungsersteller_UST_ID: TLabeledEdit;
    Edit_Rechnungsersteller_Ort: TLabeledEdit;
    Edit_Rechnungsersteller_Land: TLabeledEdit;
    Edit_Rechnungsersteller_Firmenbuch: TLabeledEdit;
    Edit_Rechnungsersteller_Steuerart: TLabeledEdit;
    GroupBox1: TGroupBox;
    Edit_Waehrung_Rechnung: TLabeledEdit;
    Edit_Waehrung_UST: TLabeledEdit;
    Panel7: TPanel;
    Label6: TLabel;
    Edit_Rechnungsempfänger_Name: TLabeledEdit;
    Edit_Rechnungsempfänger_Adresse: TLabeledEdit;
    Edit_Rechnungsempfänger_PLZ: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    Edit_Rechnungsempfänger_Ort: TLabeledEdit;
    Edit_Rechnungsempfänger_Land: TLabeledEdit;
    LabeledEdit7: TLabeledEdit;
    LabeledEdit8: TLabeledEdit;
    PC_Positionen: TPageControl;
    procedure Btn_LadenClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Btn_XML_erstellenClick(Sender: TObject);
    procedure Btn_CloseClick(Sender: TObject);
    procedure PC_PositionenChange(Sender: TObject);
  private
    INIDateiname : string;
    INIDatei : TIniFile;
    PDFDatei : string;
    XRechnungDatei : string;
    Version : integer;
    DebugMode : integer;
    AnzahlPositinen : integer;
    procedure INIDatei_einlesen;
    procedure XML_erstellen;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Dlg_XRechnung: TDlg_XRechnung;

implementation

{$R *.dfm}
// -----------------------------------------------------------------------------
procedure TDlg_XRechnung.Btn_CloseClick(Sender: TObject);
begin
  Close;
end;
// -----------------------------------------------------------------------------
procedure TDlg_XRechnung.Btn_LadenClick(Sender: TObject);
begin
  if OpenDialog_Datei.Execute then
  begin
    INIDateiname := OpenDialog_Datei.FileName;
  end;
  if Trim(INIDateiname) <> '' then INIDatei_einlesen;
end;
// -----------------------------------------------------------------------------
procedure TDlg_XRechnung.Btn_XML_erstellenClick(Sender: TObject);
begin
  XML_erstellen;
end;
// -----------------------------------------------------------------------------
procedure TDlg_XRechnung.FormCreate(Sender: TObject);
begin
  INIDateiname := '';
end;
// -----------------------------------------------------------------------------
procedure TDlg_XRechnung.FormShow(Sender: TObject);
begin
  if Trim(ParamStr(1)) <> '' then
  begin
    INIDateiname := ParamStr(1);
    INIDatei_einlesen;
  end;
end;
// -----------------------------------------------------------------------------
procedure TDlg_XRechnung.INIDatei_einlesen;
var NeueSeite : TTabSheet;
  i,l: Integer;
begin
  try
    INIDatei                := TIniFile.Create(INIDateiname);
    Version                 := INIDatei.ReadInteger('INI','Version', 1);
    DebugMode               := INIDatei.ReadInteger('INI','DebugMode', 0);
    PDFDatei                := INIDatei.ReadString('PDF','PDFName', '');
    XRechnungDatei          := INIDatei.ReadString('PDF','XInvoice', '');
    Edit_LeitwegeID.Text    := INIDatei.ReadString('InvData','BT-10', '');
    Edit_Bestellnummer.Text := INIDatei.ReadString('InvData','BT-13', '');
    Edit_Projektreferenz.Text := INIDatei.ReadString('InvData','BT-11', '');
    Edit_Vertragsnummer.Text := INIDatei.ReadString('InvData','BT-12', '');
    Edit_Rechnungsnummer.Text := INIDatei.ReadString('InvData','BT-1', '');
    Edit_Rechnungsdatum.Date := INIDatei.ReadDate('InvData','BT-2', now);
    Edit_Leistungsdatum.Date := INIDatei.ReadDate('InvData','BT-9', now);
    Edit_Bemerkung.Text := INIDatei.ReadString('InvData','BT-22', '');
    Edit_Rechnungsersteller_Name.Text := INIDatei.ReadString('InvErst','BT-27', '');
    Edit_Rechnungsersteller_UST_ID.Text := INIDatei.ReadString('InvErst','BT-31', '');
    Edit_Rechnungsersteller_Adresse.Text := INIDatei.ReadString('InvErst','BT-35', '') + INIDatei.ReadString('InvErst','BT-36', '');
    Edit_Rechnungsersteller_PLZ.Text := INIDatei.ReadString('InvErst','BT-38', '');
    Edit_Rechnungsersteller_Ort.Text := INIDatei.ReadString('InvErst','BT-37', '');
    Edit_Rechnungsersteller_Land.Text := INIDatei.ReadString('InvErst','BT-40', '');
    Edit_Rechnungsempfänger_Name.Text := INIDatei.ReadString('InvEmp','BT-44','');
    Edit_Rechnungsempfänger_Adresse.Text := INIDatei.ReadString('InvEmp','BT-50', '') + INIDatei.ReadString('InvEmp','BT-51', '');
    Edit_Rechnungsempfänger_PLZ.Text := INIDatei.ReadString('InvEmp','BT-53', '');
    Edit_Rechnungsempfänger_Ort.Text := INIDatei.ReadString('InvEmp','BT-52', '');
    Edit_Rechnungsempfänger_Land.Text := INIDatei.ReadString('InvEmp','BT-55', '');

    AnzahlPositinen := INIDatei.ReadInteger('POS','AnzPos', 1);
    for i := 1 to AnzahlPositinen do
    begin
      NeueSeite := TTabSheet.Create(PC_Positionen);
      NeueSeite.PageControl := PC_Positionen;
      NeueSeite.Caption := 'Position ' + IntToStr(i);




    end;

  finally
    INIDatei.Free;
  end;
end;

首先使用 IDE 设计一个 TFrame(很像你设计一个 TForm)。添加您需要的所有项目,例如 TEdit。将框架的单位添加到表单单位的使用子句中。创建框架时,您需要指定所有者。您可以使用与您创建的 TabSheet 相同的内容。您应该清除名称 属性 或为每个名称设置一个合适的唯一名称。

然后在你用来创建TabSheet的循环中,创建一个新的框架实例,将他的父属性赋值给刚创建的TabSheet,然后读取所有项目来自 INI 文件的值。

顺便再读一遍我对你上一个问题的回答()。它已经包含了所有需要的信息。