tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルモードレス表示のフォームを常に操作可能に
記事No5001
投稿日: 2007/02/26(Mon) 16:52
投稿者おかっぴきA
こんにちは、前回は教えていただきありがとうございました。
動作確認をしていると、どうも やりたいようにならないことがわかりました。

【使用OS】windowsXP
【VBの種類】Microsoft Visual Basic .NET

【現在の仕様】
メインのForm1から表示用フォームをモーダルで表示。
表示用フォームは複数用意されているが(Form1_1,Form1_2…)、
Form1から同時に表示されることはない。(必ずどれか一つ)
表示用フォームからモードレスでForm2を表示させる。
※Form2は前回教えていただいたとおり、
 複数表示されることはありません。

追加で、メインのForm1からもForm2を
モードレスで表示させたいと思っています。


【今回の質問内容】
表示用フォームを、Form2の表示をさせてから閉じ、
(このときForm2は表示されたまま)
メインのForm1を操作したあとにもう一度表示用フォームを開くと、
Form2がモーダル扱いになるのか操作できなくなります。

常にForm2を操作可能にさせたいのですが、
どうすれば上手くいくでしょうか?
※『フォームを常に手前に表示』を試してみましたがダメでした。


よろしくお願いします。

[ツリー表示へ]
タイトルRe: モードレス表示のフォームを常に操作可能に
記事No5012
投稿日: 2007/02/28(Wed) 07:48
投稿者y4yama
> 表示用フォームを、Form2の表示をさせてから閉じ、
> (このときForm2は表示されたまま)
> メインのForm1を操作したあとにもう一度表示用フォーム[ Form1_1 ]を開くと、
> Form2がモーダル扱いになるのか操作できなくなります。
おかっぴきAさん、こんにちは
最小限に切り詰めた3つの.vb のコードを作って、ご自分で動作確認されて
それでも解決の糸口が見つからないならば
他人が再現できる「最小限に切り詰めた3つの.vb のコード(+Module1.vb)」をUPされてみては
いかがでしょうか。文面だけでは、漠然としてて(私なら)試してみる気になれませんヨ

漠然とながらも、1つの方法は、
Form1_Load()で、frm2 = New Form2 をしておいて、必要な時だけFrm2をshowする・・
でもうまく制御できますが・・・

[ツリー表示へ]
タイトルRe^2: モードレス表示のフォームを常に操作可能に
記事No5013
投稿日: 2007/02/28(Wed) 09:56
投稿者おかっぴきA
こんにちは。回答ありがとうございます。

> 他人が再現できる「最小限に切り詰めた3つの.vb のコード(+Module1.vb)」をUPされてみては
> いかがでしょうか。
簡単にコードをUPしてみたいと思います。(ボタンはデフォルト名です)

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

Public Class Form1
  〜中略〜
  Private Sub Button1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button1.Click

    Dim frm1_1 As New Form1_1
    frm1_1.ShowDialog(Me)        'Form1から表示用フォーム(Form1_1)をモーダルで表示
    frm1_1.Dispose()
  End Sub
End Class

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

Public Class Form1_1
  〜中略〜
  Private Sub Button1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button1.Click

    Form2.Instance.Show()        'モードレスフォームを複数表示しないようにする
  End Sub
End Class

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

Public Class Form2
  〜中略〜

  'ただ一つのフォームのインスタンスを保持するフィールド
  Private Shared _instance As Form2

  'ただ一つのフォームにアクセスするためのプロパティ
  Public Shared ReadOnly Property Instance() As Form2
    Get
      '_instanceがnullまたは破棄されているときは、
      '新しくインスタンスを作成する
      If _instance Is Nothing OrElse _instance.IsDisposed Then
        _instance = New Form2
      End If
      Return _instance
    End Get
  End Property            'これでForm2は一つだけしか表示されない
End Class

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

現在はこのようにコードを書いております。
※Form2については、前回教えていただいたものです。
  参照: http://hanatyan.sakura.ne.jp/bbs/wforum.cgi?mode=allread&no=4964&page=0


> Form1_Load()で、frm2 = New Form2 をしておいて、必要な時だけFrm2をshowする・・
それは、Form1_Load()で「Dim frm2 As New Form2」として、
表示用フォーム(Form1_1)から開くのでしょうか。

引き続き、ご教授よろしくお願いします。

[ツリー表示へ]
タイトルRe^3: モードレス表示のフォームを常に操作可能に
記事No5016
投稿日: 2007/02/28(Wed) 14:58
投稿者y4yama
> それは、Form1_Load()で「Dim frm2 As New Form2」として、
> 表示用フォーム(Form1_1)から開くのでしょうか。
すみませんでした。漠然とではこれでは、ダメですね。勉強させてもらってま〜す。
Form2を表示のままで、「Form1から表示用フォーム(Form1_1)をモーダルで表示」すれば
モーダルなのだから、その他は操作不可能になるのですね。

1.Form1_1を閉じるとき、必ずForm2も強制的に閉じる。
2.Form1_1をモーダルにしない。Form1には、アクセスできないよう、工夫しておく。
3.Form2がただの情報表示なら簡単そうなのが、別exeにしておいて、
  Microsoft.VisualBasic.Shell("Calc.exe",・・て感じで、別ウィンドウ扱いにする。

等、思いつきましたが、力及ばず、識者のかたのご教授をお待ちいたします。

[ツリー表示へ]
タイトルRe^4: モードレス表示のフォームを常に操作可能に
記事No5026
投稿日: 2007/03/01(Thu) 13:15
投稿者おかっぴきA
> 1.Form1_1を閉じるとき、必ずForm2も強制的に閉じる。
> 2.Form1_1をモーダルにしない。Form1には、アクセスできないよう、工夫しておく。
> 3.Form2がただの情報表示なら簡単そうなのが、別exeにしておいて、
>   Microsoft.VisualBasic.Shell("Calc.exe",・・て感じで、別ウィンドウ扱い
にする。

(1)を実行するとしたら、
「Form1_1の表示と同時にForm2も表示し、
 Form1_1を閉じるときも、同時に閉じる」とした方がよさそうですね。

(3)は、Form2が情報表示のみ、ではないので出来ないかもしれません。

(2)が一番の理想です(笑)
ですが、『アクセスできないよう、工夫』の部分が今はわからないので、
まずは(1)を試してみたいと思います。

y4yamaさん、ありがとうございました。


※(1)を試してみて違和感があったときには
  引き続き、よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^4: モードレス表示のフォームを常に操作可能に
記事No5034
投稿日: 2007/03/02(Fri) 11:44
投稿者おかっぴきA
> 1.Form1_1を閉じるとき、必ずForm2も強制的に閉じる。
> 2.Form1_1をモーダルにしない。Form1には、アクセスできないよう、工夫しておく。
> 3.Form2がただの情報表示なら簡単そうなのが、別exeにしておいて、
>   Microsoft.VisualBasic.Shell("Calc.exe",・・て感じで、別ウィンドウ扱い
にする。


(1)を中心的に試してみたのですが、やはりこの方法でいくことにしました。

Form1_1を閉じ、Form1から再び表示用フォーム(Form1_1…)
を表示させるそのときに、Form2をHideすることにしました。

どうもありがとうございました。

[ツリー表示へ]