- PR -

VB.NETにおけるInitializeComponent()について質問

1
投稿者投稿内容
VB!VB?VB♪
会議室デビュー日: 2003/06/20
投稿数: 6
お住まい・勤務地: 愛知県近辺
投稿日時: 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 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-06-27 13:56
こんにちは。

 よくわからないのですが、InitializeComponent()を呼ぶ前に、何らかの処理をしていますか?それは間違いです。この処理の後にコードを書きます。と、わざわざコメントを挿入してくれていますよね?この処理はその名の通り、WindowFormに配置したコンポーネントの初期化を行うので、この処理が通らないとインスタンスができていません。

 InitializeComponent()でシングルステップというのがよくわからないのですが、このファンクションの中に入ろうとしたのでしょうか/このファンクションで実行されることを1行ずつ確認しようとしたのでしょうか。それはできません。<System.Diagnostics.DebuggerStepThrough()>という属性値がついていますが、見ての通り、デバッガのステップはスルー(通り抜け)します。

 m_vb6FormDefInstanceというのが何なのかわかりませんが、これを設定することによって、何らかのイベントが発生していませんか?
VB!VB?VB♪
会議室デビュー日: 2003/06/20
投稿数: 6
お住まい・勤務地: 愛知県近辺
投稿日時: 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さんの疑問は無くなったでしょうか?(かなり不安ですが。。)
私、文章作成能力が無いことを新たに思い知らされました・・・・(涙)

上記の件宜しくお願い致します

※乱文・長文失礼いたしました



Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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

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