0

ここでコンポーネントを非表示にできるコンポーネントを作成するための多くの助けをすでに見つけました(THIDEPANEL。今、最初の問題に苦しんでいます:

このクラスのイベント中にOnCreate、パネルの幅と高さを取得します。パネルを非表示/非表示にしながら元の値に戻したいです。実際には、非表示プロセスは常にパネルのサイズを縮小します

constructor THidePanel.Create(AOwner: TComponent);
begin
  inherited;

  // The inner panel
  WorkingPanel := TPanel.Create(Self);
  WorkingPanel.Caption := '***';

  // The hide unhide
  FActivateButton := TButton.Create(Self);
  FActivateButton.Parent := self;
  FActivateButton.Caption := '<';
  FActivateButton.OnClick := H_ActivateButtonClick;
  FActivateButton.Width := BoarderSize;
  FActivateButton.Height := BoarderSize;
  WorkingPanel.Caption := '';

  // Grab the size of the hide panel, later restore to this values
  FLargeWidth := Self.Width;
  FLargeHeight := Self.Height;

  SetButtonPosition(TopRight);
end;
4

1 に答える 1

2

これは、FLargeWidthプライベート フィールドに無効な値があるためです。コンストラクター中に割り当てSelf.Widthます(おそらく更新することはありません)。これは、設計時または実行時に設定した幅ではなくTCustomPanel.Create、 からハードコードされた幅であり、185. コントロールのコンストラクターが実行されるとき、コントロールはまだ配置されていないことに注意してください。

設定した幅を覚えておきたい場合は、「オーバーライドTControl.SetWidth」する必要があります。ただし、そのメソッドはプライベート (仮想ではない) であるため、 の変更に応答するには、SetBoundsまたはをオーバーライドする必要があります。おそらく追加の条件付きで、後者を選択します。ResizeWidth

procedure THidePanel.Resize;
begin
  if not HasCustomWidth then  //< Replace this with your own logic condition
    FLargeWidth := Width;
  inherited Resize;
end;
于 2013-04-09T21:38:53.127 に答える