投稿時間: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 関数が、どのような値を返すのかを、 # 実行せずに正しく答えられるようなら、上級者と呼べるかな。(^^;
|