- PR -

VB2005でSub MainからFormのShow

投稿者投稿内容
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2007-01-27 16:08
こんにちは。ぼのぼのです。

VB2005 Express EditionでWindowsアプリをつくるとき、
今までずっと「アプリケーションフレームワークを有効にする」のチェックをつけたままにしていたんですが、
たまたまεπιστημη さんのブログを読んで、ちょっくら外してみようと思い、試してみたんですが、
2つほどわからないことがでてきました。

1つめは、Sub Main内のコードなんですが、
ブログのコメント欄からリンクを辿ってR・田中一郎さんのブログを参考に、

コード:

    Shared Sub Main()
        Dim frm As New Form1()
        frm.Show()
    End Sub



と書いてみたんですが、デバッグ実行するとウィンドウが一瞬表示され、すぐに消えてしまいます。
このコードはあくまでVB6用で、.NETではShowDialogを使わないといけないんでしょうか?

2つめは、επιστημη さんのブログのじゃんぬさんのコメントで、
>Sub Main は自分で書く。
>C# にならえば、Program という静的クラスでも作ってそこに書く。

とあるのですが、VBで静的クラスってどうやって書くんでしょう?
ぐぐってみたらC#だとpublic static class Programと書けば良いことはわかったんですが、
VBでの書き方が見つけられませんでした。VBでは無理なんでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-27 16:59
引用:

ぼのぼのさんの書き込み (2007-01-27 16:08) より:

コード:

    Shared Sub Main()
        Dim frm As New Form1()
        frm.Show()
    End Sub


と書いてみたんですが、デバッグ実行するとウィンドウが一瞬表示され、すぐに消えてしまいます。
このコードはあくまでVB6用で、.NETではShowDialogを使わないといけないんでしょうか?


というより、これは 'Application' がスタートされていないからです。
(Process はスタートしています)

まずは、System.Windows.Forms.Application.Run メソッドを調べてみてください。
気が向いたら、ApplicationContext クラスについても調べてみてください。

引用:

2つめは、επιστημη さんのブログのじゃんぬさんのコメントで、
>Sub Main は自分で書く。
>C# にならえば、Program という静的クラスでも作ってそこに書く。

とあるのですが、VBで静的クラスってどうやって書くんでしょう?
ぐぐってみたらC#だとpublic static class Programと書けば良いことはわかったんですが、VBでの書き方が見つけられませんでした。VBでは無理なんでしょうか?


これは、私の書き方がまずかったですね。
VB では、静的メンバのみ含ませることができるという制限を持つ、静的クラスを作ることはできません。

VB では標準モジュールで代用します。
しかし、私はクラス名が省略可能なのがイヤなので、Shared メンバのみのクラスを作ります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2007-01-27 20:16
引用:

じゃんぬねっとさんの書き込み (2007-01-27 16:59) より:

まずは、System.Windows.Forms.Application.Run メソッドを調べてみてください。
気が向いたら、ApplicationContext クラスについても調べてみてください。


ご回答ありがとうございます。
とりあえずApplication.Runでぐぐってみたら、先頭にこのページがでてきて、そこを一通り読んで、

コード:

    Public Shared Sub Main()
        Dim frm As New Form1()
        frm.Show()
        Application.Run(frm)
    End Sub


の一行を加えたら消えなくなりました。
しかし、ShowDialogだとApplication.Runを書かなくてもWindowが消えないってことは、
ShowDialogは勝手にApplicationをスタートしてくれる?のかな?

