- PR -

VB.NETの親フォームから子フォームの作成に関して

投稿者投稿内容
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2006-04-10 02:37
ApplicationContextを継承したクラスを作成し、
Application.Runメソッドの引数にそのインスタンスを渡します。
終了するにはフォームの終了ボタンなどでApplcation.ExitThread()(又はExit())を呼び出します。

コード:
Public Class Program
    Inherits ApplicationContext

    Public Sub New()
        MyBase.New()

        'ここに処理を記述

    End Sub
End Class

Public Module MyApplication
    Public Sub Main()
        Application.Run(New Program)
    End Sub
End Module



詳しくはMSDNライブラリを読んでください。
まりぽん
会議室デビュー日: 2006/04/09
投稿数: 13
投稿日時: 2006-04-10 02:49
ひとまず、過去ログのコードを参考にして
コードを書いてみました。
#コードSTART--------------------------
Imports System
Imports System.Drawing
Imports System.Windows.Forms

Class MyApplicationContext
Inherits ApplicationContext
Private form1 As Form1
Private form2 As Form2

Private Sub New()
form1 = New Form1
AddHandler form1.Closed, AddressOf OnFormClosed
form1.Show
End Sub

Private Sub OnFormClosed(ByVal sender As Object, ByVal e As EventArgs)
If TypeOf sender Is Form1 Then
form2 = New Form2
AddHandler form2.Closed, AddressOf OnFormClosed
form2.Show
Else
If TypeOf sender Is Form2 Then
form1 = New MainForm
AddHandler form1.Closed, AddressOf OnFormClosed
form1.Show
End If
End If
End Sub

<STAThread()> _
Shared Sub Main()
Dim context As MyApplicationContext = New MyApplicationContext
Application.Run(context)
End Sub
End Class
#コードEND--------------------------

とりあえず
ログイン画面→メインメニュー(ログイン画面閉じる)
は、動作の確認がとれました。
ただ、わかるとおもいますが、
ログイン→メニュー→ログイン→メニュー
となり、画面を終了させることができません;;;

回避する方法があるのでしょうか?
まりぽん
会議室デビュー日: 2006/04/09
投稿数: 13
投稿日時: 2006-04-10 02:59
>うにくまさん
あぅう。行き違いの投稿になってしまいました;;
返信ありがとうございます。
そのような方法もあるのですね。。Moduleって何だ?
って感じですが、勉強してみます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-10 09:15
引用:

まりぽんさんの書き込み (2006-04-10 02:59) より:

そのような方法もあるのですね。。Moduleって何だ?
って感じですが、勉強してみます。


C# 的に言えば、StandardModuleAttribute がついているクラスです。
普通のクラスでも、Main (エントリ ポイント) が Shared メソッドであれば問題ありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まりぽん
会議室デビュー日: 2006/04/09
投稿数: 13
投稿日時: 2006-04-11 00:06
皆さんのお力添えでClosedイベントを使用して
ログイン→メニュー→ログイン
はできました。ありがとうございました。

最終的には、ログイン画面の、閉じるボタンでExitすることで
正常に終了させることができました。

ただ、画面「×」ボタンで画面を閉じようとしても
Closedイベントが走ってしまうらしく、予期せぬ画面遷移
になってしまいます。
ログイン(画面×ボタンによるClose)→メニュー画面

とりあえず、ログインボタン押下時のみ、DialogResultに値(OK)を設定
して、値が設定されている場合のみShowを行い、それ以外はExitを
することで回避しているのですが、他にも振り分ける?方法は
あるのでしょうか?

聞いてばかりで申し訳ありませんが、よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-11 01:54
引用:

まりぽんさんの書き込み (2006-04-11 00:06) より:

とりあえず、ログインボタン押下時のみ、DialogResultに値(OK)を設定
して、値が設定されている場合のみShowを行い、それ以外はExitを
することで回避しているのですが、他にも振り分ける?方法はあるのでしょうか?


Code で実行された Close かどうかを判別する方法はあるのですが、現状が最も賢明だと思います。
でも、DialogResult.OK は意味合い的におかしいかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まりぽん
会議室デビュー日: 2006/04/09
投稿数: 13
投稿日時: 2006-04-11 19:51
>じゃんぬねっとさん
たびたびの回答ありがとうございます。
一応WndProcというものを見つけて実施確認は
できましたが、今回はこの方法でいきたいと
重います。
DialogResult.OKに関してはYESとか、値の判別のみ
なんで、Ignoreとかでもいいのかな?と思っていたんで
判断できればなんでもいいかな?と。
人が見たら意味がわからなくなりそうですが;;
minminnana
大ベテラン
会議室デビュー日: 2004/02/05
投稿数: 246
お住まい・勤務地: 盛岡
投稿日時: 2006-04-11 22:44
既に解決していらっしゃるようなので余計な話ですが、私はこんな感でやっていました。

コード:
Imports System.Windows.Forms

Class MyApplicationContext

    Public Shared ac As ApplicationContext

    <STAThread()> _
    Shared Sub Main()
        ac = New ApplicationContext(New Form1)
        Application.Run(ac)
    End Sub
End Class

フォーム1------------

    Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
        Dim frm = New Form2
        MyApplicationContext.ac.MainForm = frm
        frm.show()
    End Sub


質問者様が解決されたように1箇所で制御したほうが良いのですかね。

スキルアップ/キャリアアップ(JOB@IT)