2011-02-25 15 views
4

"Unload frmMain"のようなコードを見ていますが、frmMainが型/モジュール名であることから、 "ObjFrmMain"ソートの変数名と同時に考えることはできません。それにもかかわらず、このコマンドは問題のフォームをアンロードするのに成功します。VB6では、データ型の名前を付けるだけで、フォームインスタンスをシングルトンとして参照できますか?または何が起こっている?

既存の単一のインスタンスのエイリアスとして使用されるデータ型は同じですか?あるいは、そのすべてのインスタンスのために?

VB6はフォームから派生したもの以外のデータ型と同様のことをしますか?

+0

各クラスのフォームについてのみ、暗黙のグローバル 'Dim frmMain As New frmMain'があります。これは 'SELECT ... WHERE Field LIKE frmMain!TextBox.Text'の種類のクエリを使用できるMS Accessのコーディングスタイルとの互換性のために残されています。 – wqw

答えて

7

はい、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つです。特に、シャットダウンしようとしているときです。

+0

trueですが、この回答は、より一般的な「シングルトンオブジェクトの扱い」ではなく、「フォームの扱い」を示すために改訂する必要があります。限り、私が知っているように、VB6では、この動作はフォームのためだけです。これは新しいプログラマーのためのものを単純化することを意図していましたが、問題を多く混乱させる傾向がありました。一般的に、私は必要なフォームを常にインスタンス化することに賛成して、これを避けました。ちょうどネットで試してみましたが、フォームタイプを直接参照してそれを表示することはできます。私はまだその構文から離れて言うだろう... – DarinH

+0

@drventure:フォームのシングルトンの性質は、経験豊富なVB6開発者にとって期待される動作です。アプリケーションでシングルトンセマンティクスを使用する必要がある場合は、これを避ける必要はありません。実際、あなたがVB6を学びたいならば、このことを詳細に理解しなければなりません。いったんやったら、それは大きな問題ではありません。 –

+2

これはシングルトンではなく、(Form)クラスと同じ名前のデフォルトグローバルインスタンスです。 VB6クラスでも同じことができますが、IDEの外で.CLSファイルを編集する必要があります。どちらの場合でも、クラスのインスタンスを必要な数だけ作成することができます。したがって、それらはシングルトンではありません。 http://ja.wikipedia.org/wiki/Singleton_pattern – Bob77

2

はい、これはVB6以前の特別な機能です。私は通常、それを避けることを試みました。なぜなら、私はそれを助けよりもむしろ混乱の源泉と見なしていたからです。

次のコメントVisual Basic 6.0およびそれ以前のバージョンでは、各フォームの特別な既定のインスタンスが自動的に作成され、フォームの名前を使用してこのインスタンスにアクセスすることができます。は、このMSDNページから取得しました。Working with Multiple Forms in Visual Basic .NET: Upgrading to .NET

関連する問題