.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 です。
いくつか手法はあるけど…
2つのフォームの親子関係を考えて、
Main で Application.Run を使って親フォームを
起動して、親フォームから子フォームを Show で
表示…がいいかなぁ?
…っつか、なんで Form1 起動にして Form2 表示では
ないのか?書かれてないから何を求められてるのか
いまいち掴めない…。
システム全体がSub main から起動することになっているので。
Sub Main()
myForm2.Show()
Application.Run(myForm)
End Sub
こうやっとく手も有りそうだが、いずれにしても
Form1がterminateされるとForm2も消えてなくなるな。
単にForm1_Loadに
myForm2.Show()
と書けば良さそうだが・・・・
>単にForm1_Loadに
>myForm2.Show()
>と書けば良さそうだが・・・・
結局、親フォームが終了するとプログラム終了と言う形は同じかと。
もっと、こう、マルチ画面っぽいイメージでそれぞれのフォームが
同じレベルの存在で開いたり閉じたりされて、最終的に全ての
フォームが閉じられたらプログラム終了…ってのは隣りの初心者
掲示板で昔、考えたなぁ…過去ログ検索『別フォーム』でどうぞ。
ま、フォームを管理するクラスを作って監視しただけだけど。
…それがある程度の良い構造なのか?ちょっと自信ない。
改良したほうがいいだろうなぁ…うーん。
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
>結局、親フォームが終了するとプログラム終了と言う形は同じかと。
ああ!、そうそう↑の形が悪いと言ってるわけではないです。
Sub Main 起動の理由が
>システム全体がSub main から起動することになっているので。
だけなら、形だけ Sub Main 起動でフォーム起動と同じ動きで
いいんでない?
…っと書いてる間に弁さんのサンプルがΣ(‾□‾)
なるほどなるほど。Closed のイベントに結び付けてやるのね。
これでじゃんぬさんも納得?(ぇ
魔界の仮面弁士さん、ありがとうございます。
しかし、クラスの知識がない自分は、
Public Class StartupClass
Inherits ApplicationContext
をどこに入れてよいかわかりません。
一番上にいれるとその他の
Public宣言文やPrivate宣言文が有効ではなくなってしまいます。
どのようにしたらよいのでしょうか?
> しかし、クラスの知識がない自分は、
といっても、ゼロというわけでは無いですよね。
実際に 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等の宣言があるなら、
それよりも後に書いてください。
> Form2.vb … (Public Class Form1〜End Class なコード)
Form2.vb … (Public Class Form2〜End Class なコード)
でした。m(_ _)m
Sub Main からの起動処理では、「Application.Runメソッド」がよく利用されます。
通常は、ここにメインフォームを指定する事になるのですが、メインとなる
フォームが存在しない場合には、先のサンプルのように、独自に定義した
ApplicationContext クラスを用意し、それを指定するというわけです。
返信ありがとうございます。
みなさんとても、お役に立ちました。
何とか解決できました。
また、何かあればぜひ投稿させて頂きたいと思います。
ありがとうございます。
ツイート | ![]() |