- 締切済み
ウィンドリストの追加について
MDIの子ウィンドウを「閉じる」ボタンが押された時に、CloseingイベントでCancel=Trueにして、再度Showで表示させるようにしているのですが、いったん「閉じる」ボタンで閉じた後、Showすると、ウィンドウリストに子ウィンドウが追加さていません。 どうしたら、ウィンドウリストに追加されるのでしょうか? 最初にShowした時は、追加されているのですが。 宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- redfox63
- ベストアンサー率71% (1325/1856)
item = WindowsMenu.DropDownItems(m) ' 最初のエントリーかをチェック If TypeOf WindowsMenu.DropDownItems(m - 1) Is ToolStripSeparator Then item.Text = "&1" & item.Text.Substring(2) Else item.Text = "&" & (m - 6).ToString & item.Text.Substring(2) End If MainForm側の WindowsMenuのDropDownOpeningの下記の部分に ch.mn = item を追加します MainForm側に Public Sub DeleteWindowsListItem( mn as ToolStripMenu ) for n as Integer = 0 to WindowsMenu.DropDownItems.Count -1 if WindowsMenu.DropDownItems(n).Text.IndexOf(mn.Text.SubString(2)) > -1 then WindowsMenu.DropDownItems.RemoveAt( n ) exit sub end if next End Sub を追加 子フォーム側のClosingまたはClosed if mn IsNot nothing then MainForm.DeleteWindowsListItem( mn ) End if を記述してください Closingイベントの場合は閉じる場合のコード部分に追加します 子フォームをキャンセルした場合に 他のウィンドウにフォーカスが移動する前に『ウィンドウ』メニューを開いた場合 アクセラレータのインデックスがおかしくなるようです
- redfox63
- ベストアンサー率71% (1325/1856)
> If mnu.Text.IndexOf(Me.Text) > -1 Then のどちらが取得不能なのでしょう? mnu.Textなのでしょうか Me.Textなのでしょうか サブフォームのタイトルなら Me.Textですし メニューの項目の文字列なら mnu.Textですが MDIフォームのメニューはスケルトンのままなのでしょうか・・・
- redfox63
- ベストアンサー率71% (1325/1856)
対処療法ですが … SubForm側にToolStripMenuItem型のメンバー変数を用意 # Publicフィールドかプロパティなどで実装 Public mn As ToolStripMenuItem といった具合に追加 SubFormのFormClosingイベントのCancelにする部分で ' MDIFormのメニューから 自分のメニューを探す For Each mnu As ToolStripItem In MainForm.WindowsMenu.DropDownItems If mnu.Text.IndexOf(Me.Text) > -1 Then mn = mnu Exit For End If Next MainForm側の WindowsMenuのDropDownOpeningなどで If MdiChildren.Length > 0 Then For n As Integer = 0 To MdiChildren.Length - 1 ' chの型は適宜修正してください Dim ch As SubForm = MdiChildren(n) If ch.mn IsNot Nothing Then ch.mn.Checked = (ch Is ActiveMdiChild) Dim m As Integer m = WindowsMenu.DropDownItems.Add(ch.mn) Dim item As ToolStripItem item = WindowsMenu.DropDownItems(m) ' 最初のエントリーかをチェック If TypeOf WindowsMenu.DropDownItems(m - 1) Is ToolStripSeparator Then item.Text = "&1" & item.Text.Substring(2) Else item.Text = "&" & (m - 6).ToString & item.Text.Substring(2) End If End If Next End If といった具合で表示できますが、ドロップダウンメニューが更新されないとクローズで追加したメニューの アクセラレータが間違っていることがあります
お礼
回答ありがとうございます。 遅くなって申し訳ありません。 >If mnu.Text.IndexOf(Me.Text) > -1 Then のところで、どうもメニューからウィンドウテキスト名を取得できないようです。 いったんメニューを開いて確認してみたら、ちゃんと表示されてはいるものの、ここではTextを取得できていないようです。 どうしてなのでしょうか?
お礼
すみません。 こちらのミスでした。うまく表示は出来ました。 ですが、ウィンドウを閉じてもウィンドウリストにウィンドウ名が残ったままです。 違うウィンドウを開くと、ウィンドウリストのインデックスが「-2」となって表示されます。