• ベストアンサー

MDIでフォームがアクティブにならない

VB2008です。 MDIフォーム中にForm1とForm2があります。 Form1がアクティブです。 Form2をクリックしてもアクティブになりません。ただしタイトルバーをクリックするとアクティブになります。 これは言語の仕様でしょうか。市販のアプリケーションでは、タイトルバー以外の場所をクリックしてもアクティブになるものがほとんどですが、VB2008ではどのようにすれば実現できるのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どのようなコードをお書きなのでしょう # 当方の環境はVB2005ですが以下の手順ではどこをクリックしても # 切り替え可能です 単純にIsMdiContainer=True にした MainForm プロジェクトに追加した Form1,Form2 があると仮定して MainFormのクラス変数として dim fm1 as Form1, fm2 as Form2 を定義 Loadイベントで fm1 = New Form1() fm2 = New Form2() fm1.MdiParent = Me fm2.MdiParent = Me fm1.Show() fm2.Show() を記述しただけのプロジェクトですと Form1,Form2どこをクリックしてもアクティブフォームは切り替わりますよ 他人が検証できる 最低の手順の公開か、必要最小限のコードを提示してみましょう

xiaolong_goo
質問者

補足

お返事ありがとうございます。 わかりにくい質問でごめんなさい。 今は、3つのフォームに以下のコードがあります。 MDIフォーム: Private Sub MDIParent1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Form1.Show() Form2.Show() End Sub フォーム1: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.MdiParent = MDIParent1 End Sub フォーム2: Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.MdiParent = MDIParent1 End Sub ご回答いただいた方法ではできました。 インスタンスを作成しない場合は、やはり無理なのでしょうか。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

インスタンスを作成してお使いになることをお勧めします MDIParentのLoadイベントで Form1.MdiParent = Me Form2.MdiParent = Me Form1.Show() Form2.Show() といった具合にしてやれば切り替えは可能になります … お勧めはしませんが

