- - PR -
VB2005でSub MainからFormのShow
投稿者 | 投稿内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-27 16:08
こんにちは。ぼのぼのです。
VB2005 Express EditionでWindowsアプリをつくるとき、 今までずっと「アプリケーションフレームワークを有効にする」のチェックをつけたままにしていたんですが、 たまたまεπιστημη さんのブログを読んで、ちょっくら外してみようと思い、試してみたんですが、 2つほどわからないことがでてきました。 1つめは、Sub Main内のコードなんですが、 ブログのコメント欄からリンクを辿ってR・田中一郎さんのブログを参考に、
と書いてみたんですが、デバッグ実行するとウィンドウが一瞬表示され、すぐに消えてしまいます。 このコードはあくまでVB6用で、.NETではShowDialogを使わないといけないんでしょうか? 2つめは、επιστημη さんのブログのじゃんぬさんのコメントで、 >Sub Main は自分で書く。 >C# にならえば、Program という静的クラスでも作ってそこに書く。 とあるのですが、VBで静的クラスってどうやって書くんでしょう? ぐぐってみたらC#だとpublic static class Programと書けば良いことはわかったんですが、 VBでの書き方が見つけられませんでした。VBでは無理なんでしょうか? | ||||||||||||||||||||
|
投稿日時: 2007-01-27 16:59
というより、これは 'Application' がスタートされていないからです。 (Process はスタートしています) まずは、System.Windows.Forms.Application.Run メソッドを調べてみてください。 気が向いたら、ApplicationContext クラスについても調べてみてください。
これは、私の書き方がまずかったですね。 VB では、静的メンバのみ含ませることができるという制限を持つ、静的クラスを作ることはできません。 VB では標準モジュールで代用します。 しかし、私はクラス名が省略可能なのがイヤなので、Shared メンバのみのクラスを作ります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2007-01-27 20:16
ご回答ありがとうございます。 とりあえずApplication.Runでぐぐってみたら、先頭にこのページがでてきて、そこを一通り読んで、
の一行を加えたら消えなくなりました。 しかし、ShowDialogだとApplication.Runを書かなくてもWindowが消えないってことは、 ShowDialogは勝手にApplicationをスタートしてくれる?のかな? ApplicationContextについては、まだMSDNのこのページをざっと流し読みしただけなので、 気が向いたらちゃんと勉強してみたいと思います(^^;
あ、やっぱりそうだったんですね。 標準モジュールってのも使ったことなくてわからないんで気が向いたら勉強してみますが、 とりあえずは普通にクラス作ってMainメソッドをSharedにしとけば良いってことですね。 | ||||||||||||||||||||
|
投稿日時: 2007-01-27 21:07
frm.Show メソッドは必要ありません。
ShowDialog メソッドを呼び出すと、どこで制御が停止するのかご存知ないのでしょうか? それと、やはり ApplicationContext クラスも調べてみてください。
やっぱりって言うくらいなら最初から書いとけよ。な! (某 B 氏より転用w)
使うだけなら、勉強は必要ないと思いますよ。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2007-01-28 11:00
ご存知ないんです。調べるのは…気が向いたらじゃ駄目ですか?(^^; Visual Studio使ってると、そうゆうことを知らなくてもアプリケーションが作れちゃうんですよねぇ。
いやいや、なんか勘違いしてらっさる。 >Sub Main は自分で書く。 >C# にならえば、Program という静的クラスでも作ってそこに書く。 と書いてあったので、VBでも書けるのかな〜と思ったんだけど、 ぐぐってもでてこなかったので、VBでは無理なんでしょうか?と書いて、それに対して、 >VB では、静的メンバのみ含ませることができるという制限を持つ、静的クラスを作ることはできません。 と返ってきたので「やっぱり」。 多分やっぱりがどっか別のとこに懸かってると勘違いされたんだと思いますが、 な!と言われても困るとです。 | ||||||||||||||||||||
|
投稿日時: 2007-01-28 14:56
デバッグでステップ実行すれば、すぐ確認できますよ。 ShowDialog メソッドは '呼び出し元での' 制御が止まります。 ShowDialog メソッドの動作は、エントリ ポイントでなくてもこの制御がなされます。
ApplicationContext は、また別のお話なので、これは気が向いた時で良いです。 ShowDialog メソッドの動作については、さすがに Visual Studio でなくても知っておいた方が良いです。
その "やっぱり" に対して発言していますので、勘違いはしていないようです。 ただの冗談の類だったのですが、軽はずみな行動だったようです。 ご気分を害されたのであれば謝罪いたします。 # ここまでは公の場で謝罪したかったので、ここで返答してしまいましたが、 # 何かありましたら、PM でお願いします。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||||||
|
投稿日時: 2007-01-28 15:39
ちょっと私が知りたかったこととずれがあったようですので、補足させていただきます。 えーと、例えばメインフォームであるForm1とサブフォームForm2があって、 Form1のボタンクリックでForm2をnewしてShowした場合、Form2はモードレスで起動して、 その後もForm1は操作可能。一方、ShowDialogだとForm2はモーダルで起動して、 Form1はForm2を閉じるまで操作不可能になるじゃないですか。 この動作は知ってたんですけれども。 Sub MainからForm1を起動する場合は、参考にしたページの記述によると、 Form1がすぐ消えちゃうのはメッセージ・ループがまだ始まっていないからで、 Application.Runメソッドにより、メッセージ・ループが開始するっていう説明がされていて。 ところが、ShowDialogメソッドを使うとApplication.Runメソッドを呼ばなくてもForm1が消えないので、 ShowDialogメソッドを使うと内部で勝手にメッセージ・ループを開始してくれるのかな?と思ったのです。 で、
と書くのと、
と書くのと、見た目的には同じ動作結果が得られるんですけども、 内部的には何か差異があるのか?後者の方法は実は何かの理由によりやっちゃまずい書き方なのか? ということが知りたかったのでした。
こっちに関しては、気分を害してないことだけは確かなので、気になさらないでください。 ご提案に従い、細かいことはPMで書かせていただきますね。 | ||||||||||||||||||||
|
投稿日時: 2007-01-28 21:49
されますよ。 でも、ShowDialog() を抜けたらメッセージループも止まってしまいます。 Application.Run() にしても同様です。 「Apllication.Run() を呼び出してから抜けてくるまで」の間、メッセージループが維持されているのです。 |