はい、VB6には奇妙なオブジェクト動作があります。これは、フォームオブジェクトを処理するためのいくつかのショートカットを提供します。
Load frmMain
...は、その変数名でそのフォームの1つのインスタンスを読み込みます。実際:
frmMain.lblSomeLabel.Caption = "some caption"
...このインスタンスをロードします。しかし:
frmMain.SomeStringMember = "some value"
...しません負荷フォームオブジェクト(ウィンドウ自体を意味する)が、本質的には、フォームの名前はグローバル変数であるので、あなたは、これらの変数にアクセスすることができます。
ただし、新しいインスタンスを作成することができます。
Dim newForm As MyForm
Set newForm = New MyForm
newForm.Show vbModal
使用すると、1つのフォームの複数のインスタンスを持つことができますので、実際には、MyForm
の新しいインスタンスを作成し、それをロードし、それを表示します。
もNew
キーワードで奇数判定には注意してください:
Dim newObject As New MyClass
Set newObject = Nothing
newObject.SomeStringProperty = "some value"
これは、「オブジェクト参照を設定していない...」エラーなしで動作します。 As New
構文を使用して参照変数を宣言すると、オブジェクトをNothing
に設定して破棄し、その変数を再び参照すると、が新しいインスタンスを作成します。
実際にフォームで実際に行われていることです。暗黙のがあります:
Dim frmMain As New frmMain
は個人的に私はそれが混乱と危険だから
As New
構文を使用しません。パフォーマンスペナルティは、これに対して:
Dim newObject As MyClass
Set newObject = New MyClass
...しかし、あなたはフォームのためにそれに固執しています。
Unload frmMain
に電話すると、ウィンドウ(およびすべてのコントロール)がアンロードされ、その中のすべてのデータがなくなるため、オブジェクトfrmMain
がまだハングアップしています。したがって、アンロードした後でも、引き続きメンバー変数とプロパティにアクセスできます。ただし、フォーム上のコントロールを参照すると暗黙的にLoad frmMain
がトリガーされます。これは、VB6での微妙なプログラミングエラーの原因の1つです。特に、シャットダウンしようとしているときです。
各クラスのフォームについてのみ、暗黙のグローバル 'Dim frmMain As New frmMain'があります。これは 'SELECT ... WHERE Field LIKE frmMain!TextBox.Text'の種類のクエリを使用できるMS Accessのコーディングスタイルとの互換性のために残されています。 – wqw