在做项目时,我需要一个可指定边框颜色和宽度的panel,而自带的panel不能实现,我就想用两个panel来实现:写一个组件继承TPanel,添加一个属性ContentPanel,在create方法里将父panel的边框设为none,然后设定它的背景色,即用它来作为边框,然后以它为父容器创建ContentPanel,设置ContentPanel的left,top,width,height时旁边留出一点,这样看起来就是一个带边框的panel,可指定颜色和宽度。
        现在问题是,在create方法里,我若是这样创建ContentPanel:ContentPanel:=TPanelBG.Create(Self);则此组件在使用时,拖一个label组件放到上面时,它不能被放到ContentPanel上,而是放到了父组件上。我看不行,就改成了ContentPanel:=TPanelBG.Create(owner);这样一来,每次重新打开工程时,就会自动在组件下多创建一个panel组件,因为打开工程时,他会执行到create方法,然后执行了ContentPanel:=TPanelBG.Create(owner);真是郁闷。     哪位高手能告诉若是ContentPanel:=TPanelBG.Create(Self)时,如何使label组件可以被拖放到ContentPanel上,或者告诉我当ContentPanel:=TPanelBG.Create(owner)时,打开工程不让它重复执行创建ContentPanel组件呢???谢谢!!!

解决方案 »

  1.   

    如果只是“需要一个可指定边框颜色和宽度的panel”,不必重写一个组件,以下代码可以实现,当然设计期是看不到的:
    type
      TPanel = class(ExtCtrls.TPanel)
      public
        procedure Paint; override;
      end;  TForm1 = class(TForm)
        Panel1: TPanel;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TPanel }procedure TPanel.Paint;
    begin
      Canvas.Brush.Color := clBtnface;
      Canvas.FillRect(ClientRect);
      // 3个像素宽的红色边框
      Canvas.Pen.Color := clRed;
      Canvas.Pen.Width := 3;
      Canvas.Rectangle(0, 0, Width, Height);
    end;如果窗体上有多个TPanel,而只有一个需要自画边框,可以设置一下Tag以区别:
    type
      TPanel = class(ExtCtrls.TPanel)
      public
        procedure Paint; override;
      end;  TForm1 = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TPanel }procedure TPanel.Paint;
    begin
      if Tag = 999 then  //需要自画的TPanel.Tag=999
      begin
        Canvas.Brush.Color := clBtnface;
        Canvas.FillRect(ClientRect);
        Canvas.Pen.Color := clRed;
        Canvas.Pen.Width := 3;
        Canvas.Rectangle(0, 0, Width, Height);
      end 
      else inherited;   //否则,由原来的TPanel画
    end;
      

  2.   

    Canvas.Brush.Color := clBtnface;可改为Canvas.Brush.Color := Color;
      

  3.   

    这样做是可以,我最后就是这样做的,但我想知道:组合的两个panel如何使上面的那个panel成为整个组件在设计是时可接收其他组件的容器,即可以将组件拖到上面去。我发现,将button拖上去是可以的,而把label拖上去是不行的,不知为何,难道是因为label不是继承自TWincontrol?
      

  4.   

    这个你到说对了,TLabel确实不是继承自TWincontrol,而是TGraphicControl。