じゃんぬのどっとてきすと

雑記とネタと時々プログラミング

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  982  : 記事  4  : コメント  15594  : トラックバック  277

ニュース

My Website

初心者向けのサイトです。

C# と VB.NET の入門サイト

最近のできごと

少し前に女のコが生まれました。家事と育児と仕事にと奮起しています。めちゃくちゃかわいいです。あと Blog の更新は全然してませんが、Twitter とかでアホなこと呟いています。見つけることができたら、ぜひフォローしてあげてください。けっこう喜びます。

Sponsored Link1

Sponsored Link2

Archive

書庫

VB6.0 (Visual Basic 6.0) では、Form そのものの「型」を、実体 (インスタンス) のように扱えてしまいます。たとえば、下記コードの Form2 は、ある Form の「型」であるのにも関わらず、直接 Show メソッドを呼び出せてしまいます。

VB6.0 - フォームの「既定のインスタンス」を利用

'/** Form1 クラス */
Option Explicit

' CommandButton1 をクリックすると Form2 が表示される
Private Sub Command1_Click()
    Call Form2.Show
End Sub

これは、Form2 という「型」と同名の「既定のインスタンス」があるという考え方で良いでしょう。つまり、Form2 という型にアクセスするだけで、同名のグローバルな 'Form2' が、暗黙的にインスタンス化されるということです。

暗黙的にインスタンス化された「既定のインスタンス」は、アプリケーション内全体でアクセス可能な、単一のインスタンスです。

Form2 という型で直接アクセスしようとした時に、VB が勝手にインスタンス化 (暗黙的にインスタンス化) をしています。実際、Form2 内に含まれるメンバを呼び出すと、Form2 は Initialize イベント (コンストラクタ) が実行されます。

さて、Form2 は「型」に過ぎませんから、本来は次のように「インスタンス (実体)」を生成して、そのインスタンスから Show メソッドを呼び出します。

VB6.0 - 明示的にフォームのインスタンスを生成

'/** Form1 クラス */
Option Explicit

' CommandButton1 をクリックすると Form2 が表示される
Private Sub Command1_Click()
    Dim f2 As Form2
    Set f2 = New Form2

    Call f2.Show
End Sub

まず、インスタンスを生成して f2 に参照として Set しています。その後、f2 に含まれるインスタンスから Show メソッドを呼び出しています。

このような、正当な方法を利用するメリットはいくつかあります。

  • インスタンスを生成することで、初期化が保証される
  • スコープを狭めることができる (例のコードでは Command1_Click プロシージャ内でのみ有効)
  • 結果、他の場所から勝手に呼び出されてしまう心配がない
  • 外部のどこから操作されているのか明確になる
  • 別のインスタンスを作って複製可能

既定のインスタンス (暗黙的なインスタンス化) を使用すると、上記のメリットとは逆の結果になります。

  • 初期化されないので (微少の) パフォーマンス向上になる (場合もある)
  • どこからでも呼び出せるので場合によっては楽 (スパゲティになることもある)
  • ソースの記述量が減り、簡素化されている (ように見える)

では、既定のインスタンス (暗黙的なインスタンス化) を、防ぐにはどうすれば良いのでしょう? 既定のインスタンスが最初に使用される時は、前述したように「Initialize イベント (コンストラクタ)」が実行されます。これを、うまく利用できないかと思いついたのがこちらの方法。

VB6.0 - 既定のインスタンスの使用 (暗黙的なインスタンス化) を防ぐ

'/** Form2 クラス */
Option Explicit

' コンストラクタ
Private Sub Form_Initialize()
    Set Form2 = Nothing
End Sub

上記のように、インスタンス化されたところで、とっとと参照を解放してしまうのです。この状態で、既定のインスタンスを利用しようとすると、

実行時エラー '91':

オブジェクト変数または With ブロック変数が設定されていません。

という実行時エラーが起こります。参照がないから当たり前ですよね。

グループ開発でルールを守らない方がいても、これなら安心です。仮に、Form2 のコンストラクタをコメントアウトしても、誰がコメントアウトしたのかは VSS でわかります。

さて、困ったことに、VB8 (VB2005) で、既定のインスタンス (暗黙的なインスタンス化) が復活してしまいました。VB2005 については、また明日にでも書こうと思います。

