6

含まれているのは、私の問題を示す小さなプロジェクトです。私はTPageControlメインフォームに合わせています。2つのタブシートのそれぞれに、パネルのクライアントを揃えています。これらの各パネルには、2つのサブパネルとスプリッターがあります。LHパネルとスプリッターは左に配置され、RHパネルはクライアントに配置されます。

基本的に、問題は2つのタブ間の相互作用です。実証するために:

  • プログラムを実行する
  • メインフォームを水平に伸ばします。パネル3は成長します
  • スプリッターを右端まで移動します。パネル2は拡大し、パネル3は10ピクセルの最小幅の制約まで縮小します。
  • タブシート2を選択します。パネル5は設計どおりで、メインフォームが引き伸ばされたときにパネル6が大きくなりました。
  • メインフォームの幅を元の幅に減らします。パネル6の収縮が大きすぎる(望ましくない)
  • タブシート1をクリックします。メインフォームの幅が再び大きくなります(望ましくありません)

OK、動作はおそらく整列されたパネルのルールの観点から説明できますが、誰かが操作の改善を提案できますか?

unit Unit17;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls;

type
  TForm17 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Panel1: TPanel;
    Panel2: TPanel;
    Splitter1: TSplitter;
    Panel3: TPanel;
    Panel4: TPanel;
    Splitter2: TSplitter;
    Panel5: TPanel;
    Panel6: TPanel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form17: TForm17;

implementation

{$R *.dfm}

end.


object Form17: TForm17
  Left = 0
  Top = 0
  Caption = 'Form17'
  ClientHeight = 254
  ClientWidth = 314
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object PageControl1: TPageControl
    Left = 0
    Top = 0
    Width = 314
    Height = 254
    ActivePage = TabSheet1
    Align = alClient
    Constraints.MinWidth = 30
    TabOrder = 0
    ExplicitWidth = 480
    object TabSheet1: TTabSheet
      Caption = 'TabSheet1'
      ExplicitWidth = 281
      ExplicitHeight = 165
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 306
        Height = 226
        Align = alClient
        Caption = 'Panel1'
        TabOrder = 0
        ExplicitWidth = 109
        ExplicitHeight = 165
        object Splitter1: TSplitter
          Left = 151
          Top = 1
          Width = 12
          Height = 224
          ExplicitLeft = 145
        end
        object Panel2: TPanel
          Left = 1
          Top = 1
          Width = 150
          Height = 224
          Align = alLeft
          Caption = 'Panel2'
          Constraints.MinWidth = 10
          TabOrder = 0
        end
        object Panel3: TPanel
          Left = 163
          Top = 1
          Width = 142
          Height = 224
          Align = alClient
          Caption = 'Panel3'
          Constraints.MinWidth = 10
          TabOrder = 1
          ExplicitLeft = 141
          ExplicitWidth = 330
        end
      end
    end
    object TabSheet2: TTabSheet
      Caption = 'TabSheet2'
      ImageIndex = 1
      ExplicitWidth = 281
      ExplicitHeight = 165
      object Panel4: TPanel
        Left = 0
        Top = 0
        Width = 306
        Height = 226
        Align = alClient
        Caption = 'Panel4'
        TabOrder = 0
        ExplicitWidth = 109
        ExplicitHeight = 165
        object Splitter2: TSplitter
          Left = 149
          Top = 1
          Width = 11
          Height = 224
          ExplicitLeft = 141
        end
        object Panel5: TPanel
          Left = 1
          Top = 1
          Width = 148
          Height = 224
          Align = alLeft
          Caption = 'Panel5'
          Constraints.MinWidth = 10
          TabOrder = 0
        end
        object Panel6: TPanel
          Left = 160
          Top = 1
          Width = 145
          Height = 224
          Align = alClient
          Caption = 'Panel6'
          Constraints.MinWidth = 10
          TabOrder = 1
          ExplicitLeft = 141
          ExplicitWidth = 139
          ExplicitHeight = 163
        end
      end
    end
  end
end 
4

4 に答える 4

4

MinWidth期待される動作を得るには、パネルから制約()を削除します。スプリッターの「30」(デフォルト、保存されていない)であるため、これらの設定は現在無効です。MinSize