関連するQ&A

  • MDIフォームでのモーダル

    こんにちわ。 visualstudio2005(vb.net)で開発を行っています。 MDIフォームを使ってシステムを作成しています。 親フォームの中にフォーム1を表示させそのフォーム1からボタンを押すとフォーム2が表示されるという仕様です。 希望としてはフォーム2を起動中はフォーム1は利用不可にしたい(モーダルのような感じで表示させたい)のですが、MDIではShowDialogは無理なようです。 MDIフォームでこういったことを実現するのは無理なのでしょうか? (VisualStudioの[ツール]-[オプション]の画面を参考に見てもモーダルのフォームはMDIから外れたエリアで表示されている気がします。) 解決策や代替の手段等ありましたらおしえていただけませんでしょうか? お忙しいところ大変申し訳ありませんがよろしくお願いいたします。

  • VB6のMDIフォームの最前面表示

    VB6.0のMDIフォーム内の複数フォームの中で、特定のフォームを最前面にしたいのですが、可能でしょうか? もし、可能でしたら、実現方法をご教授くださいませ。

  • MDIフォームのメニュー構成

    開発言語: VB.net 開発環境: VisualStudio2005 .NET FrameWork: 2.0 現在、VB.netにてクライアント/サーバ形式のシステムの構築を行っているのですがメニュー画面の構築でお客様から以下の要望があがりました。 1. 画面左側にツリービューのメニューを表示し、右側に実画面を配置する。 2. ツリービューのメニューをクリックすると該当機能が起動すること(機能の切り替えがツリービューから行えること)。 3. メインのウインドウとしては1枚で行うこと。 WEBでのフレームを切った画面構成やVisualStudioの[ツール]-[オプション]画面のような構成をイメージされているようです。 クライアント/サーバシステムではご要望の形式は難しいとは思うのですが実現できるかどうかの評価を行っています。 現在、自分が考えている構想は以下の通りです。 ・MDIフォームを使用する ・MDI親フォーム左側にツリービューコントロールを配置する。 ・ツリービューから機能をクリックされた場合、子フォームとして表示する。 実際にテストしてみたのですが、ツリービューコントロールを配置し、クリックによって子フォームを開くところまでは成功しました。 しかし、表示したフォームがツリビューコントロールの下にもぐってしまいます。表示位置の指定もできましたが最大化されると同じことが 発生すると思います。こういう場合は親フォームにメニューバーを使用するしか手はないのでしょうか? 個人的には非常に複雑になるので要望の取り下げ依頼も必要かなと思っているのですがクライアント/サーバ形式でこういう機能を実現された方いらっしゃいましたらお教えください。 まったく別の方法で実現された方の意見等もお聞かせいただけるとありがたいです。 以上、宜しくお願い致します。

  • MDI親フォームでのキー入力監視

    はじめまして。 VB6.0 SP5で開発を行っております。 子フォームが開いていない状態のMDI親フォームで、F1~F12のファンクションキーを押下したら、それぞれ対応した子フォームが開くようにしたいのですが、MDI親フォームでは、KeyUpやKeyDownのイベントが発生しないため、キー入力監視ができません。 上記のような事を実現させるためには、どのようにすればよろしいのでしょうか。 MDI親フォームには、PictureBoxを貼りその中にボタンを設置して、マウスクリックでも子フォームを開くようにしています。PictureBoxでKeyイベントを取得しようとしましたが、ボタンをクリックして、子フォームを開き、その子フォームを閉じた後(子フォームのUnLoadイベント内で親フォームのPictureBoxにSetFocusしています)、フォーカスがどこかへ行ってしまい、イベントがとれません。 常に、子フォームを開いている状態で、子フォームでKeyイベントを取得するしかないのでしょうか。その場合、子フォームを閉じた時に、別のフォーム(Keyイベント取得用フォーム)を自動的に開く方法はありますでしょうか。 長文となり申し訳ありません。 ご教授の程、よろしくお願い致します。 開発環境  OS:WindowsXP SP3  言語:VisualBasic6.0 SP5

  • MDIの親フォームから子フォームの操作

    VB2010のMDIの親フォームからの操作に関してです。 MDIで設定された親フォームのMenuStripから子フォームのTextBox1のTextの値をMsgBoxで取得したいのです 出来る事なのかどうか分からないですが、初歩的な質問でご迷惑をお掛けします・・・

  • MDI アプリケーションで

     VBの、アプリケーションウィザードでMDIテキストエディタが作れますよね。  それをいじってMDIの勉強してるんですが、今はそこで終了時に編集していながらまだ保存していないフォームを探して、コモンダイアログを表示させて保存させようとしています。  しかし、どうすればいいのか分かりません。  はじめは、フォームのキャプションかどこかに編集した印でも付けて、Formsを使ってそれを判断させようとも思ったのですが、開発途中で子フォームがもう一つ出来てしまい、それとごちゃごちゃになってしまう可能性が出てきました。  何とか、テキスト編集用の子フォームのみを判断させたいのですが、上手く出来ないものでしょうか。  特定の子フォームの数や番号を特定できるコマンドとかってVBにあるんですかね。あれば出来そうなんですが……何か良い方法があればお教えください。 ------------------- 開発環境 VB6.0(SP5) WIN2000

  • MDI親フォームで子フォーム開放を知る

    はじめまして。VB.NET2005でプログラミングをしている初心者です。 MDIフォームのAPを作成しています。 MDI親フォーム1つと子フォームが2つあるとします。 親フォームから子フォーム2つをShowします。 子フォーム1を閉じたときに、親フォーム内で子フォーム1が閉じられた事を知るすべは無いのでしょうか。 親フォーム内で起こるイベントでどの子フォームが閉じられたかを得たいと思っています。 どなたか分かる方いらっしゃいましたらご教授ください。 宜しくお願い致します。

  • VB2010でMDI親フォームから子フォームを表示

    VB2010でソフトを作っております。 MDI親フォームから子フォームを表示させたいのですが…。 過去に少しだけVB6を使っていたことがありますが、クラスという概念に苦労しております インスタンスや初期化といったところをうまく扱えばとは思うのですが、よろしくご指導お願いいたします。 1.MDI親フォーム(Form1)のボタンを押し、子フォーム(Form2)を表示させる 2.子フォームが表示されていなかったら表示させる 3.子フォームが表示されていたら何もしない これだけの事ですがずいぶん悩んでおります。 全コードがこれです。 Public Class Form1 Private f2 As New Form2 Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IsMdiContainer = True End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim fChild As Form() = Me.MdiChildren For Each f As Form In fChild If f.Text = "Form2" Then Exit Sub End If Next f2 = New Form2 f2.MdiParent = Me f2.Show() f2.Activate() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If f2 Is Nothing OrElse f2.IsDisposed Then f2 = New Form2 f2.MdiParent = Me End If f2.Show() f2.Activate() End Sub End Class ボタン1でもボタン2でも、期待する動作はするのですが、 ボタン1ではアクティブになっているフォームの名前を力技で取得している気がして… ボタン2では子フォーム(Form2)をすでに表示している状態でもさらにShowをしているのが気に入らなくて… もっとスマートな方法がありましたら、ご指導お願いします。

  • MDIフォームとユーザコントロール

    VB.Netでの質問です。 ウィンドウメッセージを受け取りイベントを起こすユーザーコントロールクラス Class UserCtl Private Event MyKeyDown() Private Sub UserCtl_KeyDown() as Handels MyBase.KeyDown RaiseEvent MyKeyDown End Sub End Class プロセスA MDI子フォームにユーザーコントロールを追加し、子フォームにて、UserCtl.MyKeyDownイベントプロシージャでユーザーコントロールがウィンドウメッセージを受け取ったと認識し処理をします。 MDI子フォームはMDI親フォームより、CloseメソッドでしかCloseしません。 プロセスB FindWindowでMDI親フォーム, FindWindowExでMDI子フォーム、ユーザーコントロールハンドルを確認した上で、ユーザーコントロールにウィンドウメッセージをPostMessageします。 質問1 プロセスBからハンドルを探していますが、ウィンドウハンドル,ユーザーコントロールハンドルはいつまで有効なハンドルなのでしょうか? Closeでしょうか、それとも、Disposeでしょうか? 質問2 MDI親フォームでMDI子フォームをCloseした後でも、UserCtl.MyKeyDownは発生できるものなのでしょうか? 質問3 ユーザーコントロールで親フォーム(MDI子フォーム)がCloseされた事を認識する方法はないでしょうか? Me.Parent.IsDisposeでできるかなぁと考えているのですが。 よろしくお願いいたします。

  • MDIで、子フォームのみWPF

    winformで作ったアプリケーションに、MDIの導入を考えています。と同時にWPFにも興味があるのですが、MDIで作られる子フォームのみWPFにすることは可能でしょうか? 親winform⇒子winformの場合 //Form4はwindowsform Form4 childform = new Form4(); childform.MdiParent = this; childform.Show(); このように書いています。 それを 親winform⇒子WPFで //UserControl1はユーザーコントロールWPF UserControl1 childform = new UserControl1(); childform.MdiParent = this; childform.Show(); このように書いてみたのですが、エラーで使えませんでした。 MdiParentとShowに赤い線が引かれ、 自動機能で MdiParentには public Form1 MdiParent { get; set; } Showには internal void Show(){ throw new NotImplementedException(); } が、作られましたが解決には至りませんでした。 環境はvisualstdio2013でC#です。 そもそも子formのみWPFは可能なのでしょうか? 可能であれば、方法を教えてください。

専門家に質問してみよう