- ベストアンサー
Letステートメントの使い方について
http://oshiete1.goo.ne.jp/kotaeru.php3?q=307244 に書込もうとしたら締め切られたので,質問という形で投稿します。 Private Sub Command1_Click() Dim a As Object Let a = Label1 End Sub を実行すると 実行時エラー91:オブジェクト変数が設定されていません。 になります。 どういう理由でしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>オブジェクト変数へ代入もLetで行なうという仕様でも何も問題がないと思います。 そう開発者も思ったのででしょう、VB7ではSetに統一されました。 以前は、おそらく、オブジェクトとオブジェクトインスタンスとそのプロパティと変数とを、それぞれ分離して考えたかったのでしょう。 >文法の設計上何か理由があるのでしょうか? 中途半端なオブジェクト指向がそうさせたのでしょう。 オブジェクトとそれ以外を分けたいという。 .NETでは、そこら辺はJava的になっています。 >Let Text1 = Label1 >は >Let text1.text = Label1.caption >を省略したものと解釈されます(変なの) textとcaptionは、それぞれデフォルトプロパティです。 要は、そのオブジェクトの中で頻繁に使われるプロパティであり、いつも指定するのは面倒だから省略してもいいじゃん、ってことでしょう。 なので、省略された場合は、デフォルトプロパティを指定したと解釈します。 紛らわしいので(開発者がそう思ったのかどうかは知りませんが)、VB7ではデフォルトプロパティはなくなりました。 参考まで。
その他の回答 (3)
Setに統一されたのとトレードオフで、規定のプロパティを省略できなくなりました。 Dim a As Object Let a = Label1 というコードを見せられて、Captionプロパティの値を入れようとしているのか、インスタンスを参照させようとしているのか、判断つきません。 a = Label1.Caption Set a = Label1 これらはVB6.0以前では明確に別の処理なのです。
Label1は、フォーム上に設置したLabelオブジェクトのインスタンスでしょうか? Letは、変数やプロパティに値(式の結果)を代入するステートメントです。 また、Letで変数やプロパティに代入できるのは、同じデータ型(またはユーザ定義型)の値だけです。 この場合、aがオブジェクトであるため、代入できません。 オブジェクト変数に、オブジェクトまたはオブジェクトインスタンス(への参照)を代入する場合、Setを使うことになります。 ですので、 Set a = Label1 として、LabelオブジェクトのインスタンスであるLabel1を参照するようにします。 Letを使うのは、例えば、 Dim a As String Let a = Label1.Caption という場合です。 詳しく載っているサイトが見つからなかったので、とりあえず1つだけ参考URLを上げておきます。
補足
回答ありがとうございます。 質問307244でLetとSetの話が出ていますが、そこの結論に 納得できなかったので質問を立てました。 そもそもSetは何故必要なのだろう、以前から疑問でした。 オブジェクト変数へ代入もLetで行なうという仕様でも何も問題が ないと思います。 文法の設計上何か理由があるのでしょうか? ちなみに Let オブジェクト(変数) = オブジェクト(変数) は、標準プロパティから標準プロパティへの代入となります。 Let Text1 = Label1 は Let text1.text = Label1.caption を省略したものと解釈されます(変なの)
- project-a
- ベストアンサー率54% (107/195)
エラーとなったときにヘルプを参照するとエラーの説明が表示されます。 この場合は、Let ではなくて Set ではないでしょうか?
お礼
回答ありがとうございます。 なるほど、変な文法もVB.NETで改善されたわけですね。 Visual Basic 6.0 ユーザーのための Visual Basic.NET 移行ガイド 4.4すべてがオブジェクト型 4.4デフォルトプロパティ http://www.microsoft.com/japan/msdn/net/vbtransitionguide/