特集:第3回 Visual Studio .NETプログラミングの勘どころ(3/6 ページ)

» 2004年08月11日 08時45分 公開
[石井宏治,ITmedia]

Windows Formsではデザイナの読み込みに注意

 クライアント アプリケーションの場合にも同じことが言える。Windows Formsのフォーム デザイナは、HTMLデザイナよりは問題が少ないが、それでも予測しない場所を書き換えられてしまうことがある。

 Windows Formsのデザイナは、実際にそのオブジェクトを作成し、コードに直す時に生成されているオブジェクトを見て必要なコードを書き出す。コードに変更分を入れるわけではなく毎回コードを生成しなおすため、ある程度以上の複雑さを持つWindows Formsでは順番などが変わってしまうことがしばしばある。また実行時にロードするDLLに入っているコントロールなど、Visual Studioのデザイナがロードできなかったものでは、デザイナを読み込み、そして保存するだけで削除されてしまう場合もある。

Windows Formsの場合

 ASP.NETの場合と同様に、必要な場合以外にはデザイナを読み込まない、という自衛手段が有効だ。

 Windows Formsの場合には若干操作が異なる。ソリューション エクスプローラでフォームのソースファイルを右クリックし、[ファイルを開くアプリケーションの選択] をクリックする。表示される画面では、「CSharpフォーム エディタ」などが選ばれているはずだ。

 ここで「C# エディタ」を選択し、「既定値として設定」をクリックしておけば、次からフォームをダブル クリックするとコード エディタが表示される。その状態で「Shift」+「F7」キーを押せば、デザイナに切り替えられるのもASP.NETと同じだ。

 RAD向けのVB.NETならまだしも、C#ではこちらを既定にしておいてほしいとも思うが、いちど設定しておけば覚えておいてくれるので、Visual Studioをインストールしたら必ず設定しておこう。

ユーザー コントロールの利用

 ASP.NETでも、Windows Formsでも、コントロールの機能を拡張するユーザー コントロールが用意されている。このクラスを使えば、ひとまとまりのコントロール群をひとつのコントロールとして扱うことができる。ソフトウェアを設計する上でモジュール化を進めるにあたってこれはもちろん有用な機能であるが、デザイナでの問題を避けるためにも有用なので積極的に使っていこう。

 ASP.NETフォームおよびWindows Formsのデザイナはどちらも複雑度がある程度以上になると問題が起きる頻度が高くなる。例えば、タブ コントロールを使って複数のタブを持つダイアログを開発する際、タブごとにそれぞれひとつのユーザー コントロールを作り、タブ中には該当ユーザー コントロールひとつだけ、という作りにしておくことができる。

 この手法は、デザイナの問題を避けるだけでなく、前述のモジュール化を進める上でも有用だ。また、Windows Formsのフォームは、読み込みに意外と時間がかかる。特にオプション画面のようにコントロールの数が多いダイアログでは、顕著に現れてしまう。ある程度の論理ブロックごとにユーザー コントロールにしてあれば、必要になるまでは、例えば該当タブが表示されるまでユーザー コントロール自身を作らない、といったコードもより簡単に記述することができるはずだ。

ロジック層のコンポーネント

 Visual Studioには、データベースにアクセスするADO.NETのDataAdapterなどをビジュアルに編集できるデザイナが付属している。

 ウィザードが生成するコードは若干冗長な部分もあり、そのままプロダクションで利用できる形にはなかなかならないが、それでもメンテナンス用の画面で使ったり、チューニングする元のコードとして使う分には十分便利だ。同時実行の制御を楽観的に行うオプションのオン、オフなどもウィザード内で行うことができる。

 これらのデザイナは、ツールバーからASP.NETのページやWindows Formsのフォームにドロップすることで利用できるが、ページやフォームなどのプレゼンテーション層とロジック層、あるいはデータ層を分離したい場合、通常のクラスにはデザイナがないのでドロップできない。

 このような場合には、クラスを作成する時に新しい項目の追加で「コンポーネント クラス」を選んでおこう。このファイルをダブル クリック、あるいは前述の「Shift」+「F7」キーを押してデザイナ表示すれば、該当個所にドロップしてウィザード起動することができる。

 すでに作成済みのクラスがある場合には、そのクラスを「System.ComponentModel.Component」クラスのサブクラスにすれば、ソリューション エクスプローラのアイコンが変わり、デザイナで読み込むことができる。Componentクラスのオーバーヘッドが気になれば、デザイナでの編集が終了した際、Componentのサブクラスから外しても大丈夫だ。

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