Formを最前に出すには?

解決


hoei  2005-04-20 06:28:41  No: 121073

Form1から、Form2.Show でForm2を開いたとき、Form2をアクティブにさせるにはどうしたらよいでしょうか?Form1がアクティブのままでForm2が隠れてしまいます。至極単純なプロパティの設定なのでしょうけど。お願いします。


ガッ  2005-04-20 06:39:50  No: 121074

とりあえず、Form2をShowする前に、Form1をShowしてみてください。
'Form1.frm
Private Sub Form_Load()
Me.Show
Form2.Show
End Sub

※…汚いコードやなぁ…


特攻隊長まるるう  2005-04-20 19:09:54  No: 121075

>至極単純なプロパティの設定なのでしょうけど。
本当にそう思ってるなら、そんなすぐ調べられるような事を
質問して誰かに回答させよう→自分が調べるのが面倒だから
誰かを手足のように使おう…という意味に取れますが?。
気を使ってるつもりかもしれませんが、ボクには上のような
意味で伝わりました。理解できてないなら下手な言葉は蛇足
です。簡単だと思うなら自分で調べて下さい。

実際問題、[VB.NET]であればフォームの .TopMost プロパティ
を設定すれば他のウィンドウも含めた中で最前面に出てきます。
ただし、[VB6.0]ではありません。場合によっては API を使う
必要があるかもしれません。フォアグランドウィンドウの制御が
関係してるならOSも関係してます。

ただ、今回の場合、Form1 から、Form2 という事ですので同じ
アプリケーション内での問題です。しかし、こちらの環境では、
デフォルト設定で Form1 から、Form2 を表示しても Form2 が
隠れることなく最前面に出てきます。何か特殊な処理を行って
いませんか?(既にロードしたフォームを非表示にしてるとか、
他のフォーム(Form3)を表示してるとか、API を使ってるとか…)

ガッ さんの回答通りでも解決するかもしれませんが、hoei さんが
思っている以上に根が深い問題かもしれません。解決しない場合は
VBのバージョン、実行環境のOSのバージョン、現象を再現できる
最小限のコード…など必要な情報を提供して下さい。(本来、こう
いった情報は技術系掲示板で質問する上で必須項目です。下手な
気を使う前に十分な情報を提供できるよう心掛けて下さい。)


じゃんぬねっと  URL  2005-04-20 19:14:10  No: 121076

こんにちは、じゃんぬ です。

> Form1から、Form2.Show でForm2を開いたとき、
> Form2をアクティブにさせるにはどうしたらよいでしょうか

まるるう さんが仰ってるように、普通ならそうなります。
まず、何故そうならないのかを究明するのが先ですね。


ねろ  2005-04-20 20:05:14  No: 121077

ガッさんの回答の中に原因と、対策が含まれているように思いますが。
一ひねりして、Form2の Form_Load()の中で
Private Sub Form_Load()
    Form1.Show
End Sub
てのはどうでしょうか。
原因がわかるか一層なぞが深まるかは、質問者の努力と言うことで。


特攻隊長まるるう  2005-04-20 20:52:43  No: 121078

ああ、そっかΣ(‾□‾)難しく考えすぎてた(汗)
ロードイベントで呼んでるのね。過去ログにロード
イベントでフォーカスが当らないってのとかも
あって回答してたのにサッパリ失念。
表示順を考えたら当然の結果だったのね…。


hoei  2005-04-20 22:50:48  No: 121079

皆様、ご返答ありがとうございます。特攻隊長まるるうさんのおっしゃることは尤もです。ただ手足に使う、などとはめっそうもなく他に調べる術もなくお願いしました。答えを聞いてみれば意外と単純な原因なのだろうかと予測していたのですが、そうではなかったのですね。
原因が分かりました。外部のActiveXコントロールに含まれるイベントでForm2.Showを実行した時がダメで、Command1_Click()イベントでは問題ありません。コントロールの問題かと思うのでベンダーの方に問い合わせてみます。

もし、他に強引にForm2をアクティブにさせる方法があれば教えてください。
上記の方法は全て試しましたがダメでした。
Form1側のイベントに問題があるようなので、Form2の
Private Sub Form_Load()
で強制的にアクティブにさせる方法があれば回避できると思うのですが。

環境は、VB6 SP5 Win2000 sp4  です。


ねろ  2005-04-20 23:27:07  No: 121080

あらー!
ガッさん,ねろ  <-  誤爆
特攻隊長まるるうさん  <- 謝  orz

取りあえずForm2側で
Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
    ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
    ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const NO_SIZE = &H1              'サイズを設定しない
Private Const NO_MOVE = &H2              '位置を設定しない
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOSIZE = &H1
Private Const HWND_NOTOPMOST = -2
Private Const HWND_TOPMOST = -1

Private Sub Form_Load()
    'TopMost設定
    SetWindowPos Form2.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
End Sub

Private Sub Form_GotFocus()
    'TopMost解除
    SetWindowPos Form2.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
End Sub

ActiveXコントロールがForm1にフォーカスを引き戻しているのでしょう。
これでだめなら解除はどこか他のところで行う。
どこで解除するのがベストかはコードを見なければわかりません。


特攻隊長まるるう  2005-04-20 23:46:34  No: 121081

ねろさんと少しかぶるレスですが…

原因をその意味も含めて理解してから次の段階に進んで下さいね。
結果が同じでも原因が違う場合がありますよ?。

>外部のActiveXコントロールに含まれるイベントで
…そんなの聞いてないってば(汗)レスにあった回答とは原因が
別なんじゃないですか?外部の…ってどういう意味ですか?
外部のActiveXコントロールはドコに存在しますか? Form1 
の上ですか?
まず、レスが付いた内容を hoei さんは理解できてません。
ロードイベントで Form2 を開くとダメって事でした。でも、
>外部のActiveXコントロールに含まれるイベントでForm2.Showを実行した時がダメで、
>Command1_Click()イベントでは問題ありません。
で、外部のActiveXコントロールも Command1 も Form1
の上に同じ様に配置してテストしたなら今回の質問の解決に
結びつくレスでは無かったという事です。

OSがWin2000という事ですのでフォアグランドウィンドウに
付いての過去ログをリンク貼っておきます。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200402/04020031.txt
リンク先からマイクロソフトのページに飛べば分かりますが、
これは2つ以上のウィンドウ(アプリケーション)を扱ってる場合に
のみ起こる現象…というかOSの仕様です。
意味としては
1つのアプリケーションがアクティブになっている時は、ユーザが
そのアプリケーションを使用しているという事。そこに別アプリが
最前面に出てくると、ユーザの操作をジャマする。つまり、例えば
エクセルのセル入力中にVBのメッセージボックスが最前面に出て
しまうと入力途中の状態で切り替えられてしまってユーザが迷惑する。
…という事に対してマイクロソフトが決めたOSの仕様です。

…とここまで書いて
>外部のActiveXコントロールに含まれるイベントでForm2.Showを実行した時がダメで、
イベントちゃんと起こってます?ActiveXコントロールが入力途中で
イベントがキャンセルされてたりしない?本当に Form2 を表示して
大丈夫なイベント?この辺ねろさんのレスと合わせて調べて下さい。
ActiveXコントロールのイベントの使い方が悪い気がします。

更に突き詰めた回答が欲しいのであればActiveXコントロールの
内容とイベント名と…詳しいコーディングまで見ないと何とも言えません。


特攻隊長まるるう  2005-04-22 00:22:37  No: 121082

アクティブなウィンドウが違いますので、解決に関連するリンクでは
ありませんが、参考情報として貼らせて下さいm(__)m
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200504/05040067.txt


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加