投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/7/5 11:22:38
雑談ついでに、懐古趣味で VB2 当時の事についても書いておきます。

# VB6 ならいざ知らず、さらに前の VB の話題は、インターネット上には殆ど無いんですよね…。
## 当時はインターネットが普及しておらず、パソコン通信やニュースグループが主体でしたし。


>> VB6のときは、ByRefがディフォルトだったんですね。
> VB6 というか、VB1/VB2 の頃の名残です。
ちなみに VB2 当時は、そもそも ByRef というキーワードすらありませんでした。すなわち、
「値を変更されたくない場合のみ ByVal を付ける」という言語仕様だったのです。
Sub Test1 (ByVal s As String)
    s = "New Text1"
End Sub

Sub Test2 (s As String)
    '省略すると、今でいうところの ByRef 相当の動作となります。 
    'VB2 では、ByRef s As String と記述すると構文エラーとなります。 
    s = "New Text2"
End Sub

Sub Test3 (s As TextBox)
    '下記は OK です。 
    s.Text = "New Text"

    '下記はコンパイルエラーとして処理されます。 
    '「仮引数として指定された変数には Set ステートメントは使えません」 
    'Set s = Me.Text1 

    'なお、仮引数を「ByVal s As TextBox」で宣言するのもコンパイルエラーです。 
    '当時はユーザー定義型だけでなく、オブジェクト変数も値渡しできなかったのです。 
End Sub


そのため、キーワードとしての ByRef が登場した後も、デフォルトが参照渡しであることは
変更できなかったのです。歴史的な事情から、ByVal をつけるのは開発者の意図である事が明らかですが、
ByRef をつけないことは、開発者が参照渡しにすることを想定していたかどうかが分からないからです。


> VB4以降とそれより前とでは型システムが微妙に異なるのですが、
この型システムについてですが、VB2 当時は利用可能なデータ型が非常に限定されていました。

というのも、クラスモジュールの登場は VB4 からであり、当時は自作可能な型といえば、
Form1 や Form2 などのユーザー定義のフォーム型、それにユーザー定義型だけだったのです。

当時のプリミティブ型は、Integer、Long、Single、Double、Currency、String、Variant の
7 種であり、これに固定長文字列型である String * n を加えた物だけが、利用可能な
プリミティブ型宣言のすべてでした。

 ・なお、これら 7 種類(固定長文字列型も含めれば 8 種類)のデータ型の中から、
  万能型である Variant を除いた 6 種類には、それぞれ型宣言文字 %,&,!,#,@,$ が
  割り当てられています。この仕様は VB6 まで受け継がれる事になり、VB6 の時代においても、
  Byte、Boolean、Date、Object、Variant に対しては型宣言文字が用意されることはありませんでした。
 ・ちなみに、型宣言文字という概念は Visual Basic の時代に用意された物では無く、その前身たる
  BASIC 言語の時代から存在していた物です(ただし、処理系によっては使用できない型文字もありました)。
 ・当時 `配列` とは、型ではなく変数の一形態でした。ゆえに「As Integer()」のような宣言は
  できませんし、Variant 型に配列を格納する事も出来ませんでした(Variant 配列は作れましたが)。
 ・定数(vbInformation など)はありましたが、列挙型(VbMsgBoxStyle など)はありません。
  列挙型が登場したのは、VB4 の時代になってからです。
 ・なお、vbModal や vbModeless といった定義が登場したのも VB4 からです。VB6 のヘルプにおいて、
  Form の Show メソッドや ZOrder メソッドの引数説明に、定数(列挙型の値)が利用されておらず、
  単に 0 や 1 といったマジックナンバーが使われているのも、VB2 当時のヘルプの名残です。
 ・False や True というキーワードはありましたが、Boolean という型はありませんでした。
  Variant 変数に代入した場合、False は Integer 型の 0、True は -1 で管理されました。
  このため、以降のバージョンで登場した Boolean 型は、1 bit 型や 1 バイトの型ではなく、
  16bit(2 バイト)の型として用意される事になりました。
 ・日付型を内部形式として持つバリアント型(VarType = 7)はあったものの、
  プリミティブなデータ型としての Date 型はまだ存在していませんでした。
  DateSerial や DateAdd の戻り値が Date 型では無いのも、当時の流れを組んでいるからです。
 ・日付型が存在しないため、当時は CDate 関数もありません。その代わりに、VarType 7 (日付)な
  バリアント型に変換するための CVDate 関数がありました(VB6 でも下位互換性の為に残っています)。
 ・ちなみに、Byte 型もありませんでした。Object/Date/Boolean は VB4 で登場した型です。


> 今でいうところのVariant型や総称Object型を扱う分には、
上記にも書きましたが、VB2当時はまだ As Object という宣言は許されていませんでした。
利用可能なオブジェクト型とは、以下のものだけです。

 ※スペシフィックな型※(固有な型とか具体的な型といった意味)
  MDIForm
  ユーザー定義のフォーム型(Form1、Form2 等)
  標準コントロール型(TextBox、Label、PictureBox 等)
  カスタムコントロール型(Grid、OLEClient 等)

 ※ジェネリックな型※(総称的な型とか汎用的な型といった意味)
  Form (MDIForm +ユーザー定義のフォーム型)
  Control (標準コントロール型+カスタムコントロール型)


なお VB6 以降では、それぞれ「固有オブジェクト型」「総称オブジェクト型」という表記法に
変わっており、スペシフィックやジェネリックといった用語は使用されなくなっています。
(ジェネリック型については、VB2005 から別の意味合いで使われるようになりましたけれどね)