ApplicationContextについては、まだMSDNのこのページをざっと流し読みしただけなので、
気が向いたらちゃんと勉強してみたいと思います(^^;

引用:

VB では、静的メンバのみ含ませることができるという制限を持つ、静的クラスを作ることはできません。

VB では標準モジュールで代用します。
しかし、私はクラス名が省略可能なのがイヤなので、Shared メンバのみのクラスを作ります。


あ、やっぱりそうだったんですね。
標準モジュールってのも使ったことなくてわからないんで気が向いたら勉強してみますが、
とりあえずは普通にクラス作ってMainメソッドをSharedにしとけば良いってことですね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-27 21:07
引用:

ぼのぼのさんの書き込み (2007-01-27 20:16) より:

そこを一通り読んで、

コード:

    Public Shared Sub Main()
        Dim frm As New Form1()
        frm.Show()
        Application.Run(frm)
    End Sub


の一行を加えたら消えなくなりました。


frm.Show メソッドは必要ありません。

引用:

しかし、ShowDialogだとApplication.Runを書かなくてもWindowが消えないってことは、
ShowDialogは勝手にApplicationをスタートしてくれる?のかな?


ShowDialog メソッドを呼び出すと、どこで制御が停止するのかご存知ないのでしょうか?
それと、やはり ApplicationContext クラスも調べてみてください。

引用:

あ、やっぱりそうだったんですね。


やっぱりって言うくらいなら最初から書いとけよ。な! (某 B 氏より転用w)

引用:

標準モジュールってのも使ったことなくてわからないんで気が向いたら勉強してみますが、
とりあえずは普通にクラス作ってMainメソッドをSharedにしとけば良いってことですね。


使うだけなら、勉強は必要ないと思いますよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2007-01-28 11:00
引用:

じゃんぬねっとさんの書き込み (2007-01-27 21:07) より:

ShowDialog メソッドを呼び出すと、どこで制御が停止するのかご存知ないのでしょうか?
それと、やはり ApplicationContext クラスも調べてみてください。


ご存知ないんです。調べるのは…気が向いたらじゃ駄目ですか?(^^;
Visual Studio使ってると、そうゆうことを知らなくてもアプリケーションが作れちゃうんですよねぇ。

引用:

やっぱりって言うくらいなら最初から書いとけよ。な! (某 B 氏より転用w)


いやいや、なんか勘違いしてらっさる。
>Sub Main は自分で書く。
>C# にならえば、Program という静的クラスでも作ってそこに書く。
と書いてあったので、VBでも書けるのかな〜と思ったんだけど、
ぐぐってもでてこなかったので、VBでは無理なんでしょうか?と書いて、それに対して、
>VB では、静的メンバのみ含ませることができるという制限を持つ、静的クラスを作ることはできません。
と返ってきたので「やっぱり」。
多分やっぱりがどっか別のとこに懸かってると勘違いされたんだと思いますが、
な!と言われても困るとです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-28 14:56
引用:

ぼのぼのさんの書き込み (2007-01-28 11:00) より:

ご存知ないんです。


デバッグでステップ実行すれば、すぐ確認できますよ。
ShowDialog メソッドは '呼び出し元での' 制御が止まります。
ShowDialog メソッドの動作は、エントリ ポイントでなくてもこの制御がなされます。

引用:

調べるのは…気が向いたらじゃ駄目ですか?(^^;

引用:

Visual Studio使ってると、そうゆうことを知らなくてもアプリケーションが作れちゃうんですよねぇ。


ApplicationContext は、また別のお話なので、これは気が向いた時で良いです。
ShowDialog メソッドの動作については、さすがに Visual Studio でなくても知っておいた方が良いです。

引用:

いやいや、なんか勘違いしてらっさる。
(snip)
と返ってきたので「やっぱり」。
多分やっぱりがどっか別のとこに懸かってると勘違いされたんだと思いますが、
な!と言われても困るとです。


その "やっぱり" に対して発言していますので、勘違いはしていないようです。
ただの冗談の類だったのですが、軽はずみな行動だったようです。
ご気分を害されたのであれば謝罪いたします。

# ここまでは公の場で謝罪したかったので、ここで返答してしまいましたが、
# 何かありましたら、PM でお願いします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2007-01-28 15:39
引用:

じゃんぬねっとさんの書き込み (2007-01-28 14:56) より:

ShowDialog メソッドは '呼び出し元での' 制御が止まります。
ShowDialog メソッドの動作は、エントリ ポイントでなくてもこの制御がなされます。
(中略)
ShowDialog メソッドの動作については、さすがに Visual Studio でなくても知っておいた方が良いです。


ちょっと私が知りたかったこととずれがあったようですので、補足させていただきます。

えーと、例えばメインフォームであるForm1とサブフォームForm2があって、
Form1のボタンクリックでForm2をnewしてShowした場合、Form2はモードレスで起動して、
その後もForm1は操作可能。一方、ShowDialogだとForm2はモーダルで起動して、
Form1はForm2を閉じるまで操作不可能になるじゃないですか。
この動作は知ってたんですけれども。

Sub MainからForm1を起動する場合は、参考にしたページの記述によると、
Form1がすぐ消えちゃうのはメッセージ・ループがまだ始まっていないからで、
Application.Runメソッドにより、メッセージ・ループが開始するっていう説明がされていて。

ところが、ShowDialogメソッドを使うとApplication.Runメソッドを呼ばなくてもForm1が消えないので、
ShowDialogメソッドを使うと内部で勝手にメッセージ・ループを開始してくれるのかな?と思ったのです。

で、
コード:

    Public Shared Sub Main()
        Dim frm As New Form1()
        Application.Run(frm)
    End Sub


と書くのと、

コード:

    Public Shared Sub Main()
        Dim frm As New Form1()
        frm.ShowDialog()
    End Sub


と書くのと、見た目的には同じ動作結果が得られるんですけども、
内部的には何か差異があるのか?後者の方法は実は何かの理由によりやっちゃまずい書き方なのか?
ということが知りたかったのでした。

引用:

ただの冗談の類だったのですが、軽はずみな行動だったようです。
ご気分を害されたのであれば謝罪いたします。

# ここまでは公の場で謝罪したかったので、ここで返答してしまいましたが、
# 何かありましたら、PM でお願いします。


こっちに関しては、気分を害してないことだけは確かなので、気になさらないでください。
ご提案に従い、細かいことはPMで書かせていただきますね。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-01-28 21:49
引用:

ShowDialogメソッドを使うと内部で勝手にメッセージ・ループを開始してくれるのかな?と思ったのです。



されますよ。
でも、ShowDialog() を抜けたらメッセージループも止まってしまいます。

Application.Run() にしても同様です。
「Apllication.Run() を呼び出してから抜けてくるまで」の間、メッセージループが維持されているのです。

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