The road to C# master trapemiya

C#を中心に、.NETの話題を取り上げます。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  256  : 記事  1  : コメント  10763  : トラックバック  30

ニュース

Since 2005年10月26日

わんくま同盟

わんくま同盟

Microsoft MVP


Visual Developer - Visual C#

記事カテゴリ

書庫

日記カテゴリ

囚人さんのブログで、旧 Visual Basic は何をもたらしたのか
http://blogs.wankuma.com/shuujin/archive/2006/06/22/31137.aspx
という話題があり、その中に、「Form1 から Form2 へどうやれば値を渡せるか?」という質問が頻繁に繰り返されるということが書いてあった。
確かにそうであり、同じ回答を何度も書くのもなんだかなぁと思うので、私の私見的回答を代表してここに書いておきますので、検索してここに辿り着いた人は参考にして下さい。

本題です。
「Form1 から Form2 へどうやれば値を渡せるか?」ですが、この質問が出る背景には、オブジェクト指向をよく理解しないままにVB.NETを始めたか、オブジェクト指向はある程度理解しているが、Formをクラスだと認識していないところから来ていると思います。Fromクラスなんていうふうに、わざとクラスという文字を明記した方がかえってわかりやすいのかもしれません。
VB6の時のフォームはフォームというVB6独特のものですが、VB.NETのフォームはクラスだという違いを、はっきりと認識できていないんだと思います。どちらもフォームという名前ですから、無理もないかもしれません。フォームがクラスということが認識できれば、あとは、クラス間でどうやって値を受け渡すのかを調べれば良いのです。

上の文章ではVB.NETという言葉を使いましたが、もちろん、C#などでも同様です。

投稿日時 : 2006年6月24日 11:43

コメント

# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/06/24 12:01 じゃんぬ
VB6 のフォームも立派なクラスです。
アクセス修飾子もありますし、別インスタンスを作れるのですから。
私は、このあたりの概念は両者で区別することはありません。
(制限事項の多さでは区別する必要はありますが、概念で区別する要素はないですね)

VB6 でまともにクラス モジュールを扱える人であれば、Form をクラスとして見ることは容易だったでしょう。
私の周りを見るに、おそらく、人口層的にそこに達している人があまりに少ないのではないかと思います。

VB って意外と奥が深い (他の言語より隠れている要素が多すぎるので) のに、
とりあえず動くからという理由で、安直に扱われていたりしますからね。
VB の場合、ターゲット層がターゲット層なので仕方ないですね。

# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/06/24 12:31 囚人
確かに Form という物を特別視している節がありますね。
そして VB8 でそれが再び…。

# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/06/24 16:43 trapemiya
VB6でクラスというと、一般的にはクラスモジュールに書かれたクラスのことになりますが、クラスという概念をどう定義するかによって、VB6のフォームはクラスなのかそうじゃないのかの判断がわかれそうです。まぁ、いずれにしても、貧弱なクラスと言えなくはないかな?とも思います。
ただ、一般的にVB6のフォームをクラスと認識している人は言われるようにほとんどいないでしょうから、クラス的な扱いをしていた人もほとんどいないでしょう。。それで、VB.NETの完全なるクラス(この表現も微妙ですが)であるフォームとの違いに戸惑うのでしょう。
VB6では、Form2から、Form1.TextBox1.Textなんて参照できてしまうので、これが当たり前だと思っていた世界から来たら、戸惑うのも無理ありません。
ちなみに偉そうなこと言っている自分も戸惑いましたw

囚人さん、そうなんです。VB8で再び・・・。VB.NETとC#の方向性の違いがだんだん出てきたわけですが、どっちの考えがいいのか今のところ私には判断できません。
個人的にはVB8の方向性は好きじゃないけど、プログラムなんて所詮道具なんだから、簡単で便利な方が良いのかもしれません。どちらが工数がかからないか?という判断も出てくるんでしょうね。

# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/06/27 17:40 アクア
はじめて書き込みます。

工数がかからないと言う点では、VB8の功績は大きいと思います。
VB7はオブジェクト指向を大幅に取り入れた分、VB6ユーザーの不満の声がかなりあったと聞きました。
ひねくれ者の私はVB6からVB7に移行しなかったユーザの取り込みを狙ったものと判断しています…

初心者の所感ですが、VB8はVB6をかなり意識して作られたような気がします。
ですがコアな技術が違う分、あとあと多くの苦労を強いられそう…というのは気のせいですか?^^;



# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/06/28 19:42 じゃんぬ
他の言語のクラスと比べて貧弱だからといって 「クラスでない」 わけではありません。
アクセス修飾子とインスタンス化が成り立てば、定義上は 「クラス」 です。
(継承を必須だと思ったりするから、クラスでないという目で見るのではないでしょうか)

直接扱えるように見えるのは、「暗黙的なインスタンス化」 によるものですので、モジュールとは仕組みは当然違います。

