与TSplitter共享表单时,为什么我的尺寸更改控件不起作用? [英] Why doesn't my size-changing control work when it shares a form with a TSplitter?

查看:90
本文介绍了与TSplitter共享表单时,为什么我的尺寸更改控件不起作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个面板控件,允许用户最小化面板并隐藏该面板上的组件。
单个THidePanel似乎可以按预期工作,但是当我将其中两个放在由分隔符分隔的窗体上时却无法正常工作。第一个面板对齐 alLeft ;第二个面板 alClient

I'm writing a panel control that allows the user to mimimize the panel and to hide the components on this panel. A single THidePanel seems to work as expected, but not when I put two of them on a form separated by a splitter. The first panel is aligned alLeft; the second panel alClient:

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

When the second panel's button is clicked, it does not react to minimize or maximize. Here is all of my code. Why doesn't it work?

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;


推荐答案

当Control的锚点设置为 alClient ,您无法更改大小。
将第二个面板对齐设置为 alLeft alRight 。如果要使用此控件填充表单,请设置表单 True AutoSize 或在调整控件大小时手动设置控件的最大大小。

When Control's Anchors set to alClient, you can not change the size .
Set second panel align to alLeft or alRight . if you want fill form with this control, set AutoSize of form True or manually set max size of your control on resize it .

这篇关于与TSplitter共享表单时,为什么我的尺寸更改控件不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