我需要制作一个控件,从TPanel继承而来
在代码中动态地在TPanel上加入一个TTabControl(假定名称为FTcDemo),
只要我不设置Tabs属性就没有问题,设置后,在测试单元中一旦放入新控件就出错。
错误信息:(如果注释对Tabs操作的相关代码,则不再有错)Control '' has no parent window.控件中的相关代码:
sl: TStrings;  FTcDemo := TTabControl.Create(AOwner);
  with FTcDemo do
  begin
    Parent := TWinControl(AOwner);
    Left := 0;
    Top := 218;
    Width := 378;
    Height := 18;
    Align := alBottom;
    HotTrack := True;
    TabPosition := tpBottom;
    sl := TStringList.Create;
    try
      begin
        sl.Add('Main');
        sl.Add('Sub1');
        sl.Add('Sub2');
        Tabs.Assign(sl);
      end;
    finally
      sl.Free;
    end;
  end;//----------------------------------------------
请各位高手不吝赐教,谢谢先!

解决方案 »

  1.   

    我用你的代码将一个TabControl建到Panel上,很正常啊,难道是你写的控件有问题?
      

  2.   

    将TabControl建立到Panel上,是在应用程序中还是在写控件时啊?
    在应用程序中时很正常的,我试过。甚至连Panel都可以用代码动态创建的。
    但是在写控件时,这样就不行了。对于TTabControl是这样,类似的,对于TPageControl中动态创建TTabSheet也是出现同样错误
    //-----------------------------------------------------完整例子:
    unit MyPageControl;interfaceuses
      Windows, Messages, SysUtils, Classes, Controls, ComCtrls, ExtCtrls;type  TMyPageControl = class(TPageControl)
      private
        { Private declarations }
      protected
        { Protected declarations }
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Win32', [TMyPageControl]);
    end;{TMyPageControl}
    constructor TMyPageControl.Create(AOwner: TComponent);
    const
      TabTitles: array[0..3] of ShortString = ('Customer', 'Orders', 'Items', 'Parts' );
    var
      i: Integer;
    begin
      inherited Create(AOwner);
    //  Align := alClient;  for i := Low(TabTitles) to High(TabTitles) do
        with TTabSheet.Create(AOwner) do
        begin
          Parent := ...{设置或不设置都一样有错}
          PageControl := Self;
          Name := 'ts' + TabTitles[i];
          Caption := TabTitles[i];
       end;
    end;destructor TMyPageControl.Destroy;
    begin
      inherited Destroy;
    end;end.
    //----------------------------------------------------------------
    以上代码创建的控件就无法使用。
    上面的部分代码来源于帮助信息,即以下代码段。我使用它们以TPanel继承,在Panel上
    动态创建TPageControl和TTabSheet,仍然失败。帮助中的原始代码为:
    const
      TabTitles: array[0..3] of ShortString = ('Customer', 'Orders', 'Items', 'Parts' );
    var
      i: Integer;
      PageControl1: TPageControl;
    begin
      PageControl1 := TPageControl.Create(Self);
      PageControl1.Parent := Self;
      PageControl1.Align := alClient;
      for i := Low(TabTitles) to High(TabTitles) do
        with TTabSheet.Create(PageControl1) do
        begin
          PageControl := PageControl1;      Name := 'ts' + TabTitles[i];
          Caption := TabTitles[i];
       end;//============================================================
    我实在看不出我写的代码究竟错在哪里,各位大侠帮帮忙啊,我这个周必须搞定啊:(
      

  3.   

    试试把动态生成的代码写在你的控件的Loaded()方法里,它是tcomponent的虚方法。
      

  4.   

    我觉得关键是你程序中的Parent := ...蛰居代码的问题,因为有可能你的组件被创建的时候,制定用来作为它的parent的组件还没有被创建,就是说它的指针是无效的,所以会出现访问错误
    以上是我猜想的,你先试试将代码写在Loaded()方法里,如果还是不行明天我到单位再试试
      

  5.   

    TTabSheet好像是不能动态增删的,只能事先设计好,在程序代码中隐藏和显示
      

  6.   

    To maozefa(之源):
    应该可以动态增删的吧,帮助中的代码我试过,在应用程序环境下完全可以啊。To tonylk(=www.tonixsoft.com=):
    先谢了,我也只有明天才能在公司中试。
    (我看过网站tonixsoft了,呵呵,你们公司的?)
      

  7.   

    试过了,错误倒不再有了。可是我插入的TabSheet没有出现。估计Loaded中没有作用。
    请看:(Help)
    TPageControl.LoadedInitializes the page control after all its parts have been loaded from a stream.procedure Loaded; override;DescriptionLoaded is called automatically when the form containing the page control is first loaded into memory. TPageControl overrides the Loaded method to ensure that all tab sheets with a Highlighted property of True appear highlighted.
    //-----------------------------------------------------------------------
    好象Loaded是在所有TabSheet都显示好了后,再被调用的,是这样吗?我英文不太好:(
      

  8.   

    大家顺便看看这个相似的问题好吗?
    http://expert.csdn.net/Expert/topicview1.asp?id=2452671
      

  9.   

    to lx130(阿生) 你的问题到底解决了没有?
      

  10.   

    哦,对了。Loaded is called automatically when the form containing the page control is first loaded into memory.呵呵。只有运行Form时才能看到。不过,如果我想在设计期就能看到那些TabSheet的话,该如何办呢?
      

  11.   

    To maozefa(之源):
    那你认为该怎么办才好?
      

  12.   

    设计时的确实不好做,我已放弃。就用运行期的吧。非常感谢tonylk(=www.tonixsoft.com=) To maozefa(之源):原因呢?能不能告诉我啊?然后我想结贴了:)