none
特定の設定をしたPanelを持つFormを継承すると、画面からボタンが消える。 RRS feed

  • 質問


  • Windowsフォームアプリケーションの開発で、フォームを継承したフォームのボタンが表示されない現象を確認しました。

    試した環境は以下です。
        Windows Server 2016, Visual Studio 2017 Professional
        
    現象の確認手順です。

        1. プロジェクトへwindows フォーム追加(便宜上、BaseForm)
        2. BaseFormへPanelを追加し、プロパティ「Modifers」を「Freinds」、「Dock」を「Top」と設定
        3. そのパネルへButtonを追加し、「Modifers」を「Protected」、「Anchor」を「Top Right」と設定
        4. プロジェクトへ新たにwindows フォーム追加(便宜上、Form1)
        5. Form1にBaseFormを継承させ、WidthをBaseFormより大きく設定
        6. スタートアップフォームをForm1に設定
        
        デバッグして表示されるForm1に、ボタンが表示されないことを確認できます。 ※デザインには表示されています。
        これは禁じ手なのでしょうか?

    2017年12月10日 3:50

すべての返信

  • 『プロパティ「Modifers」を「Freinds」』他のに変えたらどうなりますか?
    "Protected"など(VBは使ったことがないけど)
    2017年12月10日 6:45
  • 個人的な印象ですが、継承フォーム、継承ユーザーコントロールは多用しない方が良いです。

    今回の事例だと、Button1 がまず Form2 レイアウト時の Location に設定され、次に Form が広げられるようなコードが生成されます。
    このコードだと、Form1 と同じサイズの時点で Button1 が右が面外に消え、その後、Form2 の幅に広げられるため、さらに画面外に消えるという動きになります。

    ゆえに、Modifieres = Protected、Anchor = Right(や Bottom)、継承フォームという3つの条件が成り立つ限り、やりたいことはできないと言うことになります。
    (Designer.vb を書き換えれば一時的に解決できますが、フォームを少し触るだけで元に戻るので、事実上できないと表現しました)

    'メモ: 以下のプロシージャは Windows フォーム デザイナーで必要です。
    'Windows フォーム デザイナーを使用して変更できます。  
    'コード エディターを使って変更しないでください。
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(450, 33)
        '
        'Form2
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
        Me.ClientSize = New System.Drawing.Size(698, 261)
        Me.Name = "Form2"
        Me.ResumeLayout(False)
    
    End Sub

    2017年12月10日 7:21
    モデレータ
  • 返信ありがとうございます。

    >『プロパティ「Modifers」を「Freinds」』他のに変えたらどうなりますか?
    >"Protected"など(VBは使ったことがないけど)

    その場合は発生しなかったように思います。

    また、パネルを使用しない場合は発生しませんでした。

    2017年12月11日 13:29
  • 返信ありがとうございます。

    勉強になりました。継承フォームはしようしないように実装したいと思います。

    2017年12月11日 13:32