VS2008(VB.NET)でのフォーム制御で質問です。


まず、前提情報としまして、
  フォームA:メインメニュー
  フォームB:入力画面
  フォームC:検索サブ画面
の構成で、フォームAからフォームBをShow()で開き、フォームBからフォームCをShowDialog()で開いています。

フォームBが画面一杯の大きさの為、フォームBが表示されている時にフォームAを見る(操作する)時は、タスクバー上のフォームAをクリックして最前面にこさせています。


フォームCが表示されている状態で、タスクバー上のフォームAをクリックすると、フォームAが最前面に来てしまいます。(この状態でフォームAは操作不可)

そこで、フォームCを開く.ShowDialog()の直前で、フォームBのOwnerにフォームAをセット(.AddOwnerForm)し、.ShowDialog()の直後で、Owner設定を解除(.RemoveOwnerForm)しましたら、希望通りに近い動作になりました。
しかし、フォームCを閉じた後、タスクバー上のフォームAをクリックしても、フォームAが最前面に来ませんでした。(フォームA自体をクリックすれば最前面に来ます。)


フォームCが表示されている状態で、フォームAが最前面に絶対来ないようにする方法を教えて下さい。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/12/16 11:51:57
  • 終了:2010/12/23 11:55:03

ベストアンサー

id:rsc96074 No.1

rsc回答回数4387ベストアンサー獲得回数4012010/12/16 13:17:19

ポイント35pt

 FormB にて、次のような感じでどうでしょうか。

 私も似たようなを作りましたが、AddOwnerFormなど使いませんでしたが、普通に常にCが上に来ています。

 私は、こちらのをちょっとかえて使いました。VB.NETですが、VB2008でも使えました。

●第6章 検索/置換機能の実装

>[検索]ダイアログボックスを表示する処理 … EditFindプロシージャ

Private Sub EditFind()
    Dim dlgFind As New FindDialog	'FormCに相当
    dlgFind.Owner = Me			'このへんが重要かも!
    dlgFind.StrFind = Me.StrFind	'ここは不要
    dlgFind.Show()
End Sub

http://msdn.microsoft.com/ja-jp/library/Dd297769.aspx#hitme_VBNE...

 こちらから、2010ですが、サンプルファイルが手に入るようです。

●ひと目でわかるMicrosoft Visual Basic 2010 アプリケーション開発入門

http://ec.nikkeibp.co.jp/item/books/P94290.html

http://ec.nikkeibp.co.jp/nsp/dl/09429/index.shtml

id:sanyozora

御回答有難う御座います。

フォームCは処理の都合で、ShowDialog()開く必要があります。

試しに、フォームCを開くShowDialog()の前に、Owner = Meを入れてみましたが、現象は変わりませんでした。

2010/12/16 14:06:22

その他の回答(1件)

id:rsc96074 No.1

rsc回答回数4387ベストアンサー獲得回数4012010/12/16 13:17:19ここでベストアンサー

ポイント35pt

 FormB にて、次のような感じでどうでしょうか。

 私も似たようなを作りましたが、AddOwnerFormなど使いませんでしたが、普通に常にCが上に来ています。

 私は、こちらのをちょっとかえて使いました。VB.NETですが、VB2008でも使えました。

●第6章 検索/置換機能の実装

>[検索]ダイアログボックスを表示する処理 … EditFindプロシージャ

Private Sub EditFind()
    Dim dlgFind As New FindDialog	'FormCに相当
    dlgFind.Owner = Me			'このへんが重要かも!
    dlgFind.StrFind = Me.StrFind	'ここは不要
    dlgFind.Show()
End Sub

http://msdn.microsoft.com/ja-jp/library/Dd297769.aspx#hitme_VBNE...

 こちらから、2010ですが、サンプルファイルが手に入るようです。

●ひと目でわかるMicrosoft Visual Basic 2010 アプリケーション開発入門

http://ec.nikkeibp.co.jp/item/books/P94290.html

http://ec.nikkeibp.co.jp/nsp/dl/09429/index.shtml

id:sanyozora

御回答有難う御座います。

フォームCは処理の都合で、ShowDialog()開く必要があります。

試しに、フォームCを開くShowDialog()の前に、Owner = Meを入れてみましたが、現象は変わりませんでした。

2010/12/16 14:06:22
id:SweetSmile1978 No.2

SweetSmile1978回答回数189ベストアンサー獲得回数292010/12/16 19:56:11

ポイント35pt

フォームCを開く ShowDialog()の手前で

フォームAを非表示にし、ShowDialog() から返ってきたら

フォームAを表示するって感じですかねぇ。

タスクバー上でのAとBの位置が変わってしまうと思いますが…。

id:sanyozora

御回答有難う御座います。

解決出来ない場合は、フォームAを非表示にして逃げようかと考えております。

出来れば、非表示にせずに解決できればと考えております。

2010/12/17 11:24:22
  • id:taknt
    フォームCが表示されている状態で、フォームAが最前にこないようにするならば
    非表示にしちゃえばいいだけかと思いますが・・・。

    どっちにしろ フォームCに隠れて見えないわけなんですから。
  • id:rsc96074
     他にもいろいろ手はあると思いますが、こういうのもあるようです。
    ●フォームを常に最前面に表示する
    http://jeanne.wankuma.com/tips/vb.net/form/topmost.html
    ●フォームを常に手前にする
    http://dobon.net/vb/dotnet/form/topmost.html
  • id:sanyozora
    to takntさん
    コメント有難う御座います。
    私も非表示は考えたのですが・・・手段が無ければ非表示で逃げようかなと思っています。

    to rsc96074さん
    コメント有難う御座います。
    ShoDialogの直前にフォームC.TopMost = Trueを入れてみました。
    フォームCが表示されている時に、タスクバー上のフォームAをクリックすると、見た目はそのまま(フォームCが一番上)ですが、フォーカスがフォームAに行ってしまうようです。
    一歩前進できた気がします。
  • id:rsc96074
     ひと目でわかるの2008のですが、本を読んでみました。どうも本質は、プロパティの設定でTopMostをTrueにしていることのようでした。(^_^;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません