unit HDPanel;interfaceuses
  SysUtils, Classes, Controls, ExtCtrls, ComCtrls;type
  THDPanel = class(TPanel)
  private
    { Private declarations }
  protected
    { Protected declarations }
  public
    constructor Create(AOwner: TComponent); override;
    { Public declarations }
  published
    { Published declarations }
  end;procedure Register;implementationprocedure Register;
begin
  RegisterComponents('Samples', [THDPanel]);
end;{ THDPanel }constructor THDPanel.Create(AOwner: TComponent);
var
  pctPageControl: TPageControl;
  tbsTabSheet: TTabSheet;
  TempStr: TComponentName;
  TempStr2: TComponentName;
begin
  inherited;
  TempStr := 'PageControl1';
  TempStr2 := 'TabSheet1';
  with Self do
    begin
      Height := 225;
      Width := 345;
      Top := 40;
      Left := 104;
    end;
  pctPageControl := TPageControl.Create(AOwner);
  pctPageControl.Name := TempStr;
  pctPageControl.Parent := Self;  tbsTabSheet := TTabSheet.Create(AOwner);
  tbsTabSheet.Name := TempStr2;
  tbsTabSheet.PageControl := pctPageControl;
  tbsTabSheet.Caption := 'why'; 
end;我的本意是建立一个panel,里面有一个PageControl,PageControl包含一个Tabsheet,但怎么试也不行,请大家帮忙看看
end.

解决方案 »

  1.   

    错误:control '' has no parent window
    请把代码试试就知道了,
      

  2.   

    当然不行你的panel还没create出来,你就想给pctPageControl.Parent赋值至少要等你panel create出来以后再给pctPageControl.Parent 赋值为panel吧
      

  3.   

    我试着该成:
    unit HDPanel;interfaceuses
      SysUtils, Classes, Controls, ExtCtrls, ComCtrls;type
      THDPanel = class(TPanel)
      private
        { Private declarations }
      protected
        { Protected declarations }
      public
        constructor Create(AOwner: TComponent); override;
        { Public declarations }
      published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [THDPanel]);
    end;{ THDPanel }constructor THDPanel.Create(AOwner: TComponent);
    var
      pctPageControl: TPageControl;
      tbsTabSheet: TTabSheet;
      TempStr: TComponentName;
      TempStr2: TComponentName;
    begin
      inherited;
      TempStr := 'PageControl1';
      TempStr2 := 'TabSheet1';
      with Self do
        begin
          Height := 225;
          Width := 345;
          Top := 40;
          Left := 104;
        end;
      pctPageControl := TPageControl.Create(AOwner);
      pctPageControl.Name := TempStr;
      pctPageControl.Parent := Self;  tbsTabSheet := TTabSheet.Create(AOwner);
      tbsTabSheet.Name := TempStr2;
      tbsTabSheet.PageControl := TPageControl(FindComponent(TempStr));
      TTabSheet(FindComponent(TempStr2)).Caption := '终于好了^_^';
    end;end.虽然不会出错,但Tabsheet却不是显示在pagecontrol上,请大家帮忙看看
      

  4.   

    把代码改在 下面.....的位置。
    procedure CreateWnd; override;
    begin
      inherited;
      .....
    end;
      

  5.   

    对了,为什么没有对新创建的控件没有设置: Visible := True;
      

  6.   

    unit HDPanel;interfaceuses
      SysUtils, Messages, Classes, Controls, ExtCtrls, ComCtrls;type
      THDPanel = class(TPanel)
      private
        { Private declarations }
        pctPageControl: TPageControl;
        tbsTabSheet: TTabSheet;
      protected
        { Protected declarations }
        procedure CreateWnd; override;
      public
        constructor Create(AOwner: TComponent); override;
        { Public declarations }
      published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [THDPanel]);
    end;{ THDPanel }constructor THDPanel.Create(AOwner: TComponent);
    var
      TempStr: TComponentName;
      TempStr2: TComponentName;
    begin
      inherited;
      TempStr := 'PageControl1';
      TempStr2 := 'TabSheet1';
      with Self do
        begin
          Height := 225;
          Width := 345;
          Top := 40;
          Left := 104;
        end;
      pctPageControl := TPageControl.Create(AOwner);
      pctPageControl.Name := TempStr;
      pctPageControl.Parent := Self;  tbsTabSheet := TTabSheet.Create(AOwner);
      tbsTabSheet.Name := TempStr2;
    //  tbsTabSheet.PageControl := pctPageControl;
      tbsTabSheet.Caption := 'why';
    end;procedure THDPanel.CreateWnd;
    begin
      inherited;  if Visible then
        tbsTabSheet.PageControl := pctPageControl;
    end;end.
      

  7.   

    to  JoyYuan97()
    我的代码全部都在inherited下啊to JoyYuan97
    我试过了,加不加都一样^_^
      

  8.   

    toto chechy(简简单单的活)
    请问procedure CreateWnd; override;这个过程有什么作用?
      

  9.   

    原因如下:
    Create的时候,由于Panel没有Handle,所以PageControl还没有显示。这时:
    tbsTabSheet.PageControl := pctPageControl;
    将产生例外。
    而CreateWnd;函数执行后,Panel已经有了Handel,也就是PageControl可以显示了,所以可以用这个语句。