Page 581 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼NEWキーワードについて 水無月 04/3/27(土) 13:32 ┗Re:NEWキーワードについて YU-TANG 04/3/27(土) 16:33 ┣Re:NEWキーワードについて YU-TANG 04/3/28(日) 6:01 ┗Re:NEWキーワードについて 水無月 04/3/29(月) 8:54 ┗Re:スコープ YU-TANG 04/3/29(月) 22:01 ┗Re:スコープ 水無月 04/3/30(火) 9:04 ─────────────────────────────────────── ■題名 : NEWキーワードについて ■名前 : 水無月 ■日付 : 04/3/27(土) 13:32 -------------------------------------------------------------------------
こんにちは。 何度も申し訳ないとは思うのですが、どうしても理解できないことがありまして、どなたかお教えください。 現在本で勉強してまして、ADOのところを読んでいるのですが、その初歩で躓いています。 オブジェクト変数の宣言と、変数への参照の代入ということで下記が記されていました。 Dim rs ADODB.Recordset Set rs = New ADODB.Recordset ここで一行目の変数rsの宣言は分かります。 でも二行目の説明として「新規Recordsetオブジェクトへの参照を代入する」とありますが、どういう意味ですか? 初歩的な質問で申し訳ないのですが、宜しくお願いいたします。 |
こんにちは、YU-TANG です。 > Dim rs ADODB.Recordset > Set rs = New ADODB.Recordset > > ここで一行目の変数rsの宣言は分かります。 > でも二行目の説明として「新規Recordsetオブジェクトへの参照を > 代入する」とありますが、どういう意味ですか? 実体はそこにはなく、別の領域に確保されたオブジェクトへの ポインタを格納している、という意味です。 New 演算子はオブジェクトのインスタンスを作成して、その ポインタを返します。 たとえて言うなら、組み込み型変数の宣言 Dim i As Integer の 「i」は、Integer 型の変数の実体を指します。「i」を訪ねると、 実際にそこに i さんが住んでいて会える、というイメージです。 それに対して、オブジェクト型変数の宣言 Dim rs ADODB.Recordset の「rs」は、ADODB.Recordset 型の無名オブジェクトの住所を書く ための白紙の紙が 1 枚あるだけで、本人はまだそこにはいません (まだ生まれていません)。 New ADODB.Recordset によって ADODB.Recordset 型の名無しさん (なんか 2ch みたいだな ^ ^;)がメモリアドレス上のどこかに 誕生し、その名無しさんの住所が返ります。それを rs に Set で 代入することにより、rs という紙に名無しさんの住所が書き込まれ ます。 「rs」を訪ねても、実際にそこにオブジェクトは住んでいませんが、 住所が書いてあるので連絡は取れる、というイメージです。 これは細かく突っ込んでいくと、本の一章が埋まるテーマです。 この辺は VB/VBA の良質な入門書であれば、必ず数ページを割いて 解説していますので、一度書店等で感性の合うものを見繕ってみては いかがでしょうか。 |
> New 演算子はオブジェクトのインスタンスを作成して、その > ポインタを返します。 「New」は演算子じゃないすね。(^^; うっかりミスです。 |
YU-TANG さん、ご回答ありがとうございます。 難しいですけど、なんとなく分かったような気がします。 >たとえて言うなら、組み込み型変数の宣言 Dim i As Integer の >「i」は、Integer 型の変数の実体を指します。「i」を訪ねると、 >実際にそこに i さんが住んでいて会える、というイメージです。 >それに対して、オブジェクト型変数の宣言 Dim rs ADODB.Recordset >の「rs」は、ADODB.Recordset 型の無名オブジェクトの住所を書く >ための白紙の紙が 1 枚あるだけで、本人はまだそこにはいません >(まだ生まれていません)。 >New ADODB.Recordset によって ADODB.Recordset 型の名無しさん >(なんか 2ch みたいだな ^ ^;)がメモリアドレス上のどこかに >誕生し、その名無しさんの住所が返ります。それを rs に Set で >代入することにより、rs という紙に名無しさんの住所が書き込まれ >ます。 >「rs」を訪ねても、実際にそこにオブジェクトは住んでいませんが、 >住所が書いてあるので連絡は取れる、というイメージです。 組み込み型の変数の「i」はIntegerという形をしているというその実体を表現していて、オブジェクト型の変数の「rs」はADODB.Recordsetという囲いの中にいることを表現していて、更にNew ADODB.Recordsetによってその囲いの中に新しい体が生まれ、それをSetで「rs」という名前とイコールで結ぶ。 という解釈でいいんでしょうか?自分なりに頭の中で想像してみたのですが・・・。 でもその場合よく考えたら、「i」とか「rs」とかは同じモジュール内に何個もいたらだめなのではないでしょうか。同じ名前の変数があちこちにあったらどれがどれだか分からなくて混乱しますよね。ということは、変数名は全て違うものにする必要があるのでしょうか? また初歩的な質問で申し訳ないですが、どうかお返事よろしくお願いいたします。 |
> オブジェクト型の変数の「rs」はADODB.Recordsetという囲いの中に > いることを表現していて、更にNew ADODB.Recordsetによってその囲い > の中に新しい体が生まれ、それをSetで「rs」という名前とイコールで > 結ぶ。 > という解釈でいいんでしょうか?自分なりに頭の中で想像してみたの > ですが・・・。 ちょっと違います。 オブジェクト型変数は 4 バイトしかありません。オブジェクトに よってはとんでもなく巨大なサイズのオブジェクトも有りますが、 どれも一律 4 バイトです。 なぜかというと、メモリアドレスしか格納しないからです。 比喩的に言うなら単なる私書箱であって、とても人が住めるサイズ ではありません。 実際のオブジェクトは埼玉県春日部市とか、どこか他の場所に 住んでいるわけですが、私書箱に投函すればどこに住んでいようが メッセージは届く理屈です。 オブジェクト変数とはあくまで紙っぺら一枚分のサイズしか無く、 その紙っぺらに住所が書いてあるだけ、とお考えください。 「rs」はその紙を指しているだけです。 本来この概念を説明するには、図を交えて少なくとも数ページ分の 紙幅を要するのが通例です。私ごときが掲示板で説明するのはムリ が有ります。 ぜひ良質のプログラミング入門書を手に取られることをご検討 ください(本当に基礎を入れるのであれば C の方がよいです)。 # …と言い切っちゃうと、異論が出そう… (^ ^; あるいは VB/VBA は極力その辺の概念を隠蔽して開発者にラクを させようという思想で作られた言語ですので、「オブジェクトは Set で代入」と割り切って何も考えない、というスタイルでも、 凝ったことをしなければしばらくは問題ないと思います。 # 個人的には、そこまで隠蔽するなら Set キーワードなんて # 要らねぇんじゃねーか、どうせオブジェクト型変数に Let は # 出来ないんだから、コンパイル時に判別できるだろうに、とも # 思いますが、なんかそれなりの理由が有ったのでしょうね。 > 「i」とか「rs」とかは同じモジュール内に何個もいたら > だめなのではないでしょうか。 今度はスコープ(適用範囲)という、これも VB/VBA の基本テーマに 入っています。 同じ変数が宣言されていても、スコープが違えば適用範囲や優先順位が 異なるので、問題は有りません。同一スコープ内で同一変数を複数回 宣言したら、問題が起きるでしょう。またスコープを理解していないと、 書いたコードが言語仕様的には問題なくても、意図の問題で実装ミスが 発生するかもしれません。 詳しくは VBA のヘルプで「適用範囲」、「参照可能範囲」、「有効期間」 辺りのキーワードで関連トピックを検索するとよいでしょう。 上記テーマも VB/VBA の良質な入門書であれば、必ず数ページを割いて 解説しています。 私は水無月さんの使っていらっしゃる本が具体的にどんな内容なのか 分かりませんので推測するしかありませんが、こういった基本的な 事項の解説が軒並み欠落しているのであれば、ひょっとすると基本事項 は了解済みの中級者以上を対象にしている本なのかもしれません。 その場合は、繰り返しになりますが、基本を網羅した良質の入門書から 先に取り組んでみることをお奨めします。 プロの方の分かりやすい解説には、やはり対価を支払うだけの価値が あると思いますので。 個人的な話をすると、私の場合はほとんどヘルプと試行錯誤のみで習得 しましたが、とても他人様にはお奨めできません。 私も明日スカイダイビング中の事故で両脚、右腕、右耳と Access の 知識が損傷したら、今なら谷尻かおりさんの本あたりで勉強し直すと 思います。 # いや、せっかくパソコンスキルを空に出来るんだから、格闘家とか # ホストとか板前を目指すのが本筋か? |
YU-TANG さんお返事ありがとうございます。 >オブジェクト変数とはあくまで紙っぺら一枚分のサイズしか無く、 >その紙っぺらに住所が書いてあるだけ、とお考えください。 >「rs」はその紙を指しているだけです >本来この概念を説明するには、図を交えて少なくとも数ページ分の >紙幅を要するのが通例です。私ごときが掲示板で説明するのはムリ >が有ります。 >ぜひ良質のプログラミング入門書を手に取られることをご検討 >ください(本当に基礎を入れるのであれば C の方がよいです)。 なんとなくですが、分かったような気がします。あくまで気がするだけですが(^^;) たしかに図とかで解説してないと難しいですね。私が読んでいるのは応用プロブラミングとかいう題名の本でした。一応ページは割いて解説してあるのですが変数の宣言の仕方が書いてあるのであって、変数の宣言の意味などはすでに理解しているものとされているのでしょう。今度ちゃんと初心者用の解説書を探してきます。 >今度はスコープ(適用範囲)という、これも VB/VBA の基本テーマに >入っています。 >詳しくは VBA のヘルプで「適用範囲」、「参照可能範囲」、「有効期間」 >辺りのキーワードで関連トピックを検索するとよいでしょう。 >上記テーマも VB/VBA の良質な入門書であれば、必ず数ページを割いて >解説しています。 すみません。適用範囲については解説書の最初の方に書いてありました(^^;) すでに読んでいる箇所だったのですが、そのときは変数に関して理解していなかったので、適用範囲についても意味も分からず読み流したため、そんなことが書いてあることすら覚えていませんでした。お恥ずかしい話です。これからその部分をもう一度勉強してみます。 >個人的な話をすると、私の場合はほとんどヘルプと試行錯誤のみで習得 >しましたが、とても他人様にはお奨めできません。 >私も明日スカイダイビング中の事故で両脚、右腕、右耳と Access の >知識が損傷したら、今なら谷尻かおりさんの本あたりで勉強し直すと >思います。 ># いや、せっかくパソコンスキルを空に出来るんだから、格闘家とか ># ホストとか板前を目指すのが本筋か いやいや、パソコンスキルを空にしても、そこにもう一度同じスキルを習得しなおすはめになるような気がします。それがパソコン中毒者というものでしょう(^^;) |