DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フォームのコンストラクタのオーバーロード

環境/言語:[WinXP,.NET Framework 2.0]
分類:[.NET]

VB2005 を使っています。

フォームのコンストラクタのオーバーロードについて

引数を持たないコンストラクタ(デフォルト)と、
引数を持つコンストラクタを作成しようと考えています。

Public Sub New(i as integer)

End Sub

と作成すると、
警告
 「デザイナで生成された型 '割愛.form1' の 'Public Sub New(i As Integer)'
   は InitializeComponent メソッドを呼び出さなければなりません。」
と警告が出てしまいます。

引数を持たないデフォルトのコンストラクタと
引数を持つコンストラクタの両方で、InitializeComponent メソッドを
呼び出さなければならないのでしょうか?

複数の箇所で InitializeComponent メソッドの呼び出しを行わなくても
済むような方法はないのでしょうか。
■No22887に返信(してさんの記事)
> VB2005 を使っています。
2002/2003 だと、微妙に事情が異なるのですけれどね。


> フォームのコンストラクタのオーバーロードについて
> 引数を持たないコンストラクタ(デフォルト)と、
> 引数を持つコンストラクタを作成しようと考えています。
VB2005 の場合、フォームにコンストラクタを明示記述しなかった場合、
コンパイル時に自動的に
 Public Sub New()
  InitializeComponent()
 End Sub
が生成される事になります。

もし、引数なしコンストラクタに、InitializeComponent() を呼ばせたく無ければ
 Public Sub New()
 End Sub
という空のコンストラクタを用意する必要があります。
(BC40054 警告になるので、邪魔であれば nowarn オプションで黙らせます)

# ちなみにBC40054 警告は、『Private Sub InitializeComponent()』のメソッドに
# 反応します。このメソッドが用意されていないクラスや、あるいは、これが
# 別名や別定義(Function や Public など)になっている場合、警告は出ません。


> 引数を持たないデフォルトのコンストラクタと
> 引数を持つコンストラクタの両方で、InitializeComponent メソッドを
> 呼び出さなければならないのでしょうか?
呼ばなくても構いませんが、その場合、デザイナで作成した一切の内容
(フォームのプロパティや、貼りつけたコントロールなど)は反映されません。


> 複数の箇所で InitializeComponent メソッドの呼び出しを行わなくても
> 済むような方法はないのでしょうか。
たとえば、
 Public Sub New()
  InitializeComponent()
 End Sub
 Public Sub New(ByVal i As Integer)
  Me.New()
 End Sub
のような書き方にする事は可能です。
魔界の仮面弁士さん、ご教授ありがとうございます。

>>複数の箇所で InitializeComponent メソッドの呼び出しを行わなくても
>>済むような方法はないのでしょうか。
> たとえば、
>  Public Sub New()
>   InitializeComponent()
>  End Sub
>  Public Sub New(ByVal i As Integer)
>   Me.New()
>  End Sub
> のような書き方にする事は可能です。

Me.New() を追加すると、うまくいきました。
よくわからないまま、MyBase.New() と記述して
試したりしていたのですが、警告が消えずに困っていました。
Me.New() を追加してコーディングを進めていこうと思います。

有り難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板