Created a panel object with 2 buttons - visibility issue

unit Unit_But_Panel;

interface
Uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
    System.Classes, Vcl.Graphics, System.Types, Vcl.Controls, Vcl.Forms,
    Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TButtonsEvent = procedure(Sender: TObject; LoadButton: Boolean) of object;

   TButPanel = class(TCustomPanel)
    Private
      FSavebut: TButton;
      FLoadbut: TButton;
      FOnButtsClick: TButtonsEvent;
    protected
      Procedure GetButClicks(Sender: TObject);
      Function GetButSave: Boolean;
      Procedure SetButSave(Value: Boolean);

    Public
     Constructor Create(AOwner: TComponent); override;
     Destructor Destroy; override;
     procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); reintroduce;
     property SaveButVisable: Boolean read GetButSave write SetButSave;
    Published
     property OnButtsClick: TButtonsEvent read FOnButtsClick write FOnButtsClick;
   end;

implementation

{ ButPanel }

constructor TButPanel.Create(AOwner: TComponent);
begin
  inherited;
  FSavebut := TButton.Create(Self);
  FSavebut.Parent := Self;
  FLoadbut := TButton.Create(Self);
  FLoadbut.Parent := Self;
  BevelOuter := bvNone;
  AutoSize := True;
  FLoadbut.Align := alLeft;
  FSavebut.Align := alClient;
  FLoadbut.Caption := 'Load';
  FSavebut.Caption := 'Save';
  FLoadbut.OnClick := GetButClicks;
  FSavebut.OnClick := GetButClicks;
end;

destructor TButPanel.Destroy;
begin
  FSavebut.Free;
  FLoadbut.Free;
  inherited;
end;

procedure TButPanel.GetButClicks(Sender: TObject);
begin
 If TButton(Sender) = FLoadbut then
  FOnButtsClick(Self, True) else FOnButtsClick(Self, False);
end;

procedure TButPanel.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  FLoadbut.Width := AWidth div 2;
Inherited SetBounds(ALeft, ATop, AWidth, AHeight);
end;

function TButPanel.GetButSave: Boolean;
begin
  result := FSavebut.Visible;
end;

procedure TButPanel.SetButSave(Value: Boolean);
begin
  FSavebut.Visible := Value;
  FSavebut.BringToFront;
  Paint;
end;

end.

and running it in this form

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Unit_But_Panel, Vcl.StdCtrls,
  Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    CheckLoad: TCheckBox;
    CheckSave: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure ButClick(Sender: TObject; LoadButton: Boolean);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ButPanel: TButPanel;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 ButPanel.SaveButVisable := not ButPanel.SaveButVisable;
 If ButPanel.SaveButVisable then Button1.Caption := 'Vis'
    else Button1.Caption := 'gone';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ButPanel := TButPanel.Create(Self);
 ButPanel.Parent := Self;

 ButPanel.Left := 100;
 ButPanel.Top := 100;
 ButPanel.Height := 20;
//ButPanel.Left := 100;
 ButPanel.OnButtsClick := ButClick;
 ButPanel.SetBounds(100, 100, 120, 30);
// ButPanel.SetBounds(ALeft: Integer: ATop: Integer; AWidth: Integer; AHeight: Integer)
end;

procedure TForm1.ButClick(Sender: TObject; LoadButton: Boolean);
begin
  If LoadButton then CheckSave.Checked := Not CheckSave.Checked
                else CheckLoad.Checked := Not CheckLoad.Checked;
end;

end.

my problem is procedure TButPanel.SetButSave(Value: Boolean);
I use invalidate but the Button does not reappear???
why?

You use it where and how? It’s not in the code you are showing.

Generally speaking, if you are creating reusable “building blocks”, you might be better off using TFrame instead of panels.

Tframe has scrollbars but this must be another issue than the parent as the area is only used by that button?