投稿日 | : 2004/11/05(Fri) 15:07 |
投稿者 | : 魔界の仮面弁士 |
Eメール | : |
URL | : |
タイトル | : Re^2: Setコマンドが省略できない理由 |
自分で「プロパティ」を実装してみると、わかるかも知れませんね。
代入プロパティの宣言には、「Property Let」と「Propert Set」という2種類がありますから。
ちなみに、Pictureオブジェクトの代入に対しては、
Set Picture1.Picutre = LoadPicture("C:\A.BMP")
と、
Picture1.Picutre = LoadPicture("C:\A.BMP")
のどちらの構文も使えます。
本来であれば、Pictureオブジェクトの代入時にも、Setを使うべきなのですが、
古いバージョンとの互換性維持のため、後者の記述も例外的にサポートされています。
ただ、Setを使わなくて良いのは、「標準コントロール」の場合だけであり、
ActiveXコントロールの場合は、Setを使って代入しなければなりませんので、
結局の所、「オブジェクトの代入では、常にSetを使う」と覚えておくのが吉でしょうね。
> > Dimが省略された場合はVariantで単純変数ですわね。
Option Explicitを有効にしている場合は、Dimは省略できませんね。
(その場合でも、As句の記載を省略する事はできますが)
で、より正確に表現するなら、「Variant型になる」というよりは、
「規定のデータ型になる」という事ですね。
(規定のデータ型の指定も無い場合は、Variantが使われる)
> 以下のコードを実行してみれば省略できない理由がわかるかも
代入時は、Setが使えるから良いのですが、引数指定で渡すときには、
処理が曖昧になるので、厄介なんですよね…。
Dim RS As ADODB.Recordset
Set RS = New ADODB.Recordset
RS.Fields.Append "NUMBER", adInteger
RS.Open
RS.AddNew "NUMBER", 123456
'========
' 括弧を付けるだけで、結果が変化します。
'========
Debug.Print TypeName( RS )
Debug.Print TypeName( (RS) )
Debug.Print TypeName( RS() )
Debug.Print TypeName( RS!Number )
Debug.Print TypeName( (RS!Number) )
Debug.Print TypeName( RS!Number() )
Debug.Print TypeName( (RS!Number()) )
Debug.Print TypeName( RS!Number()() )
# それぞれの TypeName 関数が、どのような値を返すのかを、
# 実行せずに正しく答えられるようなら、上級者と呼べるかな。(^^;