-// ================================================================================================\r
-// <summary>\r
-// Windows処理に関するユーティリティクラスソース。</summary>\r
-//\r
-// <copyright file="FormUtils.cs" company="honeplusのメモ帳">\r
-// Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
-// <author>\r
-// Honeplus</author>\r
-// ================================================================================================\r
-\r
-namespace Honememo.Utilities\r
-{\r
- using System;\r
- using System.Collections.Generic;\r
- using System.IO;\r
- using System.Reflection;\r
- using System.Windows.Forms;\r
-\r
- // ※ プロパティを含むので、そのまま他のプロジェクトに流用することはできない\r
- using Honememo.Wptscs.Properties;\r
-\r
- /// <summary>\r
- /// Windows処理に関するユーティリティクラスです。\r
- /// </summary>\r
- public static class FormUtils\r
- {\r
- #region リソース関連\r
-\r
- /// <summary>\r
- /// バージョン情報を含んだアプリケーション名を返す。\r
- /// </summary>\r
- /// <returns>アプリケーション名</returns>\r
- public static string ApplicationName()\r
- {\r
- // アセンブリからバージョン情報を取得し、書式化して返す\r
- // ビルド番号・リビジョンは無視\r
- // ※例外なし。もし万が一発生する場合はそのまま投げる\r
- Version ver = Assembly.GetExecutingAssembly().GetName().Version;\r
- return String.Format(Resources.ApplicationName, ver.Major, ver.Minor);\r
- }\r
-\r
- /// <summary>\r
- /// 指定されたファイルを UserAppDataPath\r
- /// → 旧バージョンのUserAppDataPath\r
- /// → StartupPath の順に探索し、その際のパスを返す。\r
- /// </summary>\r
- /// <param name="fileName">ファイル名。</param>\r
- /// <param name="compatible">探索する旧バージョンの最大。</param>\r
- /// <returns>ファイルが存在したパス、どこにも存在しない場合は<c>null</c>。</returns>\r
- /// <remarks>アセンブリ名が変わっている場合、旧バージョンは探索不可。</remarks>\r
- public static string SearchUserAppData(string fileName, string compatible)\r
- {\r
- // 現在の UserAppDataPath を探索\r
- string path = Path.Combine(Application.UserAppDataPath, fileName);\r
- if (File.Exists(path))\r
- {\r
- return path;\r
- }\r
-\r
- // 可能であれば、旧バージョンの UserAppDataPath を探索\r
- if (!String.IsNullOrEmpty(compatible))\r
- {\r
- // UserAppDataPath は\r
- // <ベースパス>\<CompanyName>\<ProductName>\<ProductVersion>\r
- // という構成のはずなので、一つ上のフォルダから自分より前のフォルダを探索\r
- string parent = Path.GetDirectoryName(Application.UserAppDataPath);\r
- if (!String.IsNullOrEmpty(parent))\r
- {\r
- // 現在のバージョンのフォルダ名\r
- string now = Path.GetFileName(Application.UserAppDataPath);\r
-\r
- // 同じ階層のフォルダをすべて取得し、降順にソート\r
- string[] directories = Directory.GetDirectories(parent);\r
- Array.Sort(directories);\r
- Array.Reverse(directories);\r
-\r
- // ファイルが見つかるまで探索\r
- foreach (string dir in directories)\r
- {\r
- string ver = Path.GetFileName(dir);\r
- if (compatible.CompareTo(ver) <= 0 && ver.CompareTo(now) < 0)\r
- {\r
- path = Path.Combine(dir, fileName);\r
- if (File.Exists(path))\r
- {\r
- return path;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- // どこにも無い場合は、exeと同じフォルダを探索\r
- path = Path.Combine(Application.StartupPath, fileName);\r
- if (File.Exists(path))\r
- {\r
- return path;\r
- }\r
-\r
- return null;\r
- }\r
-\r
- /// <summary>\r
- /// 指定されたファイルを UserAppDataPath\r
- /// → StartupPath の順に探索し、その際のパスを返す。\r
- /// </summary>\r
- /// <param name="fileName">ファイル名。</param>\r
- /// <returns>ファイルが存在したパス、どこにも存在しない場合は<c>null</c>。</returns>\r
- public static string SearchUserAppData(string fileName)\r
- {\r
- // オーバーロードメソッドをコール\r
- return FormUtils.SearchUserAppData(fileName, null);\r
- }\r
-\r
- /// <summary>\r
- /// 文字列中のファイル名に使用できない文字を「_」に置換。\r
- /// </summary>\r
- /// <param name="fileName">ファイル名。</param>\r
- /// <returns>置換後のファイル名。</returns>\r
- public static string ReplaceInvalidFileNameChars(string fileName)\r
- {\r
- // 渡された文字列にファイル名に使えない文字が含まれている場合、_ に置き換える\r
- string result = fileName;\r
- char[] unuseChars = Path.GetInvalidFileNameChars();\r
- foreach (char c in unuseChars)\r
- {\r
- result = result.Replace(c, '_');\r
- }\r
-\r
- return result;\r
- }\r
-\r
- #endregion\r
-\r
- #region null値許容メソッド\r
-\r
- /// <summary>\r
- /// <seealso cref="DataGridViewCell"/>が<c>null</c>の場合に空の文字列を返す<c>ToString</c>。\r
- /// </summary>\r
- /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>\r
- /// <returns>渡されたオブジェクトの<c>Value</c>を<c>ToString</c>した結果。<c>null</c>の場合には空の文字列。</returns>\r
- public static string ToString(DataGridViewCell obj)\r
- {\r
- return FormUtils.ToString(obj, String.Empty);\r
- }\r
-\r
- /// <summary>\r
- /// <seealso cref="DataGridViewCell"/>が<c>null</c>の場合に指定された文字列を返す<c>ToString</c>。\r
- /// </summary>\r
- /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>\r
- /// <param name="nullStr">渡されたオブジェクトが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>\r
- /// <returns>渡されたオブジェクトの<c>Value</c>を<c>ToString</c>した結果。<c>null</c>の場合には指定された文字列。</returns>\r
- public static string ToString(DataGridViewCell obj, string nullStr)\r
- {\r
- if (obj == null)\r
- {\r
- return nullStr;\r
- }\r
- else if (obj.Value == null)\r
- {\r
- return nullStr;\r
- }\r
-\r
- return obj.Value.ToString();\r
- }\r
-\r
- #endregion\r
-\r
- #region ダイアログ\r
-\r
- /// <summary>\r
- /// 単純デザインの通知ダイアログ(入力された文字列を表示)。\r
- /// </summary>\r
- /// <param name="msg">メッセージ。</param>\r
- public static void InformationDialog(string msg)\r
- {\r
- // 渡された文字列で通知ダイアログを表示\r
- MessageBox.Show(\r
- msg,\r
- Resources.InformationTitle,\r
- MessageBoxButtons.OK,\r
- MessageBoxIcon.Information);\r
- }\r
-\r
- /// <summary>\r
- /// 単純デザインの通知ダイアログ(入力された文字列を書式化して表示)。\r
- /// </summary>\r
- /// <param name="format">書式項目を含んだメッセージ。</param>\r
- /// <param name="args">書式設定対象オブジェクト配列。</param>\r
- public static void InformationDialog(string format, params object[] args)\r
- {\r
- // オーバーロードメソッドをコール\r
- FormUtils.InformationDialog(String.Format(format, args));\r
- }\r
-\r
- /// <summary>\r
- /// 単純デザインの警告ダイアログ(入力された文字列を表示)。\r
- /// </summary>\r
- /// <param name="msg">メッセージ。</param>\r
- public static void WarningDialog(string msg)\r
- {\r
- // 渡された文字列で警告ダイアログを表示\r
- MessageBox.Show(\r
- msg,\r
- Resources.WarningTitle,\r
- MessageBoxButtons.OK,\r
- MessageBoxIcon.Warning);\r
- }\r
-\r
- /// <summary>\r
- /// 単純デザインの警告ダイアログ(入力された文字列を書式化して表示)。\r
- /// </summary>\r
- /// <param name="format">書式項目を含んだメッセージ。</param>\r
- /// <param name="args">書式設定対象オブジェクト配列。</param>\r
- public static void WarningDialog(string format, params object[] args)\r
- {\r
- // オーバーロードメソッドをコール\r
- FormUtils.WarningDialog(String.Format(format, args));\r
- }\r
-\r
- /// <summary>\r
- /// 単純デザインのエラーダイアログ(入力された文字列を表示)。\r
- /// </summary>\r
- /// <param name="msg">メッセージ。</param>\r
- public static void ErrorDialog(string msg)\r
- {\r
- // 渡された文字列でエラーダイアログを表示\r
- MessageBox.Show(\r
- msg,\r
- Resources.ErrorTitle,\r
- MessageBoxButtons.OK,\r
- MessageBoxIcon.Error);\r
- }\r
-\r
- /// <summary>\r
- /// 単純デザインのエラーダイアログ(入力された文字列を書式化して表示)。\r
- /// </summary>\r
- /// <param name="format">書式項目を含んだメッセージ。</param>\r
- /// <param name="args">書式設定対象オブジェクト配列。</param>\r
- public static void ErrorDialog(string format, params object[] args)\r
- {\r
- // オーバーロードメソッドをコール\r
- FormUtils.ErrorDialog(String.Format(format, args));\r
- }\r
-\r
- #endregion\r
-\r
- #region テーブル処理\r
-\r
- /// <summary>\r
- /// <seealso cref="DataGridViewRow"/>が空行かを判定する。\r
- /// </summary>\r
- /// <param name="row">1行。</param>\r
- /// <returns>空行の場合<c>true</c>。</returns>\r
- public static bool IsEmptyRow(DataGridViewRow row)\r
- {\r
- foreach (DataGridViewCell cell in row.Cells)\r
- {\r
- if (!String.IsNullOrEmpty(FormUtils.ToString(cell)))\r
- {\r
- return false;\r
- }\r
- }\r
-\r
- return true;\r
- }\r
-\r
- #endregion\r
- }\r
-}\r
+// ================================================================================================
+// <summary>
+// Windows処理に関するユーティリティクラスソース。</summary>
+//
+// <copyright file="FormUtils.cs" company="honeplusのメモ帳">
+// Copyright (C) 2010 Honeplus. All rights reserved.</copyright>
+// <author>
+// Honeplus</author>
+// ================================================================================================
+
+namespace Honememo.Utilities
+{
+ using System;
+ using System.Collections.Generic;
+ using System.IO;
+ using System.Reflection;
+ using System.Windows.Forms;
+
+ // ※ プロパティを含むので、そのまま他のプロジェクトに流用することはできない
+ using Honememo.Wptscs.Properties;
+
+ /// <summary>
+ /// Windows処理に関するユーティリティクラスです。
+ /// </summary>
+ public static class FormUtils
+ {
+ #region リソース関連
+
+ /// <summary>
+ /// バージョン情報を含んだアプリケーション名を返す。
+ /// </summary>
+ /// <returns>アプリケーション名</returns>
+ public static string ApplicationName()
+ {
+ // アセンブリからバージョン情報を取得し、書式化して返す
+ // ビルド番号・リビジョンは無視
+ // ※例外なし。もし万が一発生する場合はそのまま投げる
+ Version ver = Assembly.GetExecutingAssembly().GetName().Version;
+ return String.Format(Resources.ApplicationName, ver.Major, ver.Minor);
+ }
+
+ /// <summary>
+ /// 指定されたファイルを UserAppDataPath
+ /// → 旧バージョンのUserAppDataPath
+ /// → StartupPath の順に探索し、その際のパスを返す。
+ /// </summary>
+ /// <param name="fileName">ファイル名。</param>
+ /// <param name="compatible">探索する旧バージョンの最大。</param>
+ /// <returns>ファイルが存在したパス、どこにも存在しない場合は<c>null</c>。</returns>
+ /// <remarks>アセンブリ名が変わっている場合、旧バージョンは探索不可。</remarks>
+ public static string SearchUserAppData(string fileName, string compatible)
+ {
+ // 現在の UserAppDataPath を探索
+ string path = Path.Combine(Application.UserAppDataPath, fileName);
+ if (File.Exists(path))
+ {
+ return path;
+ }
+
+ // 可能であれば、旧バージョンの UserAppDataPath を探索
+ if (!String.IsNullOrEmpty(compatible))
+ {
+ // UserAppDataPath は
+ // <ベースパス>\<CompanyName>\<ProductName>\<ProductVersion>
+ // という構成のはずなので、一つ上のフォルダから自分より前のフォルダを探索
+ string parent = Path.GetDirectoryName(Application.UserAppDataPath);
+ if (!String.IsNullOrEmpty(parent))
+ {
+ // 現在のバージョンのフォルダ名
+ string now = Path.GetFileName(Application.UserAppDataPath);
+
+ // 同じ階層のフォルダをすべて取得し、降順にソート
+ string[] directories = Directory.GetDirectories(parent);
+ Array.Sort(directories);
+ Array.Reverse(directories);
+
+ // ファイルが見つかるまで探索
+ foreach (string dir in directories)
+ {
+ string ver = Path.GetFileName(dir);
+ if (compatible.CompareTo(ver) <= 0 && ver.CompareTo(now) < 0)
+ {
+ path = Path.Combine(dir, fileName);
+ if (File.Exists(path))
+ {
+ return path;
+ }
+ }
+ }
+ }
+ }
+
+ // どこにも無い場合は、exeと同じフォルダを探索
+ path = Path.Combine(Application.StartupPath, fileName);
+ if (File.Exists(path))
+ {
+ return path;
+ }
+
+ return null;
+ }
+
+ /// <summary>
+ /// 指定されたファイルを UserAppDataPath
+ /// → StartupPath の順に探索し、その際のパスを返す。
+ /// </summary>
+ /// <param name="fileName">ファイル名。</param>
+ /// <returns>ファイルが存在したパス、どこにも存在しない場合は<c>null</c>。</returns>
+ public static string SearchUserAppData(string fileName)
+ {
+ // オーバーロードメソッドをコール
+ return FormUtils.SearchUserAppData(fileName, null);
+ }
+
+ /// <summary>
+ /// 文字列中のファイル名に使用できない文字を「_」に置換。
+ /// </summary>
+ /// <param name="fileName">ファイル名。</param>
+ /// <returns>置換後のファイル名。</returns>
+ public static string ReplaceInvalidFileNameChars(string fileName)
+ {
+ // 渡された文字列にファイル名に使えない文字が含まれている場合、_ に置き換える
+ string result = fileName;
+ char[] unuseChars = Path.GetInvalidFileNameChars();
+ foreach (char c in unuseChars)
+ {
+ result = result.Replace(c, '_');
+ }
+
+ return result;
+ }
+
+ #endregion
+
+ #region null値許容メソッド
+
+ /// <summary>
+ /// <seealso cref="DataGridViewCell"/>が<c>null</c>の場合に空の文字列を返す<c>ToString</c>。
+ /// </summary>
+ /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>
+ /// <returns>渡されたオブジェクトの<c>Value</c>を<c>ToString</c>した結果。<c>null</c>の場合には空の文字列。</returns>
+ public static string ToString(DataGridViewCell obj)
+ {
+ return FormUtils.ToString(obj, String.Empty);
+ }
+
+ /// <summary>
+ /// <seealso cref="DataGridViewCell"/>が<c>null</c>の場合に指定された文字列を返す<c>ToString</c>。
+ /// </summary>
+ /// <param name="obj"><c>ToString</c>するオブジェクト。<c>null</c>も可。</param>
+ /// <param name="nullStr">渡されたオブジェクトが<c>null</c>の場合に返される文字列。<c>null</c>も可。</param>
+ /// <returns>渡されたオブジェクトの<c>Value</c>を<c>ToString</c>した結果。<c>null</c>の場合には指定された文字列。</returns>
+ public static string ToString(DataGridViewCell obj, string nullStr)
+ {
+ if (obj == null)
+ {
+ return nullStr;
+ }
+ else if (obj.Value == null)
+ {
+ return nullStr;
+ }
+
+ return obj.Value.ToString();
+ }
+
+ #endregion
+
+ #region ダイアログ
+
+ /// <summary>
+ /// 単純デザインの通知ダイアログ(入力された文字列を表示)。
+ /// </summary>
+ /// <param name="msg">メッセージ。</param>
+ public static void InformationDialog(string msg)
+ {
+ // 渡された文字列で通知ダイアログを表示
+ MessageBox.Show(
+ msg,
+ Resources.InformationTitle,
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ }
+
+ /// <summary>
+ /// 単純デザインの通知ダイアログ(入力された文字列を書式化して表示)。
+ /// </summary>
+ /// <param name="format">書式項目を含んだメッセージ。</param>
+ /// <param name="args">書式設定対象オブジェクト配列。</param>
+ public static void InformationDialog(string format, params object[] args)
+ {
+ // オーバーロードメソッドをコール
+ FormUtils.InformationDialog(String.Format(format, args));
+ }
+
+ /// <summary>
+ /// 単純デザインの警告ダイアログ(入力された文字列を表示)。
+ /// </summary>
+ /// <param name="msg">メッセージ。</param>
+ public static void WarningDialog(string msg)
+ {
+ // 渡された文字列で警告ダイアログを表示
+ MessageBox.Show(
+ msg,
+ Resources.WarningTitle,
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Warning);
+ }
+
+ /// <summary>
+ /// 単純デザインの警告ダイアログ(入力された文字列を書式化して表示)。
+ /// </summary>
+ /// <param name="format">書式項目を含んだメッセージ。</param>
+ /// <param name="args">書式設定対象オブジェクト配列。</param>
+ public static void WarningDialog(string format, params object[] args)
+ {
+ // オーバーロードメソッドをコール
+ FormUtils.WarningDialog(String.Format(format, args));
+ }
+
+ /// <summary>
+ /// 単純デザインのエラーダイアログ(入力された文字列を表示)。
+ /// </summary>
+ /// <param name="msg">メッセージ。</param>
+ public static void ErrorDialog(string msg)
+ {
+ // 渡された文字列でエラーダイアログを表示
+ MessageBox.Show(
+ msg,
+ Resources.ErrorTitle,
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
+ }
+
+ /// <summary>
+ /// 単純デザインのエラーダイアログ(入力された文字列を書式化して表示)。
+ /// </summary>
+ /// <param name="format">書式項目を含んだメッセージ。</param>
+ /// <param name="args">書式設定対象オブジェクト配列。</param>
+ public static void ErrorDialog(string format, params object[] args)
+ {
+ // オーバーロードメソッドをコール
+ FormUtils.ErrorDialog(String.Format(format, args));
+ }
+
+ #endregion
+
+ #region テーブル処理
+
+ /// <summary>
+ /// <seealso cref="DataGridViewRow"/>が空行かを判定する。
+ /// </summary>
+ /// <param name="row">1行。</param>
+ /// <returns>空行の場合<c>true</c>。</returns>
+ public static bool IsEmptyRow(DataGridViewRow row)
+ {
+ foreach (DataGridViewCell cell in row.Cells)
+ {
+ if (!String.IsNullOrEmpty(FormUtils.ToString(cell)))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ #endregion
+ }
+}