2画面を起動するには?

解決


エム  2006-02-07 23:12:36  No: 94032

.Net初心者です。
Sub main から起動するプログラムなのですが、

Public myForm As New Form1
Public myForm2 As New Form2
 Sub Main()
  myForm.Show()
  myForm2.Show()
 End Sub
とすると、2画面とも一度表示され、消えてしまい、

 Sub Main()
  myForm.Show()
  myForm2.ShowDialog()
 End Sub
とすると、Form2が表示され入力できるのですが、
Form1がモーダルモードの影響で入力できません。

業務の都合上、起動時に両方のフォームを開いてデータを照合したいのですが
どのようにしたらよいのでしょうか?

使用しているのは、.Net 2003 です。


特攻隊長まるるう  2006-02-07 23:42:21  No: 94033

いくつか手法はあるけど…

2つのフォームの親子関係を考えて、
Main で Application.Run を使って親フォームを
起動して、親フォームから子フォームを Show で
表示…がいいかなぁ?


特攻隊長まるるう  2006-02-07 23:45:56  No: 94034

…っつか、なんで Form1 起動にして Form2 表示では
ないのか?書かれてないから何を求められてるのか
いまいち掴めない…。


エム  2006-02-07 23:58:27  No: 94035

システム全体がSub main から起動することになっているので。


我龍院忠太  2006-02-07 23:58:39  No: 94036

Sub Main()
    myForm2.Show()
    Application.Run(myForm)
End Sub
こうやっとく手も有りそうだが、いずれにしても
Form1がterminateされるとForm2も消えてなくなるな。

単にForm1_Loadに
myForm2.Show()
と書けば良さそうだが・・・・


特攻隊長まるるう  2006-02-08 00:25:21  No: 94037

>単にForm1_Loadに
>myForm2.Show()
>と書けば良さそうだが・・・・
結局、親フォームが終了するとプログラム終了と言う形は同じかと。

もっと、こう、マルチ画面っぽいイメージでそれぞれのフォームが
同じレベルの存在で開いたり閉じたりされて、最終的に全ての
フォームが閉じられたらプログラム終了…ってのは隣りの初心者
掲示板で昔、考えたなぁ…過去ログ検索『別フォーム』でどうぞ。
ま、フォームを管理するクラスを作って監視しただけだけど。

…それがある程度の良い構造なのか?ちょっと自信ない。
改良したほうがいいだろうなぁ…うーん。


魔界の仮面弁士  2006-02-08 00:28:45  No: 94038

1) Form1 と Form2 は、いずれもモードレス。
2) いずれかのフォームが生きている間は、アプリ存続。
3) すべてのフォームが閉じられたら、アプリ終了。

という条件だと仮定したサンプル。

Public Class StartupClass
    Inherits ApplicationContext

    Public Shared Sub Main()
        Application.Run(New StartupClass)
    End Sub

    Private Sub Form_Closed(ByVal sender As Object, ByVal e As EventArgs)
        Try
            Forms.Remove(sender)
        Finally
            If Forms.Count = 0 Then
                MyBase.ExitThread()
            End If
        End Try
    End Sub

    Private Forms As ArrayList
    Private Sub New()
        Dim F1 As New Form1
        Dim F2 As New Form2

        AddHandler F1.Closed, AddressOf Form_Closed
        AddHandler F2.Closed, AddressOf Form_Closed
        Forms = New ArrayList(New Form() {F1, F2})

        F1.Show()
        F2.Show()
    End Sub

End Class


特攻隊長まるるう  2006-02-08 00:39:33  No: 94039

>結局、親フォームが終了するとプログラム終了と言う形は同じかと。
ああ!、そうそう↑の形が悪いと言ってるわけではないです。
Sub Main 起動の理由が
>システム全体がSub main から起動することになっているので。
だけなら、形だけ Sub Main 起動でフォーム起動と同じ動きで
いいんでない?

…っと書いてる間に弁さんのサンプルがΣ(‾□‾)
なるほどなるほど。Closed のイベントに結び付けてやるのね。
これでじゃんぬさんも納得?(ぇ


エム  2006-02-08 01:36:43  No: 94040

魔界の仮面弁士さん、ありがとうございます。
しかし、クラスの知識がない自分は、
Public Class StartupClass
    Inherits ApplicationContext
をどこに入れてよいかわかりません。

一番上にいれるとその他の
Public宣言文やPrivate宣言文が有効ではなくなってしまいます。
どのようにしたらよいのでしょうか?


魔界の仮面弁士  2006-02-08 02:42:07  No: 94041

> しかし、クラスの知識がない自分は、
といっても、ゼロというわけでは無いですよね。
実際に Form クラスなどを使った開発を行えているのですし。

> Public Class StartupClass
>     Inherits ApplicationContext
> をどこに入れてよいかわかりません。

一つの vb ファイルに、複数の Class 定義を書く事もできるのですが、
とりあえず今回は、それぞれ別のファイルにしておいた方が分かりやすいでしょうね。

新規プロジェクトに、フォームを 2 つと クラスを 1 つ用意し、
それぞれのファイルのコードが、
  Form1.vb  … (Public Class Form1〜End Class なコード)
  Form2.vb  … (Public Class Form1〜End Class なコード)
  StartupClass.vb  … (先のサンプルコード)
となるようにして、動作を確認してみてください。

> 一番上にいれるとその他の
> Public宣言文やPrivate宣言文が有効ではなくなってしまいます。

既存の *.vb ファイル内に追加されたのですね。

一番上というと、具体的にはどこに記述されたのでしょうか?
Option Strict 等や Imports等の宣言があるなら、
それよりも後に書いてください。


魔界の仮面弁士  2006-02-08 02:46:01  No: 94042

>   Form2.vb  … (Public Class Form1〜End Class なコード)

    Form2.vb  … (Public Class Form2〜End Class なコード)

でした。m(_ _)m

Sub Main からの起動処理では、「Application.Runメソッド」がよく利用されます。

通常は、ここにメインフォームを指定する事になるのですが、メインとなる
フォームが存在しない場合には、先のサンプルのように、独自に定義した
ApplicationContext クラスを用意し、それを指定するというわけです。


えむ  2006-02-08 04:22:39  No: 94043

返信ありがとうございます。
みなさんとても、お役に立ちました。
何とか解決できました。
また、何かあればぜひ投稿させて頂きたいと思います。
ありがとうございます。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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