Form がクラスでないという方は、Label や TextBox も「クラスでない」と言うかもしれません。
両者で大きく違うのは 「暗黙的なインスタンス化」 くらいだと思います。

このあたりは、1 年半前に、VB を始めた時に、1 番最初に学んだところでした。
なんせ、「クラス モジュールで何ができるのよ?」 という状態でしたからw

# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/06/28 19:45 じゃんぬ
VB8 の 「暗黙的なインスタンス化」 については、個人的には非常に残念です。
別にあっても良いですけど、禁止オプションを設けて欲しかったです...
(この話題では、いつも言っていますが...w)

とりあえず、私のユニットでは 「禁止」 するということで、
VB7 と同じように扱っていこうかと思っております。

# あ、My も禁止しようと思っています。
# NCL に、慣れていくべきだと思いますから。

ついでに関連リンク。
http://www.ailight.jp/blog/myamyu/archive/2004/04/22/1641.aspx
http://www.ncfreak.com/magazine/No.003/vb_class.html

# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/06/28 20:52 trapemiya
>>アクアさん

こんにちは。

>工数がかからないと言う点では、VB8の功績は大きいと思います。

その点に関しては私もそう思います。実際、ぎりぎりのところで仕事をしていると、この機能を盛り込むか盛り込まないかは工数にかかっていますから。(^^; ただ、この工数が微妙で、優秀なSEさんであればOOP的にやっても工数は膨らまないのかもしれませんが、優秀なSEさんを育てるのもOOPの場合は大変でしょうから、そうなるとやっぱりOOP的に組まない方が現実的になっちゃうんでしょうね。

>ひねくれ者の私はVB6からVB7に移行しなかったユーザの取り込みを狙ったものと判断しています…

もう一つは、プログラミングを始める人の敷居を低くしたいということもあるのでしょう。

>ですがコアな技術が違う分、あとあと多くの苦労を強いられそう…というのは気のせいですか?^^;

VB6とはコアな技術が違うので、やはり頭の切り替えがどこかで必要になるのかもしれません。普段はVB8を使わない私は、経験値が乏しくてあまりよくわかりませんが(^^;

>>じゃんぬさん

>アクセス修飾子とインスタンス化が成り立てば、定義上は 「クラス」 です。
(継承を必須だと思ったりするから、クラスでないという目で見るのではないでしょうか)

確かに言われてみればそうですね。インスタンスの元であれば良いわけですから。そういう意味では、インスタンス化できるということがクラスの十分条件かな?

>VB8 の 「暗黙的なインスタンス化」 については、個人的には非常に残念です。
別にあっても良いですけど、禁止オプションを設けて欲しかったです...

全く同意見です。これからプログラミングを始める人も、プログラミングでOOPをどんどんやりたい人も、どちらも吸収できるようになったVB8なので、その人用にカスタマイズできてもいいんじゃないかと思います。

# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/07/01 12:03 アクア
>>trapemiyaさん
アクアと申します。あらためてごあいさつ申し上げます。
また、私のつたない文章にコメント下さりありがとうございます。

私の場合ですが、わたくしがプログラムを始めた1年程前、VB6とVB7を入手して双方で勉強し始めたのですが、インスタンスの宣言が必須(?)の
VB7と必ずしもそうでないVB6の動きにかなり戸惑いました。(当然OOPなんて言葉も知らないころ)

じゃんぬさんやTrapemiyaさんが言われているように『暗黙的なインスタンス化』について(暗黙的に囚人さんも同じことを言われていると思いますが)、勉強中という立場の私も強く賛同いたします。

私の最初の頃の経験した疑問として
VB6のMsgBox関数と、
VB7のMessageBoxクラス
似た動きなのにMessageboxの表示にどうして.showがいるの?と思いました。
さらに調べていくとMessageboxクラスについてはインスタンス化してないのになぜ使用できるの?と、当初からおおいに疑問を感じました。
いまでも十分に理解している訳ではありませんが、クラスとインスタンスを学ぶ大きなきっかけとなりました。

このような経験も踏まえた上で、皆様と同様にVB8ではクラスのインスタンス化を明示するをデフォルトに、暗黙のインスタンス化をオプションにして頂きたかったと思います。

# re: 「Form1 から Form2 へどうやれば値を渡せますか?」という質問の多発を考える 2006/07/04 17:31 trapemiya
>>アクアさん

確かにOOPは初心者にとって敷居が高いものだと思います。加えて、デリゲートやらインターフェースやらジェネリックやら、どんどん覚えるべきことが膨らんでいます。そこで、VB8では初心者がやさしく入れることを目標の一つにしたのだと思います。
しかし、OOPは素晴らしい技術です。今のところこれに変わるものはまだ育っていません。なので、やっぱりいずれOOPに沿った設計なりプログラミングをできるように、初心者の方も移行できることを願ってやみません。いつまでも初心者ではないのですから、そこで止まらないで突き進んで欲しいと思います。

Post Feedback

タイトル
名前
Url:
コメント