編集(コメントへの応答):スプリッターの右側にあるコントロールの「MinWidth」制約が左側のコントロールのサイズを調整することは期待できません。これは論理的なことであり、制約は設定したコントロールのプロパティです。達成できるのは、コントロールがすでに「最小幅」にある場合、フォームが縮小を拒否することです。したがって、タブを切り替えるとフォームが大きくなるという望ましくない動作が見られます。マージャンが答えで言ったように、あなたが望むことは、コードと関係があります。これを実現するには、複数の方法が必要です。たとえば、Panel3の「OnCanResize」イベントに以下を追加します。

procedure TForm1.Panel3CanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  if NewWidth < Splitter1.MinSize then
    Panel2.Width := Panel2.Width - Splitter1.MinSize + NewWidth;
end;
于 2011-01-29T13:00:45.987 に答える
2

必ずしも本当の答えではありませんが、いくつかの意見があります。

  • 左揃えのスプリッターの最小サイズは、スプリッターの左右のコントロールに関係します。Panel 6は、実際には、スプリッターのMinSize(30)ではなく、独自のminWidth(10)に(わずかに大きい)サイズ変更されています。パネル2、3、5、6のそれぞれに2つの左揃えのパネルを追加し、幅を10と20にし、色を変えることで、これをより簡単に示すことができます。

  • メインフォームの幅を縮小した後でもう一度タブシートを選択すると、メインフォームが拡大し(yikes)、Panel3もスプリッターのminSizeではなく最小幅に縮小されたことを示します。

メインフォームのサイズ変更の解決策は?Dunnoですが、パネルの最小幅がスプリッターの最小サイズと同期していることを確認すると、縮小が解消されます。そしてSertacが言うように、私はあなたが単にどちらか一方を選ぶ必要があるのではないかと思いますが、両方ではありません...

アップデート:

  • スプリッターのminSizeを30に設定し、パネルのminWidthを0に設定します。メインフォームのサイズ変更は削除されますが、右側のパネルの幅は0になります。

  • スプリッターのminSizeを30に設定し、パネルのminWidthを30に設定すると、最小幅の問題が解消されますが、メインフォームのサイズは変更されます。

  • パネルのminWidthを30に設定し、スプリッターのminSizeを1(最小)に設定すると、スプリッターを右端まで移動し、スプリッターを離したときにパネルのminWidthによってメインフォームのサイズを変更できます。Panel6が30未満に減少するのを防ぎますが、タブ1を再度選択すると、メインフォームのサイズが変更されます。

最善の策は、スプリッターのminSizeに依存し、右端に到達したときのスプリッターの動きを制限することにより、右側のパネルが遠くまで縮小するのを「手動で」防ぐことです。これは、スプリッターのOnCanResizeイベントで実行できます。

ところで、D2009を使用

于 2011-01-29T13:03:04.533 に答える
1
void __fastcall TFMain::SplitterCanResize(TObject *Sender, int &NewSize, bool &Accept)
{
    TSplitter *S = (TSplitter*) Sender;
    for (int i = 0; Accept && i < S->Parent->ControlCount; i++)
        if (S->Parent->Controls[i]->Constraints->MaxHeight && S->Parent->Controls[i]->Align == S->Align && NewSize >= S->Parent->Controls[i]->Constraints->MaxHeight *2)
            Accept = false;
}
于 2012-05-26T06:01:05.477 に答える
0

フォームの幅が広いときにスプリッターを右端に移動してからフォームの幅を狭くして左側のパネルよりも狭くした場合(したがって、スプリッターがフォームの「外側」にあることに気付いた場合)、フォームの動作はどうなりますか?この場合になりますか?あなたは望ましい行動の基準について尋ねられましたが、これまでのところあなたの答えで私が見ることができるのは、望ましくない行動についてのあなたの理解だけです

今、私は、パネルとスプリッターが付いているフォームのサイズを変更することで発生する可能性のある副作用について、何度か心配しています。私はそれについてあまり調査しなかったので、特にあなたの状況のように自動サイズ変更の効果についてこれまで知りませんでした。とにかく、可能性のある動作のアーティファクトのほとんど(存在しない場合)を防ぐために、のTScrollBox代わりにパネルとスプリッターの親コントロールとして使用することを検討しましたTPanel

これにより、フォームのサイズ変更がスクロールボックスのクライアント領域のサイズ変更に変わると思います。これは、あなたのようにタブシートを使用した場合、スプリッターを使用した私の小さなプロジェクトでは問題なく機能します。しかし、私はあなたの事件について知ることができません。そして、これはあなたの問題の解決策というよりも回避策であると私は理解しています。

于 2011-01-30T19:55:36.030 に答える