C#プログラミングTips

コモン・ダイアログを使う

デジタルアドバンテージ
2001/07/25


[注意]

本稿でご紹介しているサンプル・プログラムは、.NET Framework SDKベータ2 英語版をベースに開発・検証されています。クラスライブラリなどが変更されているため、ベータ1ではコンパイルできませんのでご注意ください。

 周知のとおりコモン・ダイアログ(common dialog)は、ファイル・オープン時の[ファイルを開く]ダイアログや、フォント選択時の[フォント]ダイアログ、色選択時の[色の設定]ダイアログ、印刷時の[ページ設定]ダイアログなど、多くのアプリケーションにとって汎用性の高い処理を統一的な手段で実現できるようにするために、Windowsによって提供される標準のダイアログ・ボックスである。これによりプログラマは、独自にゼロからダイアログを設計する手間から解放されると同時に、ユーザーは、同じような処理でアプリケーションごとに異なる流儀が横行することなく、アプリケーションによらず共通の操作を行えるようになる。コモン・ダイアログは、あらかじめWindowsシステムの一部として用意されている。

 今回は、C#プログラムからコモン・ダイアログを呼び出す例についてご紹介しよう。

6種類のコモン・ダイアログ

 .NET Frameworkのクラス・ライブラリから使用可能なコモン・ダイアログには、次の6種類がある。いずれもWindows環境ではお馴染みの面々なので、ここで使い方を解説する必要はないだろう。

[名前を付けて保存]コモン・ダイアログ [ファイルを開く]コモン・ダイアログ
[印刷]コモン・ダイアログ [フォント]コモン・ダイアログ
[ページ設定]コモン・ダイアログ [色の設定]コモン・ダイアログ

 これらのコモン・ダイアログのためのクラスは、次の図のように、CommonDialogクラスをベース・クラスとする派生クラスで実装されている。先の6つの画面は、抽象クラスを除いた6つのクラスからそれぞれのインスタンスを作成し、各クラスが共通して実装しているShowDialogメソッドをそれぞれのインスタンスについて呼び出しただけで表示されるものだ。

コモン・ダイアログに関連したクラスの階層
各コモン・ダイアログは、CommonDialogクラスをベース・クラスとする派生クラスとして実装されている。

サンプル・プログラム c#at2

 今回は例として、[ファイルを開く]ダイアログを使用してみる。通常、コモン・ダイアログは、Windowsアプリケーションでメニューなどから開くのが一般的だが、今回は少し趣向をかえて、別稿「ファイル入出力の基礎」で作成したコンソール・アプリケーションである「c#at」(UNIX「cat」コマンドのC#バージョン)でコモン・ダイアログを使用してみる。このプログラムは、コマンドラインで指定された1つ以上のファイルを連結して画面に出力するコンソール・アプリケーションだった。このプログラムを少し改良して、コマンドラインでファイルを指定しなかった場合、[ファイルを開く]ダイアログを表示し、ダイアログ・ボックスからファイルを選択できるようにしてみる。もちろん、ダイアログボックスでは複数のファイルを選択できるようにしておく必要がある。

 このサンプル・プログラム「c#at2」のソース・コードは次のようになる。ただし、ファイルをオープンし、コンソールに書き出すという後半部分は、c#atとほぼ同じである。

 1: // c#at2.cs
 2:
 3: using System;
 4: using System.IO;
 5: using System.Text;
 6: using System.Windows.Forms;
 7:
 8: public class CatSample2 {
 9:   public static void Main(string[] args) {
10:     if (args.Length == 0) {
11:       OpenFileDialog ofd = new OpenFileDialog();
12:
13:       ofd.InitialDirectory = Directory.GetCurrentDirectory();
14:       ofd.Filter           = "テキストファイル (*.txt)|*.txt|"
15:                                 + "すべてのファイル (*.*)|*.*";
16:       ofd.FilterIndex      = 2;
17:       ofd.Multiselect      = true;
18:
19:       if (ofd.ShowDialog() == DialogResult.OK) {
20:         args = ofd.FileNames;
21:       } else {
22:         return;
23:       }
24:     }
25:     string line;
26:
27:     foreach (string arg in args) {
28:       FileStream   fs = new FileStream(arg, FileMode.Open);
29:       StreamReader sr = new StreamReader(fs,
30:                               Encoding.GetEncoding(932));
31:
32:       while ((line = sr.ReadLine()) != null) {
33:         Console.WriteLine(line);
34:       }
35:       sr.Close();
36:       fs.Close();
37:     }
38:   }
39: }
c#atの改良版c#at2のソース・コード

