DOBON.NETプログラミング道掲示板
(現在 過去ログ1 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33069 / inTopicNo.1)  MDI子フォームのMeってどれ?
  
□投稿者/ よっし〜 一般人(2回)-(2015/08/05(Wed) 10:45:46)
  • アイコン環境/言語:[Windows 7 SP1 X86 / VB.NET2013 / Framework4.0] 
    分類:[.NET] 

    よっし〜と申します。御世話様です。

    現在MDIアプリケーションを作成中なのですが、1つ分からない事(私の認識間違い?)が出てきましたので、お教えください。
    下記の通り親フォームから子フォームを呼び出して、呼び出されたフォームを最大化にしております。
    最後フォーム(Form1)を閉じる際に「 Me.WindowState = FormWindowState.Normal」は必要ないのでしょうが、配布したExeを実行しフォームを閉じる際に
    たまに「Cannot access a disposed object. Object name: 'Icon'.」のエラーが発生します。
    ネットで情報を検索し(https://www.devexpress.com/Support/Center/Question/Details/Q319784)、FormClosingに「Me.WindowState = FormWindowState.Normal」
    を入れれば?なる情報を見つけました
    確かにフォームを閉じる際にエラーは出なく(?)なったのですが、複数表示した内の1つのFormを閉じる際、残り全ての子フォームが「Normal」になってしまいます。
    ここから質問ですが、「Me.WindowState = FormWindowState.Normal」の「Me」って個々のフォーム(Form1)を指し示すのでは無いのでしょうか?
    全てのForm1を指すのでしょうか?親で「New Form1」と新規に起こしておりますので、個々との認識としておりました。
    ※実際の作成アプリはForm2であってもForm2とForm1もNormalになってしまいます。

    以上、お忙しいとは思いますが、宜しくお教えください。

    ●親フォーム
    Public Class MDIParent1
    Private Sub ShowNewForm(ByVal sender As Object, ByVal e As EventArgs) Handles NewToolStripMenuItem.Click, NewToolStripButton.Click, NewWindowToolStripMenuItem.Click
    Dim ChildForm As New Form1
    ChildForm.MdiParent = Me
    ChildForm.Show()
    End Sub
    End Class
    ●子フォーム
    Public Class Form1
    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    Me.WindowState = FormWindowState.Normal
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    Me.WindowState = FormWindowState.Maximized
    End Sub
    End Class

引用返信 削除キー/
■33070 / inTopicNo.2)  Re[1]: MDI子フォームのMeってどれ?
□投稿者/ Hongliang 大御所(502回)-(2015/08/05(Wed) 11:37:01)
  • アイコンMeの指す範囲とは無関係の話ですね。
    MDI子フォーム間で最大化されているかそうでないかが共有されるのはWindowsの仕様です。
    ExcelとかのMDIアプリケーションで動作を見てみると分かります。
引用返信 削除キー/
■33072 / inTopicNo.3)  Re[2]: MDI子フォームのMeってどれ?
□投稿者/ よっし〜 一般人(4回)-(2015/08/05(Wed) 13:57:13)
  • アイコンHongliangさん、早速のレス、有り難うございます。

    No33070に返信(Hongliangさんの記事)
    > Meの指す範囲とは無関係の話ですね。
    > MDI子フォーム間で最大化されているかそうでないかが共有されるのはWindowsの仕様です。

    すいません。あまり理解が出来ていませんが、フォームの大きさに関しては「Me」で自フォームを指すって
    ことでは無いのでしょうか??
    確かに・・
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.BackColor = Color.Red
    End Sub
    で個別のBackColorは変更可能ですね。
    先のソースの通り、自フォームだけをNormalにする事は可能でしょうか??
    以上、何度も申し訳ございませんが、宜しくお願いいたします。

引用返信 削除キー/
■33073 / inTopicNo.4)  Re[3]: MDI子フォームのMeってどれ?
□投稿者/ Hongliang 大御所(503回)-(2015/08/05(Wed) 14:13:00)
  • アイコン> すいません。あまり理解が出来ていませんが、フォームの大きさに関しては「Me」で自フォームを指すって
    > ことでは無いのでしょうか??
    MDIの子フォームは、
    ・すべてのフォームが最大化
    ・すべてのフォームが通常または最小化
    のどちらかの状態しか取りません。
    ですので、どれか一つのフォームの最大化を解除して通常状態に戻したら、「システムが勝手に」他のフォームの最大化状態も解除します。
    逆も同じで、どれか一つのフォームを最大化すれば、「システムが勝手に」他のフォームも最大化します。

    > 先のソースの通り、自フォームだけをNormalにする事は可能でしょうか??
    ですので不可能ですね。
    まあ、そもそもすでにそのフォームは閉じようとしてるんだから、敢えて変更する必要もないですよね。
引用返信 削除キー/
■33074 / inTopicNo.5)  Re[1]: MDI子フォームのMeってどれ?
□投稿者/ shu 大御所(466回)-(2015/08/05(Wed) 15:00:21)
  • アイコン
    No33069に返信(よっし〜さんの記事)
    
    既に回答があるように閉じているFormに対しWindowState=Normalは
    意味がないです。
    
    以下のようにすればアクティブになったMdiChildを最大化することは出来ます。
    Public Class Form1
    
        Private Sub ToolStripButton1_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripButton1.Click
            Dim aFrm As New Form2()
            aFrm.MdiParent = Me
            AddHandler aFrm.FormClosed, AddressOf ChildClosed
            aFrm.Show()
        End Sub
    
        Private Sub ChildClosed(sender As Object, e As EventArgs)
            If Me.MdiChildren.Count > 0 Then
                Me.ActiveMdiChild.WindowState = FormWindowState.Maximized
            End If
        End Sub
    
    End Class

引用返信 削除キー/
■33076 / inTopicNo.6)  Re[2]: MDI子フォームのMeってどれ?
□投稿者/ よっし〜 一般人(6回)-(2015/08/05(Wed) 15:20:24)
  • アイコンHongliangさん、shuさん 有り難うございます。

    >どれか一つのフォームの最大化を解除して通常状態に戻したら、「システムが勝手に」他のフォームの最大化状態も解除します。
    なるほど。よく分かりました。

    > 既に回答があるように閉じているFormに対しWindowState=Normalは意味がないです。
    本来ならそうなのですが、先に私が投稿した様に「「Cannot access a disposed object」のエラー対策として、
    動作としては無意味とは思うのですが、入れております。

    他の手を考えることにします。どうも、有り難うございました。


解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -