DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Formの事なんですが

  • 題名: Formの事なんですが
  • 著者: どとねと4日目
  • 日時: 2004/09/28 11:28:09
  • ID: 6363
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[WindowsXP , .NET Framework1.1.4322]
分類:[.NET]

初めて投稿致します。超初心者な質問で申し訳無いのですが…、どなたかお知恵を貸して頂けないでしょうか。

現状は
Form_00 に、ボタンを5つ配置(Button01,Button02,Button03,Button04,Button05)
各ボタンをクリックする事で、各ナンバーに対応した Form が開く
(Form01,Form02,Form03,Form04,Form05)
例:Button03 をクリックすると、Form03が展開

Private Sub Button01_Click(ByVal sender As …) Handles Button01.Click
Dim f01 As New Form01
f01.ShowDialog(Me)
f01.Dispose()
End Sub

を5つ並べて実現は可能になったのですが、これを5つ並べるのではなく1つで何とかしたいと思っているのですがどのような方法があるのでしょうか?

現在、Handles の部分で Button01 〜 Button05 を並べてイベント自体は1つにして、sender を使って If,ElseIf 文で分け、ShowDialog と Dispose に関しては、関数化をしてる状態なのですが、結局ボタンが増えた場合、New によるインスタンス及び、If,ElseIf 文の部分がボタンの数量分必要となってしまいます。

これらをどうにか Button がいくつ増えてもすっきりしたものにしたいのですが、どのような方法があるでしょうか?ありましたらお教え頂ければと思います。よろしくお願い致します。
■No6363に返信(どとねと4日目さんの記事)
> 初めて投稿致します。超初心者な質問で申し訳無いのですが…、どなたかお知恵を貸して頂けないでしょうか。
>
> 現状は
> Form_00 に、ボタンを5つ配置(Button01,Button02,Button03,Button04,Button05)
> 各ボタンをクリックする事で、各ナンバーに対応した Form が開く
> (Form01,Form02,Form03,Form04,Form05)
> 例:Button03 をクリックすると、Form03が展開
>
> Private Sub Button01_Click(ByVal sender As …) Handles Button01.Click
> Dim f01 As New Form01
> f01.ShowDialog(Me)
> f01.Dispose()
> End Sub
>
> を5つ並べて実現は可能になったのですが、これを5つ並べるのではなく1つで何とかしたいと思っているのですがどのような方法があるのでしょうか?
>
> 現在、Handles の部分で Button01 〜 Button05 を並べてイベント自体は1つにして、sender を使って If,ElseIf 文で分け、ShowDialog と Dispose に関しては、関数化をしてる状態なのですが、結局ボタンが増えた場合、New によるインスタンス及び、If,ElseIf 文の部分がボタンの数量分必要となってしまいます。

できないことはないのですが...

同じFormならば、イベントハンドラを統合するのは有効です。
しかし、今回は違うFormを開くのですから、イベントハンドラを統合する有益性がわかりません。
素直にそれぞれのイベントハンドラでやるべきだと思うのですが。
それって冗長なんでしょうか?

結局別の動きをさせるのにイベントハンドラを統合する理由がわかりません。
結局、統合しておきながら、条件分岐するのは冗長じゃないのですか?

イベントの概念も崩れるし、型の概念も崩れてしまう実装は止めた方が良いと思います。
■No6363に返信(どとねと4日目さんの記事)

どとねと4日目さん、こんにちは。

ボタンのTagプロパティにインスタンス化したいクラス名(フォーム名)
を入れておく。
イベント処理では、そのクラス名をもとにインスタンスを生成する。
という処理ではどうでしょうか。

文字列からインスタンスを生成する方法が、Tipsに掲載されています。

[文字列で指定されたクラスのインスタンスを作成する]
http://dobon.net/vb/dotnet/programing/createinstancefromstring.html
  • 題名: Re[2]: Formの事なんですが
  • 著者: SH
  • 日時: 2004/09/28 12:54:33
  • ID: 6367
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
どとねと4日目さん java.lang.Nullpoさん こんにちは。

僕もjava.lang.Nullpoさんと同意見です。

同じような処理をするのが面倒・・と思っての質問。なのでしょうか??
やって出来ないことはないと思いますが、そこに有益さが見られません。。

これだと例えば、一つのボタンの挙動を変えたら
全部のボタン処理をテストしなおし??
みたいな感じですよね ^^;

例えば、一つのボタン押下で画面の条件によって開くFormを変えたい。
とかならこういう工夫をするのは有効だと思えますが、
今回の質問内容の場合、それぞれ別々にするのが普通だと思いますよ。
> ■No6363に返信(どとねと4日目さんの記事)
>
> どとねと4日目さん java.lang.Nullpoさん SHさん こんにちは。
>
はじめまして平ちゃんです。
私も皆様と同意見です。

勉強のためにと言う質問でしたらこのようなことも出来ます。

フォームにボタンを1つつくる。
このボタンを押すとForm1、Form2....Form5と言うボタンができる。
この出来たボタンを押すとそのフォームができる。

これはFor ループで作りますのでループ回数で好きなだけフォームが作成できます。

但し皆様が仰るとおり何の役に立つのかわかりません。
ボタンをたくさん作る場合は電卓などの数値キーのような似たキーを作るのに役立ちますが、フォームの場合は?です。

こんなのも当然出来るということでコードは勉強して作って自分で作ってください。
がんばってください。VB.Netは楽しいですよ。
みなさん、こんにちは。
私も皆さんと同意見です。
考えて欲しいのは、後でメンテナンスや拡張する際、他の人が見ても直ぐに対応できるようにコーディングする…と云うのが理想ではないでしょうか?
となると、面倒でも、新しいフォームのインスタンスコードを追加した方が解り易いと思いますよ。
皆様、こんにちは。
フォローありがとうございます。(実は、ちょっと安心してます)

■No6386に返信(ぺがらぼさんの記事)
> 考えて欲しいのは、後でメンテナンスや拡張する際、
> 他の人が見ても直ぐに対応できるようにコーディングする

私も、その通りだと思います。
可読性を考えて、型を明示化するのも同じ理由です。
今回の例ですと、同じような処理とはいえ、別の型のインスタンスを呼ぶのですから、
イベントの概念が崩れると思ったのです。

また、コードの簡素化はされると思いますが、速度的にはどうでしょうか?
体感速度は変わらないと思いますが、実際には遅くなっていると思います。
今回の例だと、イベントを統合しておきながら、中で分岐(または取得)しようとするからです。

ちょっと関係ない話ですが、
オブジェクト指向の最大の魅力は「継承」とか「ポリモーフィズム」ではなく、
カプセル化による可読性であることだと思います。(実際、継承は必須条件ではない)
しかし、機能ごとにプロシージャ(メソッド)を分担しないと、
カプセル化していても、可読性を損なう良くないプログラムになると思います。
そういう意味で、機能を提供する箇所(イベント・メソッド・プロパティ)は、
曖昧(または素直でないような処理)にしてはいけないと思います。

# まあ、その当たりは非オブジェクト指向でも同じですが。
# (良いプログラム == モジュールの独立性が良い == 呼ばれる側を意識しない関数の集合体)
返信遅れまして申し訳ございません。

丁寧で分かりやすいたくさんの返信、皆様本当にありがとうございます。

質問させて頂いた件ですが、最終的に皆様がおっしゃった様に、
イベントを分割し、新しく出来たForm表示の部分でSubとして分けて
各ボタンのイベント毎に呼び出す形としてコーディングする事になりました。

返信して下さった皆様、本当にありがとうございました。
解決済み!
コンボボックスで開くフォームを選択してもらってはどうですか?

駄文かもしれませんが;
  • 題名: Re[8]: Formの事なんですが
  • 著者: java.lang.Nullpo
  • 日時: 2004/10/01 11:38:55
  • ID: 6441
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
2004/10/01(Fri) 11:39:16 編集(投稿者)

■No6438に返信(らうさんの記事)
> コンボボックスで開くフォームを選択してもらってはどうですか?

それでも、ぱるさんが説明してくれた方法(No.6366)のように型情報を取得するか、
または、完全な遅延バインディングを使うしかありません。

Buttonをいくつも配置することは避けられますが、結局内部の処理は同じことになります。

# Buttonをいくつも配置することについての意見かもしれませんが。

> 駄文かもしれませんが;

私は、提案というのも良いと思いますよ。
可能性が色々広がりますから。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板