为什么我的尺寸变化控制在与TSplitter共享表单时不起作用?

Fra*_*anz 2 delphi

我正在编写一个面板控件,允许用户最小化面板并隐藏此面板上的组件.单个THidePanel似乎按预期工作,但是当我将其中两个放在由分割器分隔的表单上时.第一个面板是alLeft对齐的; 第二个面板alClient:

屏幕转储

单击第二个面板的按钮时,它不会对最小化或最大化做出反应.这是我的所有代码.为什么不起作用?

const
  BoarderSize = 20;

type

TButtonPosition = (topleft, topright, buttomleft, buttomright);

///
/// a panel with a smaller panel inside  and a button on the side
///
THidePanel = class(TPanel)
private
{ Private-Deklarationen }
  ///
  /// a smaller working panel
  WorkingPanel: TPanel;
  FLargeHight: Integer;
  FLargeWidth: Integer;
  FActivateButton: TButton;
  FExpandState: Boolean;
  FButtonPosition: TButtonPosition;
  FOnActivateBtnClick: TNotifyEvent;
  procedure SetButtonPosition(const Value: TButtonPosition);
protected
{ Protected-Deklarationen }
public
{ Public-Deklarationen }
  constructor create(aOwner: TComponent); override;
  procedure WMSize(var Msg: TWMSize); message WM_SIZE;
  procedure HideComponents;
  procedure H_ActivateButtonClick(Sender: TObject);
  procedure SetState(astate: Boolean);
  procedure free;
  destructor destroy; override;
published
{ Published-Deklarationen }
  property OnActivateButtonClick: TNotifyEvent read FOnActivateBtnClick
    write FOnActivateBtnClick;
  property ButtonPosition: TButtonPosition read FButtonPosition
    write SetButtonPosition;
end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [THidePanel]);
end;

{ THidePanel }

constructor THidePanel.create(aOwner: TComponent);
begin
  inherited;
  WorkingPanel := TPanel.create(self);
  WorkingPanel.Caption := 'V01';
  FActivateButton := TButton.create(self);
  FActivateButton.Parent := self;
  FActivateButton.Caption := '<';
  FActivateButton.OnClick := H_ActivateButtonClick;
  FActivateButton.Width := BoarderSize;
  FActivateButton.Height := BoarderSize;
  WorkingPanel.Caption := '';
  FLargeWidth := self.Width;
  SetButtonPosition(topright);
end;

destructor THidePanel.destroy;
begin
  inherited;
end;

procedure THidePanel.free;
begin
  inherited;
  WorkingPanel.free;
  FActivateButton.free;
end;

procedure THidePanel.HideComponents;
var
  i: Integer;
begin
  for i := 0 to WorkingPanel.ControlCount - 1 do
    WorkingPanel.Controls[i].Visible := False;
end;

procedure THidePanel.WMSize(var Msg: TWMSize);
begin
   ///  set inner panel size
   WorkingPanel.Top := self.Top + BoarderSize;
   WorkingPanel.Left := self.Left + BoarderSize;
   WorkingPanel.Width := self.Width - 2 * BoarderSize;
   WorkingPanel.Height := self.Height - 2 * BoarderSize;

   ///  move button
  SetButtonPosition(FButtonPosition);
end;

procedure THidePanel.H_ActivateButtonClick(Sender: TObject);
begin
  /// button is clicked!
  ///
  FExpandState := not FExpandState;
  SetState( FExpandState );

  ///
  if (Assigned(FOnActivateBtnClick)) then
    FOnActivateBtnClick(self);
end;

procedure THidePanel.SetButtonPosition(const Value: TButtonPosition);
begin
  FButtonPosition := Value;

  case FButtonPosition of
    topleft:
    begin
      FActivateButton.Left := 0;
      FActivateButton.Top := 0;
    end;

  topright:
  begin
    FActivateButton.Left := self.Width - BoarderSize;
    FActivateButton.Top := 0;
  end;

  buttomleft:
  begin
    FActivateButton.Left := 0;
    FActivateButton.Top := self.ClientWidth - BoarderSize;
  end;

  buttomright:
  begin
    FActivateButton.Top := self.ClientWidth - BoarderSize;
    FActivateButton.Left := self.Width - BoarderSize;
  end;

  else
  /// never go here

  end;
end;

procedure THidePanel.SetState(astate: Boolean);
begin
  if astate then
  begin
    /// ...
    FActivateButton.Caption := '>';
    self.Width :=  BoarderSize;
  end
  else
  begin
    /// ...
    FActivateButton.Caption := '<';
   self.Width := FLargeWidth;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

Moh*_*enB 6

当Control的Anchors设置为alClient时,您无法更改大小.
将第二个面板对齐到alLeftalRight.如果您想要使用此控件填充表单,请设置表单的AutoSizeTrue或手动设置控件的最大大小以调整其大小.