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

フォームのLoadについて

環境/言語:[使用言語VB.NET]
分類:[.NET]

はじめまして。

フォームについて質問です。
VB6.0では、
Load(Form1)
と記述して、フォームを表示せずに読み込んでいましたが、
.NETでは、
Dim Form1 As New Form1
と記述し、フォームのインスタンスを作成する、とヘルプファイルにあります。
その場合、既にForm1に何かしら
値が入っていた場合は、それらは破棄されてしまうのでしょうか。
単純に置き換えてはいけませんよね?
> Dim Form1 As New Form1
この構文の場合、変数Form1はこの時点で初期化されるので、
(この文より前の時点では変数Form1は存在してないので)
以前の値が残っているということはありません。
■No4207に返信(NowhereManさんの記事)
>>Dim Form1 As New Form1
> この構文の場合、変数Form1はこの時点で初期化されるので、
> (この文より前の時点では変数Form1は存在してないので)
> 以前の値が残っているということはありません。

返信ありがとうございます。
追加で、質問させてください。
一つのモジュール内で、formをロードしている箇所が複数あった場合、
何度もNewするわけにはいかないですよね。(コード内容にもよりますが)
で、以下のような書き方は正しいでしょうか。
一度Newされていたら、初期化を行わない、という処理にしたいのです。
よろしくお願いします。

例)
・VB6.0で
Load(Form1)

・VB.NETで
Dim Form1 As Form1
Form1 = Form1.DefInstance
> 一つのモジュール内で、formをロードしている箇所が複数あった場合、
> 何度もNewするわけにはいかないですよね。(コード内容にもよりますが)
.NETでは、ロードとNewは同じことです。と言うか、Newにロードも含まれる、という説明がいいのかな。
Loadって何だっけ? と思って自分の昔のコードを見たら、VB6では次のように記述していました。
' VB6
Set frm = New Form1
Load frm
frm.show
これが、VB.NETでは次のようになります。
' VB.NET
frm = New Form1
frm.Show()

> ・VB.NETで
> Dim Form1 As Form1
> Form1 = Form1.DefInstance
ちなみに、DefInstanceというプロパティはありません。
VB6からVB.NETへのソースのアップグレードの説明でDefInstanceが出てきますが、
おそらくコンパイルエラーを起こさせるために、アップグレード時にDefInstanceを
挿入するようになっているのではないでしょうか。つまり、アップグレード後、
ユーザーが自分で修正する必要がある箇所を、修正しないままコンパイルが通ってしまう
ことを避けるために。
> .NETでは、ロードとNewは同じことです。と言うか、Newにロードも含まれる、という説明がいいのかな。
> Loadって何だっけ? と思って自分の昔のコードを見たら、VB6では次のように記述していました。
> ' VB6
> Set frm = New Form1
> Load frm
> frm.show
> これが、VB.NETでは次のようになります。
> ' VB.NET
> frm = New Form1
> frm.Show()
>
>>・VB.NETで
>>Dim Form1 As Form1
>>Form1 = Form1.DefInstance
> ちなみに、DefInstanceというプロパティはありません。

すみません、ちょっと混乱してきてしまいました。
アップグレードウィザードを使用すると、自動的に以下のようなShared Property
ができていました。
でも、このDefInstanceプロパティは使用しない方が良いのでしょうか

#Region "アップグレード ウィザードのサポート コード"
 Private Shared m_vb6FormDefInstance As Form1
 Private Shared m_InitializingDefInstance As Boolean
 Public Shared Property DefInstance() As Form1
  Get
   If m_vb6FormDefInstance Is Nothing OrElse m_vb6FormDefInstance.IsDisposed Then
    m_InitializingDefInstance = True
    m_vb6FormDefInstance = New Form1
    m_InitializingDefInstance = False
   End If
   DefInstance = m_vb6FormDefInstance
  End Get
  Set
   m_vb6FormDefInstance = Value
  End Set
 End Property
#End Region
たいちさん、NowhereManさん、こんにちは。深山と申します。横槍失礼します。

No4264
> VB6からVB.NETへのソースのアップグレードの説明でDefInstanceが出てきますが、
> おそらくコンパイルエラーを起こさせるために、アップグレード時にDefInstanceを
> 挿入するようになっているのではないでしょうか。つまり、アップグレード後、
> ユーザーが自分で修正する必要がある箇所を、修正しないままコンパイルが通ってしまう
> ことを避けるために。

 上記に付いて少し。
 アップグレード ウィザードを実際に触られた事のある方はご存知かと思いますが、
DefInstance はこれにより自動生成される Public Shared なプロパティです。
 ですので、 No4251 でたいちさんが書かれてるように

    Dim Form1 As Form1
    Form1 = Form1.DefInstance

と記述して問題なく使用することが出来るかと思います。
# 少なくとも、この点に関してコンパイルエラーとなることはありません。


 VB6 では Option Explicit を設定していても フォーム名をそのままオブジェクト変数の
ように扱うことが出来ました。
 変数宣言をせずに

    Form1.Show

としても Form1 は表示されましたよね。
 こういう記述をされていた場合、アップグレード ウィザードで変換されたコード内の
どこかで変数宣言してあげないといけない。でも、適切な宣言がされてるかどうかを調べて、
なければ追加する‥‥等ということをするのは大変です。
 その辺りのことを解消する為に、サポート コードとして DefInstance が生成されてる
ものと思われます。


> このDefInstanceプロパティは使用しない方が良いのでしょうか

 上述のようなものですので、使用して問題になるということはありません。
 ただ、これを使わずにNowhereManさんが例として示されてるような VB.NET での
コーディングにし直した方のがすっきりするかと思います。
 「取り敢えず VB6 からの移行が出来れば良い」というのなら兎も角、今後も VB.NET での
開発をされるのでしたら VB6 からの変更点について調べてみては如何でしょう?
深山さん
DefInstanceに関するフォローありがとうございます。
アップグレード・ウィザードは本格的には使用したことがなかったので、
誤解していました。
■No4271に返信(NowhereManさんの記事)
> 深山さん
> DefInstanceに関するフォローありがとうございます。
> アップグレード・ウィザードは本格的には使用したことがなかったので、
> 誤解していました。
>

NowhereManさん、深山さん、ありがとうございました!
すっごいすっきりしました。
ヘルプだけだと分からない事だらけでした。
勉強になりました!
解決済み!

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