制限するためのオプションが何故ないのかと、小 1 時間(ry

投稿日時 : 2006年10月25日 10:08

コメント

# re: VB6.0 で Form の「既定のインスタンス」(暗黙のインスタンス化) を防ぐには? 2006/10/25 10:20 未記入
>困ったことに、VB8 (VB2005) で、既定のインスタンス (暗黙のインスタンス化) が復活してしまいました。

私も驚きました。
Moduleも属性で表現されていたので、この動作も属性で実装されていないか心配です。
もし属性で実装されているのなら、リフレクションによりパフォーマンス劣化してしまうので、パフォーマンスが悪い言語になってしまいますね・・・
困ったものだ。

# re: VB6.0 で Form の「既定のインスタンス」(暗黙のインスタンス化) を防ぐには? 2006/10/25 16:12 こじこじ
VB2005での回避方法って何かないんでしょうか?

# VB2005 で Form の「既定のインスタンス」(暗黙のインスタンス化) を防ぐには? 2006/10/26 9:45 じゃんぬねっと日誌
VB2005 で Form の「既定のインスタンス」(暗黙のインスタンス化) を防ぐには?

# re: VB6.0 で Form の「既定のインスタンス」(暗黙のインスタンス化) を防ぐには? 2006/10/26 12:35 じゃんぬ
回避方法を書いてみました。

# 複数のフォーム間で、データをやりとりする 2006/11/21 23:39 何となく Blog by Jitta
複数のフォーム間で、データをやりとりする

# re: VB6.0 で「Form の既定のインスタンス」を防ぐには? 2012/12/21 23:54 まっちゃ
Form2.Showでなにも違和感を感じていなかった自分。
プログラマとしての年数が「教えてもらってない」の言い訳が通らない年数経ってしまった。
明日から既存のコードを見直します。

# JBwzZdxNyv 2014/07/19 9:10 http://crorkz.com/
YE2y89 Awesome article post. Great.

# dgDZBjOICym 2014/08/07 2:01 http://crorkz.com/
qYMVOL Very informative blog article.Thanks Again. Fantastic.

# uCvCKMgGDnDRrNSxMP 2014/08/28 13:25 http://crorkz.com/
lXsv3H Excellent website. A lot of useful info here. I'm sending it to a few friends ans also sharing in delicious. And of course, thanks for your effort!

# lTrykFJsjNDGqNSCx 2014/09/18 16:39 http://kayteas.info/story.php?id=27203
yRvcx9 Thanks for the blog article. Keep writing.

# qpwaxugyoci kxeyhyhcc algmlpvy
2014/12/13 17:24 VictorOt
http://www.boberator.com/cs/20141211105423039.htmlhttp://www.westleyessary.com/cs/20141211105423640.htmlhttp://www.geitnerenviron.com/cs/20141211105423128.html http://www.whittiertransfer.com/sea/2014121111560602348.htmlhttp://www.techgrowth.org/sea/2014121111563607409.htmlhttp://www.stpaulpublishing.com/sea/2014121111563676168.html http://www.shielslumber.com/mase/20141211143457690.htmlhttp://www.guthriecenter.com/mase/20141211143457954.htmlhttp://www.fiberchar.net/mase/20141211143457945.html
http://www.guioncomunicaciones.com/cs/20141211105424365.htmlhttp://www.datmengineering.com/cs/20141211105423599.htmlhttp://www.westleyessary.com/cs/20141211105424013.html http://www.wjnewf.com/sea/2014121111573711788.htmlhttp://www.sidnythain.com/sea/2014121111573793084.htmlhttp://www.sccest.com/sea/2014121111573737063.html http://www.deckersupply.com/mase/20141211143457719.htmlhttp://www.lakesregionwater.com/mase/20141211143457968.htmlhttp://www.godinoco.com/mase/20141211143457873.html
The right implies regarding paying for several singular Ugg shoes or boots would be tohttp://www.webehikin.com/cs/20141211105423249.html an attempt to look for types out there inside close up using the time, which are frequently presented by the quite a few take care of the actual supplemental highly http://www.greenlevelgroup.com/cs/20141211105424861.htmlviewed web sites precisely wherever these shoes or boots can often be http://www.totalretailgroup.com/sea/2014121111573763965.htmlunveiled. By looking to get regarding like reductions then you certainly tend to be a lot more prone tohttp://www.listingpro.us/cs/20141211105423454.html turn into forthcoming with a couple of shoes or boots the legitimate posting as being an various other select to them evolving into fakes or even copiehttp://www.bellanovamedspa.com/cs/20141211105423475.htmlhttp://www.northerntouchcustoms.com/cs/20141211105423018.htmlhttp://www.compassion4animals.org/cs/20141211105423024.html http://www.sauerandleibensperger.com/sea/2014121111573792835.htmlhttp://www.techgrowth.org/sea/2014121111573781119.htmlhttp://www.stpaulpublishing.com/sea/2014121111573873721.html.

# XehCJITNFHc 2015/04/19 21:59 sally
9M6VzC http://www.FyLitCl7Pf7kjQdDUOLQOuaxTXbj5iNG.com

Post Feedback

タイトル
名前
Url:
コメント: