Last Updated 2011/09/21
このページでは、.NET Framework 対応のコンポーネント(コントロールおよびクラス)に関する情報を提供します。自作のクラスや役に立ちそうなコンポーネントを紹介します。ただし、記事の内容は Windows 環境を前提としていますので、そのほかの環境の場合には参考にならない場合があります。
私が公開するクラスなどについては基本的にフリーウエアです。ソースコードの改変・流用は制限なく可能です。私に使用する旨の許可を得る必要もありません。ただし、私以外の人が作ったものは基本的に作者本人に著作権などを確認してください。
コンポーネントの作り方のページを設けました。まだ、初歩的な段階ですが、徐々に充実していきたいと考えています。
テキストエディタはアプリケーション開発者だけでなく、文章作成の基本的なツールですが、.Net Framework と相性のよいテキステエディタはまだ出現していません。そこで、テキストエディタコントロールを C# で作り始めました。2011 年 6 月の時点で、まだ未完成ですが、完成すれば公開します。
まず、コンポーネントとコントロール、あるいは、クラスとの違いは何かについて書いてみたいと思います。
コントロールという用語を使い出したのは Visual Basic(MS-DOS 版)が登場した頃だと記憶します。したがって、フォームのデザイン時にフォームに貼り付けて使うことのできるビジュアルコントロールをさす言葉として使うことが多いと思います。クラスは、オブジェクト指向プログラミング用語としての意味はハッキリしていますので、説明するまでもないでしょう。一方、コンポーネントの立場はアヤフヤです。使う人によってその定義が異なるからです。
コンポーネントはそれだけで完結した機能を提供するプログラムコードのかたまりと言えるでしょう。したがって、TextBox クラスや Form クラスもコンポーネントと言い換えることができます。事実、Borland 社の Delphi/C++ Builder で使う VCL "Visual Component Library" では、ビジュアルコントロールをコンポーネントと呼んでいます。また、Math クラスのように目に見えないものもコンポーネントといっても差し支えないと思います。
Microsoft の MFC "Microsoft Foundation Class" では「クラス」を使っていますので、Borland 社ではその対抗上、クラスとは呼ばずに、コンポーネントと呼ぶことにしたのかもしれません。
ともあれ、用語というものは使う人によってその意味付けが異なることはよくあることですし、時代によっても刻々と変化しますから、厳密な意味にとらわれる必要はないと考えます。
私自身の考え方を以下にまとめておきます。
VCL のように、何もかもコンポーネントと呼ぶのはよくないと思いますね。また、VCL ではコントロールのクラス型の名前にはじまり、enum 型、構造体などを含めて、名前の先頭に Type をあらわす "T" をつけるのにも抵抗があります。たとえば、フォームオブジェクトは TForm、境界線のスタイルをあらわす enum 型は TBorderStyle といった具合です。型名を見ただけでそれが何であるかを思い浮かべられるようにすべきだと思います。
Windows API 関数を呼び出すコードはいわゆる、アンマネージコード "unmanaged code" になります。しかし、.NET Framework の内部では、API 関数を使いまくっていますから、API 関数を使うこと自体が危険ということではありません。単に、「アンマネージ」であるということにすぎません。ちなみに、「アンマネージ」とは .NET Framework のガベージコレクションの対象にならないコードと理解していいだろうと思います。
アンマネージという言葉の中に、それ以上の意味があるのかもしれませんが、私はこのように理解しています。
アンマネージコードについて、ここで取り上げた理由は、公開されているコンポーネントの多くは .NET Framework の機能にはないので作っているのですから、必然的に API 関数を使う機会が増えます。そこで、アンマネージコードの意味を確認しておきたいと考えたからです。
|
clsStringList clsKinsoku clsWMPSound clsGZipCompression clsXmlIni clsMakeTreeView clsRC2Encrypt clsRC2CryptText clsFileOperation clsSetProgressBar clsTextEncoding clsTextPrint FindFilesEx コントロール ScrollBox コントロール GroupBoxEx コントロール ColorComboBox コントロール ColorSelector コントロール
|
私の主な開発ツールは Borland C++ Builder でしたが、.Net Framework の登場によって、C++ Builder は過去に作ったアプリケーションのメンテナンスにしか使っていません。 2006 年初頭に、.NET Framework 2.0 がリリースされ、これで VCL を上回ったという感じです。しかし、より簡単にクラスを使い切るという意味ではマダマダという感じでした。しかし、WPF の登場によって情勢は一変しました。コンポーネントを自作するという意味では、WPF ならオールマイティといっていいでしょう。ともあれ、このページでは .NET Framework 対応のクラスおよびコントロールだけを扱います |
Borland 社の Delphi/C++ Builder で使う VCL "Visual Component Library" の中に、TStringList コンポーネントがあります。これは、.NET Framework の ArrayList クラスと似ていますが、ファイルやストリームへの入出力機能、また、リストボックスやコンボボックスにリスト項目として直接データを設定したり、取得する機能があります。VCL のクラスの中でも、もっとも優れたものの一つといえるでしょう。.NET Framework にもぜひ追加してもらいたいクラスの一つです。そこで、ないのなら作るしかありません。
clsStringList クラスは ArrayList クラスから派生しましたので、ArrayList クラスの機能はそのまま利用することができます。
次のファイルにはクラスを定義するファイルしか含みませんが、使い方はファイルの中に書いておきました。
clsStringList.lzh (1,641 bytes)
ところで、.Net Framework 2.0 に追加された List<T> クラスは汎用性の高いすぐれものです。このクラスもファイルやストリームへの入出力機能はありませんが、配列やコレクションを扱うときの本命といえると思います。ジェネリックタイプですからオブジェクトを作成したときに型が確定しますので、型キャストの必要がありません。ぜひ検討することをおすすめします。
日本語を扱う場合、禁則処理を避けて通ることはできません。
禁則処理とは、句点 "。" や閉じカッコ "」" が行の先頭にこないようにするとか、読点 "、" や開くカッコ "「" が行の末尾にくることを避ける処理をいいます。
幸い、.NET Framework の Graphics クラスの DrawString メソッドは実用に耐える程度の禁則処理はやってくれますし、RichEditBox コントロールの禁則処理も使えるレベルにあります。しかし、汎用性はありません。たとえば、テキストを印刷するときには充分な機能とはいえません。そこで、作ってみました。
次のアーカイブファイルにはテスト用のプロジェクトファイル、クラスファイル、実行ファイル(EXE ファイル)が入っています。テスト用アプリケーションを実行したら、[実行] ボタンを押してください。アップダウンボタンを操作すると、テキストを折り返す位置を変更し、禁則処理の結果をテキストボックスに表示します。禁則処理すべき文字がどうなるかをテストしてください。
clsKinsoku.lzh (13,255 bytes)
Windows Media Player は現在普及しているほとんどすべての音声ファイルの形式に対応していますので、これを利用しない手はありません。Windows Media Player は COM ベースの WMP.dll ですので、.NET Framework アプリケーションでも参照を追加することで利用できます。まず、プロジェクトに参照を追加する手順を説明しましょう。
よく似た名前がでてきますが、必要なものは WMP.dll のものです。これで、プロジェクトの参照設定に WMPLib が追加され、使用にあたっての名前空間は using WMPLib; です。以後の操作はクラスが担当します。テスト用のプロジェクトは付けませんでしたが、クラスのファイルに使い方を書いておきました。
clsWMPSound.lzh (1,045 bytes)
GZipStream クラスについては Techniques のページで解説しましたが、ここでは単一または複数のファイルを対象として圧縮・解凍する機能をクラス化してみました。圧縮する複数のファイルは String 型の配列で渡し、一つの圧縮ファイルを作成します。解凍は指定のディレクトリ内に元のファイル名で展開します。クラスをテストするためのプロジェクトは付けませんでしたが、使い方はクラスのファイルに書いておきました。
clsGzipCompress.lzh (2,312 bytes)
アプリケーションの多くはカスタマイズ機能、つまり、ユーザーの好みに合わせてアプリケーションの外観や動作方法を調整する機能を持つものです。そのためにはカスタマイズ情報をどこかに保存し、次回の起動時にデータを読み込んで再現しなければなりません。かつては初期化ファイル(.ini ファイル)を使っていました(Windows Vista でも Windows ディレクトリの中に Win.ini ファイルがあるほどです。かつてほどの重要性はありませんが)。
Windows レジストリは Windows 95 時代に導入され、Windows Vista にも引き継がれています。.Net Framework の中にもレジストリを操作する機能があります。しかし、NET 時代になると、Windows 環境以外の環境を考えなければならなくなったため、Windows 環境にしか存在しないレジストリを使うのではなく、XML 形式のドキュメントを使うことが推奨されるようになりました。
Visual Studio の機能として、アプリケーションの設定を簡単に構築する仕組みが提供されています。しかし、ブラックボックス化しているため、何かトラブルがあったときにどう対処すればいいのかが分からないという不安があります。そこで、XML 形式の初期化ファイルを作成するクラスを作ってみました。
フォームのプロパティとバインドする機能はありませんから、自分でデータを保存し、読み込むコードを書かなければなりませんが、それほどの手間とはいえないでしょう。つまり、データを保存するときは WriteValue メソッド、データを読み込むときは ReadValue メソッドを使うだけです。Color 型や Font オブジェクトも各プロパティを文字列化することなく、そのままの形で設定し、また読み込むことができます。たとえば、Color 型であれば、Color 型のまま WriteValue メソッドの引数に設定すればいいし、ReadValue メソッドは Color 型としてデータを返します。
クラスの使い方は伝統的な初期化ファイル(.ini ファイル)と同じです。つまり、セクション名とキー名とを指定し、値を設定・取得します。
また、このクラスにはフォームの位置とサイズを保存する機能も付けました。フォームの Load イベントにデータを読み込んでフォームの位置とサイズを設定するメソッドを呼び出す、また、FormClosing イベント内でデータを書き込むメソッドを呼び出すだけです。実用的に作りましたので、キット気に入ってもらえると思います。
テスト用のプロジェクトは含みませんが、exe ファイルとソースファイルをダウンロードしてください。
XmlIni.lzh (10,774 bytes)
なお、バイナリデータも Base64 でエンコードすれば保存することができます。その場合、このページの下のほうで紹介する clsRC2CryptoText クラスを使えば暗号化した上で保存することもできます。
TeeView コントロールのツリー構造をコードを使って構築するのはかなり面倒なことです。そこで、ファイルまたはストリーム、あるいは文字列配列からツリー構造を記述したデータを読み込むだけでツリー構造を構築するクラスを作りました。データはツリーノードの階層をタブでインデントするだけです。
クラスの使い方はこんな感じ。
emanual.clsMakeTreeView obj = new emanual.clsMakeTreeView(treeView1);
obj.LoadFromFile("node.txt");
テスト用のプロジェクトは含みませんが、exe ファイルとソースファイルをダウンロードしてください。
MakeTree.lzh (6,629 bytes)
RC2 アルゴリズムによる暗号化クラスです。指定のパスワードに基づいて、ファイルまたはストリームの内容を暗号化し、また復号化します。
テスト用のプロジェクトは含みませんが、exe ファイルとソースファイルをダウンロードしてください。
RC2Encrypt.lzh (7,351 bytes)
clsRC2Encrypt クラスはファイルまたはストリームを対象としていましたが、短いテキストを暗号化したいことはありますね。暗号化したデータはバイト配列、または Base64 でエンコードした文字列として返します。Base64 でエンコードすると、XML 形式のドキュメントにも保存することができます。つまり、clsXmlIni クラスと組み合わせて使えば、チョットしたテキストを暗号化し、初期化ファイルに保存することができます。
テスト用のプロジェクトは含みませんが、exe ファイルとソースファイルをダウンロードしてください。
RC2Text.lzh (7,442 bytes)
エクスプローラを使ってファイルのコピーや削除するとき、アニメーションするダイアログボックスが表示されますね。これを実現するクラスです。.Net Framework の中にあってもよさそうな機能ですが、.Net Framework は Windows 環境以外の環境も対象とする建前なので、Windows にしかない機能を加えたくないのでしょうか。残念です。しかし、心配ご無用! なければ作ればいいのです。
クラスの使い方は基本的に SHFileOperation 関数と同じです。ファイルまたはフォルダ(混在していてもよい)をコピー、削除、移動、名前の変更を実行します。削除はゴミ箱行きにすることができます。
このクラスを使って、40,000 個のファイルとフォルダ(サイズは 60 MB)を一気にコピーしたことがありますが、問題なく実行できました。
テスト用のプロジェクトは含みませんが、exe ファイルとソースファイルをダウンロードしてください。
FileOperation.lzh (8,238 bytes)
ステータスストリップコントロールの 1 つのステータスラベル上にプログレスバーを実行時に配置するクラスです。
デザイン時に、ステータスストリップコントロール上にステータスプログレスバーを配置することはできますが、プログレスバーを使わないときでもプログレスバーが表示されてしまいます。できれば、プログレスバーが必要なときにだけ表示するようにしたいものです。そこで、このクラスの登場です。プログレスバーが必要ないときはラベルを表示し、必要になると、プログレスバーを表示します。また、プログレスバーを操作する機能、およびプログレスバーを破棄する機能を持っています。
テスト用のプロジェクトは含みませんが、exe ファイルとソースファイルをダウンロードしてください。
ProgressBar.lzh (5,877 bytes)
.Net Framework は文字をエンコードする手段はいろいろと提供してくれますが、元の文字列がどのエンコーディング方法でエンコードされているかをチェックする機能を持っていません。英語圏の人にはたいした問題ではないのでしょうが、日本語環境では深刻な問題ですね。
一昔前なら、Shift-JIS と決まっていましたが、現在は UTF-8 や Unicode もあって、文字コードの判定は必須の技術となりました。
なければ作るほかありません。幸い、ネット上にはいろいろな言語(C/C++ や Object Pascal など)でその機能を提供するソースコードが公開されています。それらを参考にして、C# のクラスとして作成してみました。
公開されているソースコードをそのまま使ったわけではありませんがヒントはもらいました。個々の作者の方にはソースコードの参照をお断りをしていませんが、ここに感謝の気持ちをあらわしておきたいと思います。蛇足ですが、参照したソースコードの中には正しい判定をしないものもありました。
クラスのテストは、秀丸エディタと Windows 付属の NotePad.exe を利用しました。秀丸エディタにはいろいろな文字コードで保存できる機能がありますので、ASCII、EUC、JIS、Shift-JIS、UTF-8、UTF-16 の各文字コードによるファイルを作成しました。これらのファイルを NotePad.exe で読み込ませてみました。また、それぞれのファイルについて、クラスで判定してみました。その結果を以下に示します。
| 文字コード | NotePad | クラスの戻り値 |
|---|---|---|
| ASCII | 読み込み可 | System.Text.ASCIIEncoding |
| EUC | 同、不可 | System.Text.EUCJPEncoding |
| JIS | 同、不可 | System.Text.ISO2022Encoding |
| Shift-Jis | 同、可 | System.Text.DBCSCodePageEncoding |
| UTF-8 | 同、可 | System.Text.UTF8Encoding |
| UTF-16 | 同、可 | System.Text.UnicodeEncoding |
なお、UTF-16 に対して、クラスはビッグエンディアンとリトルエンディアンとを区別する機能も持っていますので、それぞれに対応するエンコーディングオブジェクトを返します。
以下の圧縮ファイルは実行プログラムとクラスのファイルだけを含みます。テスト用のプロジェクトファイルは含みませんが、実行プログラムを見てのとおり、ファイルを選択するダイアログを表示し、判定結果をテキストボックスに表示するだけです。なお、テストに先立って、秀丸エディタか NotePad.exe を使って、いろいろな文字コードで保存したファイルを作っておいてください。
TextEncoding.lzh (7,358 bytes)
アプリケーションを作成する上で、印刷処理はプリンタというハードウエアを扱わなければならないためでしょうか、結構面倒な作業です。いえ、でした。.Net Framework は必要な作業をすべて面倒をみてくれます。しかし、依然として面倒な作業であることにかわりありません。要するに、テキストファイルを印刷するクラスとか、フォームを印刷するクラスなどがないからです。
日本語のテキストを印刷する場合、いわゆる禁則処理が必要です。禁則処理とは、テキストの行頭に 「、」とか「。」などの句読点がこないようにする、行末に開くカッコがこないようにするなどの処理をいいます。
Graphics クラスの DrawString メソッドは初歩的な禁則処理はしてくれますが、複数のページに渡るテキストを印刷する場合には対処してくれません。ここで紹介するクラスはテキストを禁則処理しながら印刷します。印刷に関係するすべてのプロパティに対応しているわけではありませんが、クラスを雛形にして必要なプロパティを追加することは簡単だと思います。
クラスはファイル名を渡すメソッドのほかに、List<string> オブジェクトを渡すメソッドを用意しましたので、TextBox コントロールのテキストを印刷することができます。
なお、以下の圧縮ファイルはテキストを印刷するクラスのほかに禁則処理するクラスとファイルの文字コードを判定するクラスを含みます。テスト用のプロジェクトは含みませんが、クラスの使い方はファイルの中に書いておきました。簡単ですから迷うことはないでしょう。
TextPrint.lzh (7,853 bytes)
【追記】
フォームを印刷したいという要望は多いようですね。そこで、Technics のページで解説していますので、参考にしてください。
Directory クラスの GetFiles メソッドおよび DirectoryInfo クラスの GetFiles メソッドは結果を受け取るデータ型が異なるだけで、基本的には指定のフォルダ内のファイルまたはフォルダを列挙する機能という点では同じです。しかし、両者ともすべてのデータを取得しおわるまで制御を戻さないという点では共通しています。
一つのフォルダ内に 5,000 とか 10,000 個のファイルがあるとして、その中の一つをある条件で検索する場合でもすべてのファイルの検索を終了するまで次の処理に移ることはできません。
そこで、Windows API 関数を使って指定のフォルダ内のファイルまたはフォルダを列挙するクラスを作ってみました。このクラスはファイルまたはフォルダの検索に成功するとイベントを発生しますので、そのイベントハンドラ内で必要な処理を実行し、もし中止したい場合は検索を中止することができます。
FindFilesEx.lzh (61,316 bytes)
なお、このクラスはイベントを発生するコンポーネント(クラス)の作り方のサンプルでもあります。コンポーネントの作り方に興味のある人は参考にしてください。
Delph/C++ Builder で使っている VCL "Visual Component Library" には TScrollBox コントロールがあります。これはコントロール内部に配置したコントロールのサイズが大きいときに、自動的にスクロールバーを表示して内部のコントロールのスクロールを可能にするものです。ScrollBox コントロールはこれと同等の機能を提供するコントロールです。

画像を表示するときは PictureBox コントロールを使うと便利ですが、これを ScrollBox コントロール内に配置すると、大きな画像の場合には自動的にスクロール可能になります。この場合、PictureBox コントロールの SizeMode プロパティにPictureBoxSizeMode.AutoSize を設定してください。また、PictureBox コントロールの Left プロパティと Top プロパティは 0 に設定してください。
ScrollBox コントロールは ContainerControl クラスから派生しています。独自のプロパティは BorderStyle だけです。
コントロールをツールボックスに登録したときのビットマップの設定などはやっていませんが、各自で手を加えてください。
なお、このコントロールは Visual Studio 2005 で作りました。
ScrollBox.zip (195,085 bytes)
Delphi/C++ Builder で使っている VCL "Visual Component Library" の TRadioGroup コントロールをまねたものですが、グループボックスとラジオボタンを組み合わせたようなコントロールです。文字列の配列型である Items プロパティを設定するだけで自動的に RadioBottan コントロールを作成し、グループボックス内に均等に配置します。
下図は実行時のものですが、ラジオボタンの間隔はグループボタンの高さに応じて自動的に調整します。

GroupBoxEx.lzh (56,890 bytes)
下図を見てのとおりです。140 色の WEB カラーをコンボボックスに表示します。ComboBox クラスから派生し、オーナー描画しています。コントロールの詳細については、「コンポーネントの作り方」を参照してください。