ダイアログ・ボックスのプロパティ設定

 コマンドラインにパラメータが指定されていない場合,つまり“args.Length == 0”の場合に[ファイルを開く]ダイアログを開く。最初は、OpenFileDialogクラスのインスタンスを生成し、必要なプロパティを設定する。

11: OpenFileDialog ofd = new OpenFileDialog();
12:
13: ofd.InitialDirectory = Directory.GetCurrentDirectory();
14: ofd.Filter           = "テキストファイル (*.txt)|*.txt|"
15:                           + "すべてのファイル (*.*)|*.*";
16: ofd.FilterIndex      = 2;
17: ofd.Multiselect      = true;
OpenFileDialogクラスのインスタンスを生成し、必要なプロパティを設定する

 13行目のInitialDirectoryプロパティには、[ファイルを開く]ダイアログ・ボックスを表示するときに、ファイル一覧を表示するデフォルトのディレクトリを文字列で指定する。特定のパスを文字列で指定することも可能だが、今回の例では、コマンドが起動されたときのディレクトリを設定したいため、DirectoryクラスのGetCurrentDirectoryメソッドにより、カレントディレクトリを取得している。このメソッドはスタティック・メソッドであるため、インスタンスを生成する必要はない。

 次のFilterプロパティ(14行目)に設定した文字列は、ダイアログ・ボックス内の[ファイルの種類]ドロップダウン・リストボックスの部分で使用される。ユーザーは、開きたいファイルの拡張子などをここで選択する。今回は次のような文字列を指定した。

テキストファイル (*.txt)|*.txt|すべてのファイル (*.*)|*.*
Filterプロパティに設定した文字列

 この文字列では、[ファイルの種類]リストボックスに選択肢として表示される文字列と、その項目が選択されたときに使用されるファイル一覧のためのフィルタのペアを縦棒(|)で区切って並べたものを指定する。通常、フィルタには「*.txt」や「*.*」などのワイルドカードを含めたものを使用する。[ファイルを開く]ダイアログのファイル一覧には、このフィルタのパターンにマッチするファイルだけが表示される。

 続く16行目のFilterIndexでは、今述べたFilterプロパティで複数のペアを指定したときに、どの選択項目をデフォルト値として使用するかを指定する。この例では“2”を指定しているため、ダイアログを表示したときには、2番目のペア(“すべてのファイル (*.*)|*.*”)がデフォルト値として[ファイルの種類]に使用される。つまりダイアログ・ボックスが表示されたとき、ファイル一覧部分には「*.*」にマッチするファイル、すなわち当該ディレクトリのすべてのファイルが表示される。

 最後のMultiselectプロパティ(17行目)は、ファイルの複数選択を可能にするかどうかを指定するためのフラグである。デフォルトでは“false”になっており、1つのファイルしか選択できない。今回は複数ファイルを連結するのが目的なので、これをtrueに設定して、ダイアログで複数ファイルを選択できるようにしておく。

ダイアログ・ボックスの表示

 必要なパラメータの設定が終わったら、次はOpenFileDialogクラスのShowDialogメソッドを呼び出して、ダイアログ・ボックスを表示する。

19: if (ofd.ShowDialog() == DialogResult.OK) {
20:   args = ofd.FileNames;
21: } else {
22:   return;
23: }
ダイアログボックスを表示し、選択されたファイルを取得する

 ShowDialogメソッドを呼び出した時点で、プログラムの制御は表示されたダイアログ・ボックスに移る。つまり、ダイアログ・ボックスで[開く]ボタンか[キャンセル]ボタンがクリックされ、ダイアログ・ボックスが閉じるまで、プログラムは次の処理に進まない。

 ユーザーがファイルを選択して[開く]ボタンをクリックした場合には、ShowDialogメソッドの戻り値として“DialogResult.OK”の値が返される。この場合には、ダイアログ・ボックスで選択されたファイルのパス名がFileNameプロパティに設定される。また、Multiselectプロパティにより複数ファイルの選択をオンにした場合には、選択された複数のファイルのパス名が、FileNamesプロパティに文字列の配列として設定される。今回のサンプル・プログラムでは、本来コマンドラインのパラメータが入っている文字列の配列argsに、このプロパティの値を代入した。後はc#atと同様に、指定されたそれぞれのファイルについて、ファイルをオープンし、その内容をコンソールに表示している。End of Article

「C#プログラミングTips」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間