- - PR -
VB.NETにおけるInitializeComponent()について質問
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-06-27 12:25
こんにちは!
上記の件で質問です。 1.質問の経緯 Sub Main(標準モジュール)をスタートアップとしてシングルステップで処理を流した 際、Public Show_Form As New frmELMDH28i_1()の記述のところで 下記のように処理された。 (1)Formクラスの Public Sub New()に処理が飛んだ (2)下記の処理が流れた (2)ソース---------------------------------------------------------------------- If m_vb6FormDefInstance Is Nothing Then If m_InitializingDefInstance Then m_vb6FormDefInstance = Me Else Try 'スタートアップフォームについては、最初に作成されたインスタンスが既定インスタンスになります。 If System.Reflection.Assembly. _ GetExecutingAssembly.EntryPoint. _ DeclaringType Is Me.GetType Then m_vb6FormDefInstance = Me end If Catch End Try End If End If ------------------------------------------------------------------------------ (3)上記(2)が流れた後InitializeComponent()を処理した際(シングルステップ) 別の標準モジュールに処理が飛んでしまう。 2.問題点 (1)InitializeComponent() ・InitializeComponent()が実行されるとその他のモジュールに飛んでしまい Sub Mainにて変数やADOの接続先等の設定する処理がはしる前に 別の標準モジュールへ飛んで設定していない(ADO等の設定)部分へ処理が いってしまうためビルドエラーが発生してしまう。 3.質問 (1)上記問題点で発生している事項に関しての考えられる理由・原因 (2)InitializeComponent()の基本動作及び注意事項等 (3)解決策(上記の記述のみで解った方場合お願いします^^;) よろしくお願いいたします [ メッセージ編集済み 編集者: VB!VB?VB♪ 編集日時 2003-06-27 12:27 ] |
|
投稿日時: 2003-06-27 13:56
こんにちは。
よくわからないのですが、InitializeComponent()を呼ぶ前に、何らかの処理をしていますか?それは間違いです。この処理の後にコードを書きます。と、わざわざコメントを挿入してくれていますよね?この処理はその名の通り、WindowFormに配置したコンポーネントの初期化を行うので、この処理が通らないとインスタンスができていません。 InitializeComponent()でシングルステップというのがよくわからないのですが、このファンクションの中に入ろうとしたのでしょうか/このファンクションで実行されることを1行ずつ確認しようとしたのでしょうか。それはできません。<System.Diagnostics.DebuggerStepThrough()>という属性値がついていますが、見ての通り、デバッガのステップはスルー(通り抜け)します。 m_vb6FormDefInstanceというのが何なのかわかりませんが、これを設定することによって、何らかのイベントが発生していませんか? |
|
投稿日時: 2003-06-27 18:15
こんにちは!
Jittaさん、私の説明不足のためご迷惑をおかけします。 まず、ご質問に答えようと思います。 @引用------------------------------------------------------------ Q:InitializeComponent()を呼ぶ前に、何らかの処理をしていますか? ------------------------------------------------------------------ A:NOです 補足: InitializeComponent()がどのタイミングで処理が行われるのか良く わかりませんが、シングルステップ=F8実行(一行ずつ確認しようとした、ただし InitializeComponent()をではなく処理の実行をF8で実行した)を行った時 、実行場所?(構文に黄色い帯がついた場所)が"Show_Form"(←:Public _ Show_Form As New frmELMDH28i_1())に帯が掛かり、もう一度F8を押したら ソース------------------------------------------------------------ #Region "Windows フォーム デザイナによって生成されたコード" Public Sub New() '←ここに処理がきました -------------------------------------------------------------------- に処理が行き、あとは先ほどの(2)ソースへ行き(If m_vb6FormDefInstance Is _ Nothing Then '以下省略)InitializeComponent()に至っております。 A引用------------------------------------------------------------------- Q:このファンクションの中に入ろうとしたのでしょうか/このファンクションで 実行されることを1行ずつ確認しようとしたのでしょうか。 ------------------------------------------------------------------------ A:後者です 補足: ただしInitializeComponent()にさしかかった際、実行場所 示す帯(黄色い帯)がどこかへ・・・ご指摘の通りスルー(内部処理?) がおこなわれている感じでした・・・ B引用------------------------------------------------------------------- Q:m_vb6FormDefInstanceというのが何なのかわかりませんが、これを設定する ことによって、何らかのイベントが発生していませんか? ------------------------------------------------------------------------ A:イベントは発生しておりません(多分^^;;) 補足: 多分と書いておりますが上記に書いた通りF8実行しておりましたところ どこかに処理が飛ぶこともなく実行されました。なお、構文の意味なのですが まだ調査しきれておりません・・・予測としてはアップグレード(VB6.0→VB.NET) した際に自動的に付加されたものかと思います。というのは下記のソースをみて 予測しました。 ソース------------------------------------------------------------- #Region "アップグレード ウィザードのサポート コード" Private Shared m_vb6FormDefInstance As frmELMDH28i_1 Private Shared m_InitializingDefInstance As Boolean Public Shared Property DefInstance() As frmELMDH28i_1 Get If m_vb6FormDefInstance Is Nothing OrElse _ m_vb6FormDefInstance.IsDisposed Then m_InitializingDefInstance = True m_vb6FormDefInstance = New frmELMDH28i_1() m_InitializingDefInstance = False End If DefInstance = m_vb6FormDefInstance End Get Set m_vb6FormDefInstance = Value End Set End Property #End Region -------------------------------------------------------------------- 多分実行時バインディングに対してアップグレードウィザードがサポートとして 付加したものと思っております。(自信は無いですが・・・) 以上でJittaさんの疑問は無くなったでしょうか?(かなり不安ですが。。) 私、文章作成能力が無いことを新たに思い知らされました・・・・(涙) 上記の件宜しくお願い致します ※乱文・長文失礼いたしました |
|
投稿日時: 2003-06-30 09:03
標準モジュールをスタートアップフォームにしているから、ですね。モジュール(Module〜Module Endの間)はインスタンス化されません/できません。
補足 最初のポストの、(2)のコードですが、VB6との互換性のために、インスタンスを何らかのVB6用の変数m_vb6FormDefInstanceに参照させようとしています。ここで、スタートアップフォームとなっているフォームのインスタンスが入るはずが、インスタンス化されないモジュールがスタートアップフォームになっているので(アップデートウイザードのバグ?)、おそらくNothingが代入され、InitializeComponentメソッドないで初期化のために代入しようとしてビルドエラー(の内容も書いて欲しいかったが、「オブジェクトがない」エラーじゃないですか?andビルドじゃなくて実行時エラーでしょ?ビルドエラーなら、ビルド時になおしてください)になっている、と思われます。 対策としては、ModuleからClassに変更してください。Moduleはインスタンス化されないので、スタートアップフォームを変更しても、フォームの作成ができないと思います。 [ メッセージ編集済み 編集者: Jitta 編集日時 2003-06-30 11:17 ] |
1