ColorComboBox.lzh (37,148 bytes)
また、カラー選択コントロールで恐縮ですが、下図を見てのとおり、プロパティウインドウで Color 型のプロパティを設定するときにドロップダウンするコントロールとほとんど同じものです。プロパティウインドウのものとの違いは、WEB カラーを名前の順番に並べたページを追加しました。なお、このコントロールは UserControl クラスから派生しています。

ColorSelector.lzh (59,723 bytes)
WEB サイトをあたっていると、.NET Framework 対応のコンポーネントがたくさん公開されています。中には、ソースコード付きのものもありますので、自分で手を加えることもできます。
しかし、千三ですね。「千三」は「せんみつ」と読みますが、1,000 のうち、使えるのは 3 つぐらいしかないという意味です。まさに、玉石混交といえるでしょう。ズバリあたれば、もうけものといったところです。私の場合、恒常的に使っているものは一つもないのですが、テストしてみると、将来使う機会があるかもしれないと思うものはあります。
ともあれ、コンポーネントを公開している WEB サイトを紹介しましょう。丹念にあたれば、ビンゴ! となるかもしれません。
| http://www.c-sharpcorner.com/ | Windows Forms または Windows Controls のページ |
| http://www.developerland.com/default.aspx | C# Windows Forms のページ |
| http://www.codeproject.com/ | C# Windows Forms のページ |
| http://www.bobpowell.net/ | Windows Forms Tips and Tricks のページ |
| http://www.gotdotnet.com/ | Toolbox の Samples - User Samples のページ |
たまたま、英語のサイトばかりになりましたが、日本語のサイトでよいところがあれば、メールで知らせていただけると幸いです。
.NET Framework 対応のテキストエディタコンポーネントを見つけましたので、紹介します。機能は豊富とはいえませんが、十分実用に耐えるレベルにはあると思います。TextBox コントロールでは役不足、RichTextBox コントロールは使いたくないという人には役に立つでしょう。Vector のサイトにありますので次のサイトに飛んでください。
AlpTextBoxコンポーネントその後、このコンポーネントをテストしていて、たいへんなことに気付きました。テキストの折り返しをサポートしていません。要するに、通常のテキストエディタとしては使えません。このコンポーネントはヒョットすると、HTML ドキュメントの編集用として作ったのかもしれません。そうであれば、テキストを折り返さない理由も理解できます。逆に言うと、HETML ドキュメントの編集用としてなら使えます。
.Net Framework 対応のテキストエディタコンポーネントをもう一つ見つけました。しかも C# のソースコードが公開されています。現在も日々更新されていますので、使えるコントロールの一つかもしれません。
http://azuki.sourceforge.jp/index.html
もう一つ紹介します。以下のサイトに入って、[Software] の [Footy2] の「紹介ページ」です。
Visual C++ で作成した DLL を C# のマネージコードで呼び出す DLL を提供していますので、C# や Visual Basic からでも利用できます。機能豊富とは言えませんが、ハイライト表示にも対応していますので、テキストのサイズの制限のない TextBox コントロールとして使うことはできます。なお、禁則処理に少しおかしな点がありますが、そのうち改善されると思います。
コードエディタを使う商用ソフトや HTML エディタ用として利用されているようなので、信頼度は高いのかもしれません。特にハイライト表示の設定に特徴があって、非常に詳細な設定が可能です。
以下のファイルは私が Footy2 を研究する過程で作ったメモです。HTML 形式のヘルプファイルにしておきましたので、参考にしてください。チョット古いので、今でも同じかどうかは調査していません。
footy2.lzh (62,855 bytes)
チャート(日本では通常「グラフ」と呼ぶものです)を作成するコントロールです。詳しく解説するために専用のページを設けましたので参照してください。
−以上−