//──────────────────────────────────────── public void Write( string text_Csv, string filepathabsolute,//絶対ファイルパス bool isSuccessfulDialogPopup ) { try { System.IO.File.WriteAllText(filepathabsolute, text_Csv, Global.ENCODING_CSV); if (isSuccessfulDialogPopup) { Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("ファイルに書き込みました。"); s.Append(Environment.NewLine); s.Append("["); s.Append(filepathabsolute); s.Append("]"); MessageBox.Show(s.ToString(), "▲実行結果!(L02)"); } } catch (Exception ex) { // 異常時は必ずポップアップが出る。 MessageBox.Show( ex.Message, "▲エラー201!(" + Info_Table.Name_Library + ") " + this.GetType().Name + "#Write" ); } }
//──────────────────────────────────────── /// <summary> /// 設定ファイルに記述されているままのファイル・パス表記。 /// /// 相対パス、絶対パスのどちらでも構わない。 /// /// 例:"Data\\Monster.csv" /// </summary> /// <param name="newHumanInputFilePath"></param> public void SetHumaninput( string filepath_Humaninput_New, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "SetHumaninput", log_Reports); if (this.Conf is Conf_Filepath) { ((Conf_Filepath)this.Conf).SetHumaninput( filepath_Humaninput_New, log_Reports ); } else { // エラー。 if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー902!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("#SetSHumanInput:型が違います。[" + this.Conf.GetType().Name + "]"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// 警告メッセージの定型文を作ります。 /// /// 旧名:ToText_Configuration /// </summary> /// <returns></returns> public static string ToText_Conf( Conf_String cParent ) { Log_TextIndented s = new Log_TextIndentedImpl(); if (null == cParent) { s.Append(" 親要素が指定されていません。"); } else { s.Append(" 設定位置パンくずリスト(問題個所ヒント):"); s.Newline(); s.Newline(); cParent.ToText_Locationbreadcrumbs(s); s.Newline(); s.Newline(); cParent.ToText_Content(s); s.Newline(); s.Newline(); s.Append(Log_RecordReportsImpl.ToText_Separator()); s.Append(" 問題を報告したオブジェクトの型: "); s.Append(cParent.GetType()); s.Append(" (これはラッパークラスということもあるかも知れません)"); s.Newline(); s.Newline(); } return(s.ToString()); }
//──────────────────────────────────────── /// <summary> /// 相対パスが設定されていた場合、その相対元となるディレクトリーへのパスです。 /// そうでない場合は、System.Windows.Forms.StartupPath を入れてください。 /// </summary> /// <param name="newDirectoryPath"></param> public void SetDirectory_Base( string sFolderpath_New, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "SetSDirectory_Base", log_Reports); // ダミー・フラグ。使いません。 bool bDammyFlagCheckPathTooLong = false; if (this.Conf is Conf_Filepath) { Conf_Filepath cf_Fpath = ((Conf_Filepath)this.Conf); // チェック。絶対パスにすることができればOK。 Util_Filepath.ToAbsolute( sFolderpath_New, cf_Fpath.GetHumaninput(), ref bDammyFlagCheckPathTooLong, false, //ファイル名の長さが上限超過ならエラー log_Reports, //out sErrorMsg, this.Conf ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } cf_Fpath.SetDirectory_Base(sFolderpath_New); } else { // エラー if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー903!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("#GetSAbsoluteFilePath:型が違います。[" + this.Conf.GetType().Name + "]"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } // // // // gt_EndMethod: log_Method.EndMethod(log_Reports); return; }
//──────────────────────────────────────── public virtual string Lv5_Implement( Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Execute5_Main", log_Reports); string result; Exception err_Excp; try { result = this.dictionary_P1p[this.numberP1p]; } catch (KeyNotFoundException e) { // エラー err_Excp = e; goto gt_Error_KeyNotFound; } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_KeyNotFound: { result = ""; if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー211!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("テキスト_テンプレートの引数 p"); t.Append(this.numberP1p); t.Append("p の取得に失敗しました。"); t.Newline(); // ヒント t.Append(r.Message_SException(err_Excp)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return(result); }
//──────────────────────────────────────── /// <summary> /// ファイル名の頭と末尾に文字列を付けることができます。 /// </summary> /// <param name="prefix">ファイル名の頭に付ける文字列。</param> /// <param name="suffix">ファイル名の末尾に付ける文字列。</param> public Expr_Filepath Rename_Append(string prefix, string suffix, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Rename_Append", log_Reports); Expr_Filepath result; string absolute = this.Lv4Execute_OnImplement(Syntax.EnumHitcount.Unconstraint, log_Reports); if ("" == absolute) { result = null; goto gt_Error_Empty; } string directory = Path.GetDirectoryName(absolute); string filename = Path.GetFileNameWithoutExtension(absolute); string extension = Path.GetExtension(absolute);//拡張子の「.」を含む。 absolute = Path.Combine(directory, prefix + filename + suffix + extension); result = Expr_FilepathImpl.Init2( "", absolute, "<rename>", null, log_Reports ); goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_Empty: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー931!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("ファイルパスが空文字列でした。"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return(result); }
public void EndMethod(Log_Reports log_Reports) { if (this.IsActive) { if (Log_ReportsImpl.BDebugmode_Static) { if (this.Log_Stopwatch.IsRunning && log_Reports.CanStopwatch) { this.Log_Stopwatch.End(log_Reports); } log_Reports.Log_Callstack.Pop(this); } this.IsActive = false; } else { //エラー goto gt_Error_NoActiveYet; } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_NoActiveYet: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー31!", this); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("BeginMethodしていないのにEndMethodしました。対応の数は合っていますか?"); s.Newline(); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: ; }
//──────────────────────────────────────── /// <summary> /// 子要素を追加します。 /// </summary> /// <param name="items"></param> /// <param name="request"></param> /// <param name="log_Reports"></param> public void AddChildElement( Expr_String eChild, Log_Reports log_Reports ) { // // エラー。 Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "AddChildElement", log_Reports); // // // // if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー201!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("このメソッド " + log_Method.Fullname + " は使わないでください。"); // ヒント t.Append(r.Message_Conf(this.Conf)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } // // log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── public List <Expr_String> GetChildElements( EnumHitcount request, Log_Reports log_Reports ) { // // エラー。 Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "GetChildElements", log_Reports); // // // // if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー101!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("このメソッド " + log_Method.Fullname + " は使わないでください。"); // ヒント t.Append(r.Message_Conf(this.Conf)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } // // log_Method.EndMethod(log_Reports); return(null); }
//──────────────────────────────────────── /// <summary> /// @Deprecated /// </summary> /// <param name="request"></param> /// <param name="log_Reports"></param> /// <returns></returns> public List <Expression_Node_String> Expression_GetChildList( EnumHitcount request, Log_Reports log_Reports ) { // // エラー。 Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Expression_GetChildList", log_Reports); // // if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー101!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("このメソッド " + this.GetType().Name + "#GetChildNList は使わないんでください。"); // ヒント t.Append(r.Message_Configuration(this.Cur_Configuration)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } // // log_Method.EndMethod(log_Reports); return(null); }
//──────────────────────────────────────── /// <summary> /// 子要素を追加します。 /// </summary> /// <param name="nItems"></param> /// <param name="request"></param> /// <param name="log_Reports"></param> public void Expression_AddChild( Expression_Node_String child_Expression, Log_Reports log_Reports ) { // // エラー。 Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Expression_AddChild", log_Reports); // // // // if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー101!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("このメソッド " + this.GetType().Name + "#AddChildN は使わないでください。"); // ヒント t.Append(r.Message_Configuration(this.Cur_Configuration)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } // // log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// S→O。 /// /// 文字列「-7~-5|-3~1|3|5~7|9|10|13~24」といった記述を入れると、 /// O_IntegerRangesオブジェクトを返します。 /// </summary> /// <param name="sText">「-7~-5|-3~1|3|5~7|9|10|13~24」といった記述。</param> /// <param name="out_O_Ranges">O_IntegerRangesオブジェクト。</param> /// <param name="ref_sInfoMsg">正常時:変化なし、情報・警告有り時:空文字以外の文字列が追加。</param> /// <param name="out_sErrorMsg">正常終了:空文字列、エラー時:空文字以外の文字列。</param> /// <returns>正常終了:真、異常終了:偽</returns> public bool ConfigurationTo( string sText, out IntegerRanges o_Ranges_Out, ref StringBuilder sb_InfoMsg_Ref, out string sErrorMsg_Out ) { string[] sRanges = sText.Split('|'); bool bParsedSuccessful = true;//解析が失敗していなければ真。 o_Ranges_Out = new IntegerRangesImpl(); string err_sRange; Exception err_Excp; string err_sFirst; string err_sLast; foreach (string sRange in sRanges) { string[] sFirstLast = sRange.Split('~'); if (1 == sFirstLast.Length) { // // 「1」など string sSingle = sFirstLast[0]; int nSingle; if (!int.TryParse(sSingle, out nSingle)) { // エラー err_sRange = sRange; err_Excp = null; goto gt_Error_MissParse; } // 解析が失敗していなければ。 IntegerRange o_Range = new IntegerRangeImpl(nSingle); o_Ranges_Out.List_Item.Add(o_Range); } else if (2 == sFirstLast.Length) { // // 「1~10」など string sFirst = sFirstLast[0]; string sLast = sFirstLast[1]; int nFirst; if (!int.TryParse(sFirst, out nFirst)) { // エラー err_sRange = sRange; err_Excp = null; err_sFirst = sFirst; goto gt_Error_MissParseFirst; } int nLast; if (!int.TryParse(sLast, out nLast)) { // エラー err_sRange = sRange; err_Excp = null; err_sLast = sLast; goto gt_Error_MissParseLast; } // 解析が失敗していなければ。 IntegerRange o_Range = new IntegerRangeImpl(nFirst, nLast); o_Ranges_Out.List_Item.Add(o_Range); } else { // エラー err_sRange = sRange; goto gt_Error_MissFormat01; } } sErrorMsg_Out = ""; goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_MissParseFirst: { bParsedSuccessful = false; StringBuilder sb = new StringBuilder(); sb.Append("[Error:1084][" + Info_Syntax.Name_Library + ":" + this.GetType().Name + "#Parse]"); sb.Append("整数範囲の記述["); sb.Append(err_sRange); sb.Append("]の始値[" + err_sFirst + "]は、解析できませんでした。"); sb.Append(Environment.NewLine); // ヒント sb.Append("[ErrorMessage:" + err_Excp.Message + "]"); sErrorMsg_Out = sb.ToString(); } goto gt_EndMethod; gt_Error_MissParseLast: { bParsedSuccessful = false; Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("[Error:1085][" + Info_Syntax.Name_Library + ":" + this.GetType().Name + "#Parse]"); s.Append("整数範囲の記述["); s.Append(err_sRange); s.Append("]の終値[" + err_sLast + "]は、解析できませんでした。"); s.Append(Environment.NewLine); // ヒント s.Append("[ErrorMessage:" + err_Excp.Message + "]"); sErrorMsg_Out = s.ToString(); } goto gt_EndMethod; gt_Error_MissParse: { bParsedSuccessful = false; Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("[Error:1086][" + Info_Syntax.Name_Library + ":" + this.GetType().Name + "#Parse]"); s.Append("整数範囲の記述["); s.Append(err_sRange); s.Append("]は、解析できませんでした。"); s.Append(Environment.NewLine); // ヒント if (null != err_Excp) { s.Append("[ErrorMessage:" + err_Excp.Message + "]"); } sErrorMsg_Out = s.ToString(); } goto gt_EndMethod; gt_Error_MissFormat01: { bParsedSuccessful = false; StringBuilder sb = new StringBuilder(); sb.Append("[Error:1087][" + Info_Syntax.Name_Library + ":" + this.GetType().Name + "#Parse]"); sb.Append("整数範囲の記述["); sb.Append(err_sRange); sb.Append("]は、解析できませんでした。"); sErrorMsg_Out = sb.ToString(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: return(bParsedSuccessful); }
//──────────────────────────────────────── /// <summary> /// 変数名を指定することで、文字列を返します。 /// /// </summary> /// <param select="oVariableName"></param> /// <param select="bRequired"></param> /// <param select="log_Reports"></param> /// <returns></returns> public string GetStringByVariablename( Expression_Node_String ec_VariableName, bool bRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "GetStringByVariablename",log_Reports); // // // // string sResult; string sVarName = ec_VariableName.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports); // 【仕様変更 2011-03-03】「変数名無し」(つまり「$」だけ)は、文字「$」を返します。 //if ("" == sVarName) //{ // return "$"; //} //else if (!this.dictionaryExpression_Item.ContainsKey(sVarName)) { sResult = null; if (bRequired) { goto gt_Error_NotFoundVariable; } } else { sResult = this.dictionaryExpression_Item[sVarName].Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports); } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundVariable: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー925!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("変数["); t.Append(sVarName); t.Append("]は存在しませんでした。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append(" 問題箇所ヒント:"); ec_VariableName.Cur_Configuration.Parent.ToText_Locationbreadcrumbs(t); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append(" 実行経路ヒント:"); ec_VariableName.Cur_Configuration.Parent.ToText_Locationbreadcrumbs(t); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("ヒント:登録されている変数の個数=["); t.Append(this.dictionaryExpression_Item.Count); t.Append("]"); t.Append(Environment.NewLine); foreach (KeyValuePair<string, Expression_Node_String> pair in this.dictionaryExpression_Item) { t.Append(pair.Key); t.Append("="); t.Append(pair.Value); t.Append(Environment.NewLine); } r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return sResult; }
//──────────────────────────────────────── /// <summary> /// ノード名を指定して、直近の親ノードを取得したい。 /// </summary> /// <param name="sName"></param> /// <param name="enumConf">「Configuration_Node」「Configurationtree_Node」のいずれか。</param> /// <param name="bRequired">偽を指定した時は、不一致の時ヌルを返す。</param> /// <param name="log_Reports"></param> /// <returns></returns> public virtual Configuration_Node GetParentByNodename( string sName, EnumConfiguration enumConf, bool bRequired, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "GetParentByNodename", log_Reports); // // Configuration_Node result; Configuration_Node err_Parent_Conf; if (log_Reports.Successful) { if (null != this.Parent) { // 親要素があるとき if (sName == this.Parent.Name) { // ノード名が一致 result = this.Parent; } else { // ノード名が一致しないとき result = this.Parent.GetParentByNodename(sName, enumConf, bRequired, log_Reports); } } else { // 親要素がないとき result = null; err_Parent_Conf = null; goto gt_Error_NotFoundParent; } } else { // 既にエラーが出ているとき result = null; } if (enumConf == EnumConfiguration.Tree) { if (!(result is Configurationtree_Node)) { //エラー goto gt_Error_AnotherClass; } } else if (enumConf == EnumConfiguration.Unknown) { if (!(result is Configuration_Node)) { //エラー goto gt_Error_AnotherClass; } } else { //エラー goto gt_Error_UnsupportedConfigurationType; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundParent: if (log_Reports.CanCreateReport) { if (bRequired) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー501!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("親要素の取得に失敗しました。"); s.Newline(); s.Append("指定ノード名["); s.Append(sName); s.Append("]"); s.Newline(); s.Append("親要素はヌルです。"); s.Newline(); if (null != err_Parent_Conf) { s.Append("親要素ノード名["); s.Append(err_Parent_Conf.Name); s.Append("]"); s.Newline(); } // ヒント s.Append(r.Message_Configuration(this)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_AnotherClass: if (log_Reports.CanCreateReport) { if (bRequired) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー502!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("(内部プログラム・エラー)取得した親要素は、指定のクラスとは異なりました。"); s.Newline(); s.Append("指定コンフィグ形["); s.Append(enumConf); s.Append("]"); s.Newline(); s.Append("取得した親要素のクラス名["); s.Append(result.GetType().Name); s.Append("]"); s.Newline(); // ヒント s.Append(r.Message_Configuration(this)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_UnsupportedConfigurationType: if (log_Reports.CanCreateReport) { if (bRequired) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー503!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("(内部プログラム・エラー)コンフィグ・クラスの指定に対応できませんでした。"); s.Newline(); s.Append("指定コンフィグ形["); s.Append(enumConf); s.Append("]"); s.Newline(); //s.Append("取得した親要素のクラス名["); //s.Append(result.GetType().Name); //s.Append("]"); //s.Newline(); // ヒント s.Append(r.Message_Configuration(this)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return(result); }
//──────────────────────────────────────── protected override void Parse_SAttribute( XmlElement cur_X, Configurationtree_Node cur_Cf, MemoryApplication memoryApplication, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_XmlToConf.Name_Library, this, "Parse_SAttr",log_Reports); // // XmlAttribute err_XAttr = null; foreach (XmlAttribute xAttr in cur_X.Attributes) { // if (this.List_SName_Attribute.Contains(xAttr.Name)) { // 属性連結 // ⑦ PmName pmName = PmNames.FromSAttribute(xAttr.Name); if (null != pmName) { cur_Cf.Dictionary_Attribute.Add(pmName.Name_Pm, xAttr.Value, cur_Cf, true, log_Reports); } else { cur_Cf.Dictionary_Attribute.Add(xAttr.Name, xAttr.Value, cur_Cf, true, log_Reports); } } else { err_XAttr = xAttr; goto gt_Error_UndefinedAttr; } goto gt_attrEnd; gt_attrEnd: ; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_UndefinedAttr: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー336!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("["); s.Append(cur_X.Name); s.Append("]要素を探索中に、未対応の属性が記述されていました。"); s.Newline(); s.Append("xAttr.Name=["); s.Append(err_XAttr.Name); s.Append("]"); s.Newline(); s.Newline(); // ヒント s.Append(r.Message_Configuration(cur_Cf)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// ノード名を指定して、直近の子ノードを取得したい。 /// </summary> /// <param name="sName"></param> /// <param name="bRequired">偽を指定した時は、要素数0のリストを返す。</param> /// <param name="log_Reports"></param> /// <returns></returns> public List<Configurationtree_Node> GetChildrenByNodename(string sName, bool bRequired, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "GetChildrenByNodename", log_Reports); // // List<Configurationtree_Node> result = new List<Configurationtree_Node>(); if (log_Reports.Successful) { this.list_Child.ForEach(delegate(Configurationtree_Node child_Conf, ref bool bBreak) { if (sName == child_Conf.Name) { // ノード名が一致 result.Add(child_Conf); } else { // ノード名が一致しないとき } }); } else { // 既にエラーが出ているとき goto gt_EndMethod; } if (result.Count < 1 && bRequired) { if (bRequired) { goto gt_Error_EmptyHitChild; } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_EmptyHitChild: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー502!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("該当した子要素がありませんでした。"); s.Newline(); s.Append("指定ノード名["); s.Append(sName); s.Append("]"); s.Newline(); // ヒント s.Append(r.Message_Configuration(this)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return result; }
//──────────────────────────────────────── public static bool TryParse( object value, out Value_Humaninput out_ValueH, bool isRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Table.Name_Library, "Utility_HumaninputValue", "TryParse", log_Reports); bool bResult; if (value is Value_Humaninput) { out_ValueH = (Value_Humaninput)value; bResult = true; } else { out_ValueH = null; bResult = false; if (isRequired) { goto gt_Error_AnotherType; } goto gt_EndMethod; } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_AnotherType: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー201!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("string,int,boolセルデータクラス以外のオブジェクトが指定されました。"); s.Newline(); s.Append("指定された値のクラス=["); s.Append(value.GetType().Name); s.Append("]"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return bResult; }
//──────────────────────────────────────── /// <summary> /// プロジェクト読取り時の定形アクション実行。 /// </summary> /// <param name="sender"></param> /// <param name="st_PrevProjectElm_OrNull"></param> /// <param name="bProjectValid"></param> /// <param name="log_Reports"></param> public override string Execute5_Main(Log_Reports log_Reports) { //()メソッド開始 Log_Method log_Method = new Log_MethodImpl(1); log_Method.BeginMethod(Info_Functions.Name_Library, this, "Execute5_Main",log_Reports); // if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("「プロジェクト選択時」用のイベントハンドラーを実行します。"); } //()タスク_デスクリプション { string sFncName0; this.TrySelectAttribute(out sFncName0, PmNames.S_NAME.Name_Pm, EnumHitcount.One_Or_Zero, log_Reports); if (this.Functionparameterset.Sender is Customcontrol) { Customcontrol ccFc = (Customcontrol)this.Functionparameterset.Sender; string sName_Usercontrol = ccFc.ControlCommon.Expression_Name_Control.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports); log_Reports.Comment_EventCreationMe += "/追加:[" + sName_Usercontrol + "]コントロールが、[" + sFncName0 + "]アクションを実行。"; } else { log_Reports.Comment_EventCreationMe += "/追加:[" + sFncName0 + "]アクションを実行。"; } } Configurationtree_Node conf_ThisMethod = new Configurationtree_NodeImpl(log_Method.Fullname, null); if (this.EnumEventhandler == EnumEventhandler.Editor_B_Lr) { //(4)独自モデルの取得 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(4)独自モデルの取得"); } // this.On_P04_ReadNewModel(log_Reports); //(5)エディター名。ツール設定ファイルに記載されている方。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(5)エディター名。ツール設定ファイルに記載されている方。"); } // 表示用の名称。 string sName_SelectingEditor; if (this.Functionparameterset.SelectedProjectElement_Configurationtree == null) { // // 切り替えるプロジェクトが判明していない場合は、空文字列。 // sName_SelectingEditor = ""; } else { // // todo: エディター設定ファイルの方のエディター名を入れても意味ないのでは? // sName_SelectingEditor = ((MemoryAatoolxml_Editor)this.Functionparameterset.SelectedProjectElement_Configurationtree).Name; } //(6)まず、きれいさっぱり プロジェクトをクリアーします。(切替用) if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(6)まず、きれいさっぱり プロジェクトをクリアーします。(切替用)"); } // todo:イベントハンドラーを外してから、フォームを外すこと。リストボックスが誤挙動を起こしている。 this.On_P06_ClearProject(this.Functionparameterset.Sender, log_Reports); //(7)「Aa_Editor.xml」読取。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(7)「Aa_Editor.xml」読取。"); } // if (!this.Functionparameterset.IsProjectValid || this.Functionparameterset.SelectedProjectElement_Configurationtree == null) { MemoryAatoolxml_Editor moAatoolxml_PrevEditorElm_OrNull = null; // // // // デフォルト・プロジェクト名が指定されていない場合、 // ツール設定ファイルの最初に記述されているプロジェクトを選択します。 // // // if (log_Reports.Successful) { if ("" == sName_SelectingEditor) { // // デフォルト・エディター名が未指定の場合。 // MemoryAatoolxml_Editor moAatoolxml_DefaultEditor = this.Owner_MemoryApplication.MemoryAatoolxml.GetDefaultEditor(true, log_Reports); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } // ↓これ要る? sName_SelectingEditor = moAatoolxml_DefaultEditor.Name; } } this.On_P07_SelectDefaultProject(ref sName_SelectingEditor, ref moAatoolxml_PrevEditorElm_OrNull, this.Functionparameterset.IsProjectValid, log_Reports); this.Functionparameterset.SelectedProjectElement_Configurationtree = moAatoolxml_PrevEditorElm_OrNull; // // // //「プロジェクトを開いた時の初期化」イベントハンドラーで使うために、ここで設定します。 // // // this.Functionparameterset.SelectedProjectElement_Configurationtree = this.Owner_MemoryApplication.MemoryAatoolxml.GetEditorByName(sName_SelectingEditor, true, log_Reports); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } } // ↓追加 if (null == this.Functionparameterset.SelectedProjectElement_Configurationtree) { { Builder_TexttemplateP1p tmpl = new Builder_TexttemplateP1pImpl(); tmpl.SetParameter(1, sName_SelectingEditor, log_Reports);//エディター名 this.Owner_MemoryApplication.CreateErrorReport("Er:110003;", tmpl, log_Reports); } } // ↑追加 //(13a)エディター・フォルダー。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(13a)エディター・フォルダーパス類推。"); } // // // Expression_Node_Filepath ec_Fopath_Editor; if (log_Reports.Successful) { MemoryAatoolxml_Editor moAatoolxml_SelectedEditor = (MemoryAatoolxml_Editor)this.Functionparameterset.SelectedProjectElement_Configurationtree; ec_Fopath_Editor = moAatoolxml_SelectedEditor.GetFilepathByFsetvarname( NamesVar.S_SP_EDITOR, this.Owner_MemoryApplication.MemoryVariables, true, log_Reports ); } else { ec_Fopath_Editor = null; } //(13b)「Aa_Editor.xml」読取。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(13b)「Aa_Editor.xml」ファイルパス類推。"); } // Expression_Node_Filepath ec_Fpath_AaEditorXml; if (log_Reports.Successful) { // // ツール設定ファイルで指定された値から、自動類推で設定されているはず。 // Configurationtree_NodeFilepath cf_Fpath_EditorXml = new Configurationtree_NodeFilepathImpl( "ツール設定ファイル[" + Application.StartupPath + System.IO.Path.DirectorySeparatorChar + ValuesAttr.S_FPATHR_AATOOLXML + "]の中の[" + sName_SelectingEditor + "]エディターへの指定から自動類推", null); // フォルダーパス + \Aa_Editor.xml string sFpatha_Aaeditorxml = ec_Fopath_Editor.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports) + System.IO.Path.DirectorySeparatorChar + NamesFile.S_AA_EDITOR_XML; // プロジェクト起動時に。 cf_Fpath_EditorXml.InitPath( sFpatha_Aaeditorxml, log_Reports ); ec_Fpath_AaEditorXml = new Expression_Node_FilepathImpl(cf_Fpath_EditorXml); } else { ec_Fpath_AaEditorXml = null; } //(8)「エディター設定ファイル」に記述されている<f-set-var>要素を、「エディター設定ファイル・モデル」に格納。Cf→M if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(8)「エディター設定ファイル」に記述されている<f-set-var>要素を、「エディター設定ファイル・モデル」に格納。Cf→M。この時点で「Sp:Engine;」といったシステム変数は自動類推が終わっている必要があります。"); } // MemoryAaeditorxml_Editor moAaeditorxml_Editor = null; if (log_Reports.Successful) { this.On_P08_SpToVar_( out moAaeditorxml_Editor, ec_Fpath_AaEditorXml, ec_Fopath_Editor, (MemoryAatoolxml_Editor)this.Functionparameterset.SelectedProjectElement_Configurationtree, log_Reports ); } // // // // ここで「Aa_Files.csv」を読み込みたい。 // // // if (log_Reports.Successful) { //(9)変数ファイル読取 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(9)変数ファイル読取"); } // this.Owner_MemoryApplication.MemoryVariables.LoadVariables( Application.StartupPath, log_Reports ); } if (log_Reports.Successful) { //(10)プログラマー用・デバッグモードのON/OFF。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(10)プログラマー用・デバッグモードのON/OFF。"); } // //mainWndの作成より先に設定する必要がある。ステータスバーを出す、出さないについて。 { Expression_Leaf_StringImpl ec_Varname = new Expression_Leaf_StringImpl(this, this.Cur_Configuration.Parent); ec_Varname.SetString(NamesVar.S_SS_DEBUGMODE_PROGRAMMER, log_Reports); string sValue = this.Owner_MemoryApplication.MemoryVariables.GetStringByVariablename(ec_Varname, false, log_Reports); if (ValuesAttr.S_ON == sValue) { Log_ReportsImpl.BDebugmode_Static = true; } else if (ValuesAttr.S_OFF == sValue) { Log_ReportsImpl.BDebugmode_Static = false; } else if (ValuesAttr.S_EMPTY == sValue) { // 無視 } else { // TODO:エラー } } } if (log_Reports.Successful) { //(11)画面レイアウト・デバッグモードのON/OFF。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(11)フォーム・デバッグモードのON/OFF。"); } // Expression_Leaf_StringImpl ec_Varname = new Expression_Leaf_StringImpl(this, this.Cur_Configuration.Parent); ec_Varname.SetString(NamesVar.S_SS_DEBUGMODE_FORM, log_Reports); string sValue = this.Owner_MemoryApplication.MemoryVariables.GetStringByVariablename(ec_Varname, false, log_Reports); if (ValuesAttr.S_ON == sValue) { Log_ReportsImpl.BDebugmode_Form = true; } else if (ValuesAttr.S_OFF == sValue) { Log_ReportsImpl.BDebugmode_Form = false; } else if (ValuesAttr.S_EMPTY == sValue) { // 無視 } else { // TODO:エラー } } //(14)「Aa_Files.csv」読取。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(14)「Aa_Files.csv」読取。"); } // List<Expression_Node_Filepath> ecList_Fpath_BackupRequest; { if (log_Reports.Successful) { // 正常時 Expression_Node_Function function_Expr = Collection_Function.NewFunction2( Expression_Node_Function22Impl.NAME_FUNCTION, this, this.Cur_Configuration, this.Owner_MemoryApplication, log_Reports); // 実行 function_Expr.Execute4_OnLr(this.Functionparameterset.Sender, log_Reports); // 実行後 ecList_Fpath_BackupRequest = ((Expression_Node_Function22Impl)function_Expr).List_Expression_Filepath_BackupRequest_Out; } else { // // エラー // ecList_Fpath_BackupRequest = null; } } //(14b)ユーザー定義関数設定ファイル読取【2012-03-30追加】 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(14b)ユーザー定義関数設定ファイル読取【2012-03-30追加】"); } // if (log_Reports.Successful) { // タイプデータ値。 Expression_Leaf_StringImpl ec_NameVariable = new Expression_Leaf_StringImpl(this, new Configurationtree_NodeImpl("!ハードコーディング",null)); ec_NameVariable.SetString(ValuesTypeData.S_CODE_FUNCTIONS, log_Reports); List<MemoryCodefileinfo> listInfo = null; if (log_Reports.Successful) { listInfo = this.Owner_MemoryApplication.MemoryCodefiles.GetCodefileinfoByTypedata(ec_NameVariable, true, log_Reports); } if (log_Reports.Successful) { foreach (MemoryCodefileinfo scriptfile in listInfo) { if (log_Reports.Successful) { this.Owner_MemoryApplication.MemoryFunctions.LoadFile( scriptfile.Expression_Filepath, log_Reports); } else { break; } } } } //(16)『スタイルシート設定ファイル』読取 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(16)『スタイルシート設定ファイル』読取"); } // if (log_Reports.Successful) { Expression_Node_Function expr_Func = Collection_Function.NewFunction2( Expression_Node_Function19Impl.NAME_FUNCTION, this, this.Cur_Configuration, this.Owner_MemoryApplication, log_Reports); Expression_Node_StringImpl ec_Str = new Expression_Node_StringImpl(this, conf_ThisMethod); ec_Str.AppendTextNode(NamesVar.S_ST_STYLESHEET, this.Cur_Configuration, log_Reports); expr_Func.SetAttribute(Expression_Node_Function19Impl.PM_NAME_TABLE_STYLESHEET, ec_Str, log_Reports); expr_Func.Execute4_OnLr( this.Functionparameterset.Sender, log_Reports ); } //(17a)「バックアップを取る」前にしておく独自実装をするタイミング。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(17a)「バックアップを取る」前にしておく独自実装をするタイミング。"); } // this.On_P17a_PreviousBackup( this.Functionparameterset.Sender, moAaeditorxml_Editor, ec_Fpath_AaEditorXml, ec_Fopath_Editor, (MemoryAatoolxml_Editor)this.Functionparameterset.SelectedProjectElement_Configurationtree, log_Reports); //(17b)今日の分のバックアップを取ります。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(17b)今日の分のバックアップを取ります。"); } // this.On_P17b_DateBackup(ecList_Fpath_BackupRequest, this.Functionparameterset.Sender, log_Reports); //(17c)「新規ウィンドウを開く」前にしておく独自実装をするタイミング。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(17c)「新規ウィンドウを開く」前にしておく独自実装をするタイミング。"); } // this.On_P17c_PreviousOpenWindow( this.Functionparameterset.Sender, moAaeditorxml_Editor, ec_Fpath_AaEditorXml, ec_Fopath_Editor, (MemoryAatoolxml_Editor)this.Functionparameterset.SelectedProjectElement_Configurationtree, log_Reports); //(18)関数30「新規ウィンドウを開く」実行。引数には関数を2つ指定できる。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(18)関数30「新規ウィンドウを開く」実行。引数には関数を2つ指定できる。"); } // { Expression_Node_Function expr_Func = Collection_Function.NewFunction2( Expression_Node_Function30Impl.NAME_FUNCTION, this, this.Cur_Configuration, this.Owner_MemoryApplication, log_Reports); { //Expression_Node_Function30Impl f1 = { Expression_Node_StringImpl ec_FormStart; { Expression_FvarImpl ec_Fvar = new Expression_FvarImpl(this, this.Cur_Configuration, this.Owner_MemoryApplication); ec_Fvar.AppendTextNode(NamesVar.S_SS_FORM_START, this.Cur_Configuration, log_Reports); ec_FormStart = new Expression_Node_StringImpl(this, this.Cur_Configuration); ec_FormStart.List_Expression_Child.Add(ec_Fvar, log_Reports); } ((Expression_Node_Function30Impl)expr_Func).SetAttribute(Expression_Node_Function30Impl.PM_NAME_FORM, ec_FormStart, log_Reports); } ((Expression_Node_Function30Impl)expr_Func).In_Subroutine_Function30_1 = this.In_Subroutine_Function30_1_OrNull; ((Expression_Node_Function30Impl)expr_Func).In_Subroutine_Function30_2 = this.In_Subroutine_Function30_2_OrNull; ((Expression_Node_Function30Impl)expr_Func).SetAttribute( Expression_Node_Function30Impl.PM_NAME_TOGETHER, new Expression_Leaf_StringImpl(NamesStg.S_STG_BEGIN_APPLICATION, null, conf_ThisMethod), log_Reports); } expr_Func.Execute4_OnLr( this.Functionparameterset.Sender, log_Reports ); } //(19)最後に if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("(19)最後に"); } // this.On_P19_AtLast( this.Functionparameterset.Sender, (MemoryAatoolxml_Editor)this.Functionparameterset.SelectedProjectElement_Configurationtree, this.Functionparameterset.IsProjectValid, log_Reports); // // 「S」と「E」を出力したい。 if (false) { // 「S」全てのコントロールと、ユーザー定義関数について。 log_Method.WriteInfo_ToConsole("┌──────────┐「S」全てのコントロールについて。"); this.Owner_MemoryApplication.MemoryForms.ForEach_Children(delegate(string sKey, Usercontrol fcUc, ref bool bRemove, ref bool bBreak) { Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("[" + sKey + "]"); s.Newline(); fcUc.ControlCommon.Expression_Control.Cur_Configuration.ToText_Content(s); log_Method.WriteInfo_ToConsole(s.ToString()); }); log_Method.WriteInfo_ToConsole("└──────────┘"); log_Method.WriteInfo_ToConsole("┌──────────┐「S」全てのユーザー定義関数について。"); this.Owner_MemoryApplication.MemoryFunctions.ForEach_Children(delegate(string sKey, Expression_Node_Function ec_CommonFunction, ref bool bRemove, ref bool bBreak) { Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("[" + sKey + "]"); s.Newline(); ec_CommonFunction.Cur_Configuration.ToText_Content(s); log_Method.WriteInfo_ToConsole(s.ToString()); }); log_Method.WriteInfo_ToConsole("└──────────┘"); // 「E」全てのコントロールと、ユーザー定義関数について。 log_Method.WriteInfo_ToConsole("┌──────────┐「E」全てのコントロールについて。"); this.Owner_MemoryApplication.MemoryForms.ForEach_Children(delegate(string sKey, Usercontrol fcUc, ref bool bRemove, ref bool bBreak) { Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("[" + sKey + "]"); s.Newline(); fcUc.ControlCommon.Expression_Control.ToText_Snapshot(s); log_Method.WriteInfo_ToConsole(s.ToString()); }); log_Method.WriteInfo_ToConsole("└──────────┘"); log_Method.WriteInfo_ToConsole("┌──────────┐「E」全てのユーザー定義関数について。"); this.Owner_MemoryApplication.MemoryFunctions.ForEach_Children(delegate(string sKey, Expression_Node_Function ec_CommonFunction, ref bool bRemove, ref bool bBreak) { Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("[" + sKey + "]"); s.Newline(); ec_CommonFunction.ToText_Snapshot(s); log_Method.WriteInfo_ToConsole(s.ToString()); }); log_Method.WriteInfo_ToConsole("└──────────┘"); } log_Method.WriteInfo_ToConsole("◆起動終了"); goto gt_EndMethod; // gt_EndMethod: log_Method.EndMethod(log_Reports); } return ""; }
//──────────────────────────────────────── /// <summary> /// S→O。 /// /// 文字列「-7~-5|-3~1|3|5~7|9|10|13~24」といった記述を入れると、 /// O_IntegerRangesオブジェクトを返します。 /// </summary> /// <param name="sText">「-7~-5|-3~1|3|5~7|9|10|13~24」といった記述。</param> /// <param name="out_O_Ranges">O_IntegerRangesオブジェクト。</param> /// <param name="ref_sInfoMsg">正常時:変化なし、情報・警告有り時:空文字以外の文字列が追加。</param> /// <param name="out_sErrorMsg">正常終了:空文字列、エラー時:空文字以外の文字列。</param> /// <returns>正常終了:真、異常終了:偽</returns> public bool ConfigurationTo( string sText, out IntegerRanges o_Ranges_Out, ref StringBuilder sb_InfoMsg_Ref, out string sErrorMsg_Out ) { string[] sRanges = sText.Split('|'); bool bParsedSuccessful = true;//解析が失敗していなければ真。 o_Ranges_Out = new IntegerRangesImpl(); string err_sRange; Exception err_Excp; string err_sFirst; string err_sLast; foreach (string sRange in sRanges) { string[] sFirstLast = sRange.Split('~'); if (1==sFirstLast.Length) { // // 「1」など string sSingle = sFirstLast[0]; int nSingle; if (!int.TryParse(sSingle, out nSingle)) { // エラー err_sRange = sRange; err_Excp = null; goto gt_Error_MissParse; } // 解析が失敗していなければ。 IntegerRange o_Range = new IntegerRangeImpl(nSingle); o_Ranges_Out.List_Item.Add(o_Range); } else if (2 == sFirstLast.Length) { // // 「1~10」など string sFirst = sFirstLast[0]; string sLast = sFirstLast[1]; int nFirst; if (!int.TryParse(sFirst, out nFirst)) { // エラー err_sRange = sRange; err_Excp = null; err_sFirst = sFirst; goto gt_Error_MissParseFirst; } int nLast; if (!int.TryParse(sLast, out nLast)) { // エラー err_sRange = sRange; err_Excp = null; err_sLast = sLast; goto gt_Error_MissParseLast; } // 解析が失敗していなければ。 IntegerRange o_Range = new IntegerRangeImpl(nFirst,nLast); o_Ranges_Out.List_Item.Add(o_Range); } else { // エラー err_sRange = sRange; goto gt_Error_MissFormat01; } } sErrorMsg_Out = ""; goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_MissParseFirst: { bParsedSuccessful = false; StringBuilder sb = new StringBuilder(); sb.Append("[Error:1084]["+Info_Syntax.Name_Library+":"+this.GetType().Name+"#Parse]"); sb.Append("整数範囲の記述["); sb.Append(err_sRange); sb.Append("]の始値[" + err_sFirst + "]は、解析できませんでした。"); sb.Append(Environment.NewLine); // ヒント sb.Append("[ErrorMessage:" + err_Excp.Message+ "]"); sErrorMsg_Out = sb.ToString(); } goto gt_EndMethod; gt_Error_MissParseLast: { bParsedSuccessful = false; Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("[Error:1085][" + Info_Syntax.Name_Library + ":" + this.GetType().Name + "#Parse]"); s.Append("整数範囲の記述["); s.Append(err_sRange); s.Append("]の終値[" + err_sLast + "]は、解析できませんでした。"); s.Append(Environment.NewLine); // ヒント s.Append("[ErrorMessage:" + err_Excp.Message + "]"); sErrorMsg_Out = s.ToString(); } goto gt_EndMethod; gt_Error_MissParse: { bParsedSuccessful = false; Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("[Error:1086][" + Info_Syntax.Name_Library + ":" + this.GetType().Name + "#Parse]"); s.Append("整数範囲の記述["); s.Append(err_sRange); s.Append("]は、解析できませんでした。"); s.Append(Environment.NewLine); // ヒント if (null != err_Excp) { s.Append("[ErrorMessage:" + err_Excp.Message + "]"); } sErrorMsg_Out = s.ToString(); } goto gt_EndMethod; gt_Error_MissFormat01: { bParsedSuccessful = false; StringBuilder sb = new StringBuilder(); sb.Append("[Error:1087][" + Info_Syntax.Name_Library + ":" + this.GetType().Name + "#Parse]"); sb.Append("整数範囲の記述["); sb.Append(err_sRange); sb.Append("]は、解析できませんでした。"); sErrorMsg_Out = sb.ToString(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: return bParsedSuccessful; }
//──────────────────────────────────────── #endregion #region アクション //──────────────────────────────────────── /// <summary> /// フォルダー絶対パスを指定すると、そのフォルダーパスを切り落とした文字列を返します。 /// /// 違うフォルダーだった場合、失敗します。 /// /// 先頭がディレクトリー区切り文字にならないようにして結果を返します。 /// </summary> /// <param name="folerpath"></param> public void TryCutFolderpath( out string out_Filepath_New, Expr_Filepath folderpath, bool isRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "TryCutFolderpath", log_Reports); //まず、自分の絶対パス string my = this.Lv4Execute_OnImplement(EnumHitcount.Unconstraint, log_Reports); //if(log_Method.CanDebug(1)) //{ // log_Method.WriteDebug_ToConsole("my=[" + my + "]"); //} //指定されたフォルダーの絶対パス string you = folderpath.Lv4Execute_OnImplement(EnumHitcount.Unconstraint, log_Reports); //if (log_Method.CanDebug(1)) //{ // log_Method.WriteDebug_ToConsole("you=[" + you + "]"); //} //if (log_Method.CanDebug(1)) //{ // log_Method.WriteDebug_ToConsole("my.StartsWith(you)=[" + my.StartsWith(you) + "]"); //} if (my.StartsWith(you)) { out_Filepath_New = my.Substring(you.Length); //if (log_Method.CanDebug(1)) //{ // log_Method.WriteDebug_ToConsole("you.Length=[" + you.Length + "]"); // log_Method.WriteDebug_ToConsole("filepath_New1=[" + filepath_New1 + "]"); // log_Method.WriteDebug_ToConsole("filepath_New1.StartsWith(System.IO.Path.DirectorySeparatorChar.ToString())=[" + filepath_New1.StartsWith(System.IO.Path.DirectorySeparatorChar.ToString()) + "]"); // if (filepath_New1.StartsWith(System.IO.Path.DirectorySeparatorChar.ToString())) // { // log_Method.WriteDebug_ToConsole("filepath_New1=[" + filepath_New1.Substring(1) + "]"); // } //} // 先頭がディレクトリー区切り文字だった場合、それを切り捨てます。 if (out_Filepath_New.StartsWith(System.IO.Path.DirectorySeparatorChar.ToString())) { out_Filepath_New = out_Filepath_New.Substring(1); } //Conf_Filepath filepath_Conf_New = new Conf_FilepathImpl(log_Method.Fullname, null); //filepath_Conf_New.I nitPath(filepath_New1, log_Reports); //out_Filepath_ExprNew = new Expression_Node_FilepathImpl(filepath_Conf_New); } else { //失敗 out_Filepath_New = ""; if (isRequired) { // エラー。 goto gt_Error_Failure; } } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_Failure: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー922!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("ファイルパスの加工に失敗しました。\n"); s.Append("[" + my + "]の頭から、フォルダー[" + you + "]を切りぬこうとしましたが、フォルダーが違いました。"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// 『レイアウト設定ファイル』を読取ります。 /// </summary> public void LoadUserformconfigFile( TableUserformconfig fo_Config_Formgroup, Table_Humaninput o_Table_Form, MemoryApplication memoryApplication, Log_Reports pg_Logging ) { Log_Method pg_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); pg_Method.BeginMethod(Info_LayoutImpl.Name_Library, this, "LoadUserformconfigFile",pg_Logging); // // // // データ・タイプです。 string sTypeData; if (pg_Logging.Successful) { if (null != o_Table_Form.Typedata) { sTypeData = o_Table_Form.Typedata; } else { sTypeData = ""; } } else { sTypeData = ""; } if (pg_Logging.Successful) { // TREEフィールドの有無チェック if ( ValuesTypeData.S_TABLE_FORM == sTypeData && !o_Table_Form.DataTable.Columns.Contains(NamesFld.S_TREE)) { // // エラー goto gt_Error_NotFoundTreeField; } } string sFoundName; string sFoundNameRef; if (pg_Logging.Successful) { // NAMEフィールドの存在する有無 bool bExistsName = o_Table_Form.DataTable.Columns.Contains("NAME"); // NAME_REFフィールドの存在する有無 bool bExistsNameRef = o_Table_Form.DataTable.Columns.Contains("NAME_REF"); // NAME、NAME_REFフィールドが同時に存在する有無 bool bExistsDoubleNames = bExistsName && bExistsNameRef; // // コントロールのプロパティー設定を読取。 // foreach (DataRow dataRow in o_Table_Form.DataTable.Rows) { RecordUserformconfig fo_Record = null; bool bRecordNew = false; // // ・NAMEとNAME_REFフィールドの両方に記述があればエラー。 // ・NAMEフィールドがあり、コントロール名が記述されていれば、レコードを新規作成。 // ・NAME_REFフィールドがあり、コントロール名が記述されていれば、既存レコードを編集。 // if (bExistsNameRef) { string sFieldName = "NAME_REF"; pg_Logging.Log_Callstack.Push(pg_Method, "①"); String_HumaninputImpl.TryParse( dataRow[sFieldName],// この連想配列は大文字・小文字を区別しないのが欠点。 out sFoundNameRef, o_Table_Form.Name, sFieldName, pg_Method, pg_Logging ); pg_Logging.Log_Callstack.Pop(pg_Method, "①"); if (!pg_Logging.Successful) { // エラー goto gt_EndMethod; } } else { sFoundNameRef = ""; } if (bExistsName) { string sFieldName = "NAME"; if (dataRow[sFieldName] is DBNull) { // // NAMEフィールドが空欄ならレコードを無視。 continue; } pg_Logging.Log_Callstack.Push(pg_Method, "②"); String_HumaninputImpl.TryParse( dataRow[sFieldName], out sFoundName, o_Table_Form.Name, sFieldName, pg_Method, pg_Logging ); pg_Logging.Log_Callstack.Pop(pg_Method, "②"); if (!pg_Logging.Successful) { // エラー goto gt_EndMethod; } } else { sFoundName = ""; } if (bExistsDoubleNames && "" != sFoundName && "" != sFoundNameRef) { // エラー goto gt_Error_DoubleNames; } if (bExistsName && "" != sFoundName) { fo_Record = new RecordUserformconfigImpl(fo_Config_Formgroup); bRecordNew = true; } if (bExistsNameRef && "" != sFoundNameRef) { foreach (RecordUserformconfig fo_Record2 in fo_Config_Formgroup.List_RecordUserformconfig) { string sName_Control; fo_Record2.TryGetString(out sName_Control, NamesFld.S_NAME, true, "", memoryApplication, pg_Logging); if (sName_Control == sFoundNameRef) { fo_Record = fo_Record2; break; } } } if (null == fo_Record) { continue; } if (pg_Logging.Successful) { // // レイアウト・テーブル一覧。 // またはレイアウト・テーブル。 // または未指定。 // if ( ValuesTypeData.S_TABLES_FORM == sTypeData || ValuesTypeData.S_TABLE_FORM == sTypeData || "" == sTypeData) { int nResult = this.Read_Form( fo_Record, dataRow, o_Table_Form, fo_Config_Formgroup, memoryApplication, pg_Logging ); if (2 == nResult) { // 追加せず中断する。 continue; } } } if (pg_Logging.Successful) { // // レイアウト・テーブル(リスト) // if (ValuesTypeData.S_TABLE_FORM_LST == sTypeData) { int nResult = this.Read_FormLst( true, fo_Record, dataRow, o_Table_Form, pg_Logging ); if (2 == nResult) { // 編集せず中断する。 continue; } } } if (pg_Logging.Successful) { // 正常時。 if (bRecordNew) { fo_Config_Formgroup.List_RecordUserformconfig.Add(fo_Record); } } }//各行 } else { //config_formGroup = null; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundTreeField: // テーブルタイプが「Form」で、"TREE" フィールドがないとき。 // (Form_lstタイプには、TREEフィールドは要らない) if (pg_Logging.CanCreateReport) { Log_RecordReports r = pg_Logging.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー91026!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("指定のテーブル["); s.Append(o_Table_Form.Name); s.Append("に、"); s.Newline(); s.Append("TREEフィールドが見つかりませんでした。TREEフィールドは必要です。"); s.Newline(); s.Newline(); s.Newline(); // // 問題箇所ヒント // s.Append(" BaseDirectory=["); s.Append(o_Table_Form.Expression_Filepath_ConfigStack.Directory_Base); s.Append("]"); s.Newline(); s.Newline(); s.Append(" HumanInputText=["); s.Append(o_Table_Form.Expression_Filepath_ConfigStack.Humaninput); s.Append("]"); s.Newline(); s.Newline(); // ヒント s.Append(r.Message_Configuration(o_Table_Form)); r.Message = s.ToString(); pg_Logging.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_DoubleNames: // NAMEフィールドと、NAME_REFフィールドの両方に記述があれば。 // (両方に記述してはいけない) if (pg_Logging.CanCreateReport) { Log_RecordReports r = pg_Logging.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー901!", pg_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("指定のテーブル["); t.Append(o_Table_Form.Name); t.Append("の中に、"); t.Newline(); t.Append("NAMEとNAME_REFフィールドの両方に記述があるものがありました。"); t.Newline(); t.Append("両方同時に記述してはいけません。"); t.Newline(); t.Newline(); t.Newline(); t.Append("NAME=["); t.Append(sFoundName); t.Append("]"); t.Newline(); t.Append("NAME_REF=["); t.Append(sFoundNameRef); t.Append("]"); t.Newline(); t.Newline(); t.Newline(); // // 問題箇所ヒント // t.Append(" BaseDirectory=["); t.Append(o_Table_Form.Expression_Filepath_ConfigStack.Directory_Base); t.Append("]"); t.Newline(); t.Newline(); t.Append(" HumanInputText=["); t.Append(o_Table_Form.Expression_Filepath_ConfigStack.Humaninput); t.Append("]"); t.Newline(); t.Newline(); // ヒント t.Append(r.Message_Configuration(o_Table_Form)); r.Message = t.ToString(); pg_Logging.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: pg_Method.EndMethod(pg_Logging); }
//──────────────────────────────────────── /// <summary> /// 警告が出ていれば、そのテキスト。 /// </summary> /// <returns></returns> public string ToText(string sGroupTag) { Log_Method log_Method = new Log_MethodImpl(0); Log_Reports log_Reports_ThisMethod = new Log_ReportsImpl(log_Method); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "ToText", log_Reports_ThisMethod); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("ログ出力:"); s.Newline(); int nErrorCount = 0; List <Log_RecordReports> listCopy = new List <Log_RecordReports>(this.list_Record); foreach (Log_RecordReports log_RecordReport in listCopy)//todo:bug:ここで リストが変更されているときに例外を出してしまう。 { // グループ・タグが指定されていれば、 // グループ・タグが一致するメッセージだけを出力します。 if (log_RecordReport.EnumReport == EnumReport.Error) { if ("" == sGroupTag || sGroupTag == log_RecordReport.Tag_Group) { s.Append("(No."); s.Append(nErrorCount); s.Append(") "); // タイトル s.Append(log_RecordReport.ErrorSymbol); if ("" != log_RecordReport.Tag_Group) { // グループ・タグ s.Append(log_RecordReport.Tag_Group); } s.Newline(); s.Newline(); if ("" != log_RecordReport.Logstack) { s.Append("エラー発生元データの推測ヒント:"); s.Append(log_RecordReport.Logstack); s.Newline(); s.Newline(); } s.Append(log_RecordReport.GetMessage(this)); s.Newline(); s.Newline(); if ("" != log_RecordReport.Logstack) { s.Append("プログラム実行経路推測ヒント:"); s.Append(this.Log_Callstack.ToString()); s.Newline(); s.Newline(); } s.Newline(); s.Newline(); // エラーが発生したメソッド。 s.Append(log_RecordReport.FullnameMethod); s.Newline(); } // カウンターは、読み飛ばしたエラーもきちんとカウント。 nErrorCount++; } } { s.Append(Log_RecordReportsImpl.ToText_Separator()); } { if ("" != this.Comment_EventCreationMe) { s.Append("ロガーの作成に関するコメント:"); s.Append(this.Comment_EventCreationMe); s.Newline(); } } { if (null != this.log_Method_CreationMe) { s.Append("ロガー生成場所:"); s.Append(this.Log_Method_CreationMe.Fullname); s.Newline(); } else { s.Append("ロガー生成場所:ヌル"); s.Newline(); } } { s.Append("このエラーメッセージを作っているロガー:"); s.Append(log_Method.Fullname); s.Newline(); } if (!Log_ReportsImpl.BDebugmode_Static) { s.Newline(); s.Newline(); s.Append("このデバッグ情報は、DebugModeフラグが立っていない状態でのものです。"); s.Newline(); s.Append("DDebuggerImpl.DebugModeフラグを立てると、今より詳細な情報が出力されるかもしれません。"); s.Newline(); } log_Method.EndMethod(log_Reports_ThisMethod); log_Reports_ThisMethod.EndLogging(log_Method); return(s.ToString()); }
//──────────────────────────────────────── /// <summary> /// DataRow → Dictionary /// </summary> /// <param name="row"></param> /// <param name="log_Reports"></param> public void Add(DataRow row, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Table.Name_Library, this, "Add",log_Reports); Dictionary<string, Value_Humaninput> record = new Dictionary<string, Value_Humaninput>(); int nFieldCount = row.ItemArray.Length; for (int nFieldIndex = 0; nFieldIndex < nFieldCount; nFieldIndex++) { // フィールド名 string sFieldName = xenonTable.RecordFielddefinition.ValueAt(nFieldIndex).Name_Trimupper; // 値 Value_Humaninput oValue; if (row[nFieldIndex] is DBNull) { //// デバッグ //if (true) //{ //Log_TextIndented txt = new Log_TextIndentedImpl(); // txt.Append(InfxenonTable.LibraryName + ":" + this.GetType().Name + "#Add:【ヌル】"); // txt.Append(" field=[" + sFieldName + "]"); // ystem.Console.WriteLine(txt.ToString()); //} String sConfigStack = xenonTable.Expression_Filepath_ConfigStack.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } EnumTypeFielddefinition typeField = xenonTable.RecordFielddefinition.ValueAt(nFieldIndex).Type_Field; switch (typeField) { case EnumTypeFielddefinition.String: oValue = new String_HumaninputImpl(sConfigStack); break; case EnumTypeFielddefinition.Int: oValue = new Int_HumaninputImpl(sConfigStack); break; case EnumTypeFielddefinition.Bool: oValue = new Bool_HumaninputImpl(sConfigStack); break; default: // エラー。 goto gt_Error_UndefinedType; } } else { oValue = (Value_Humaninput)row[nFieldIndex]; //// デバッグ //if (true) //{ //Log_TextIndented txt = new Log_TextIndentedImpl(); // txt.Append(InfxenonTable.LibraryName + ":" + this.GetType().Name + "#Add:【○】"); // txt.Append(" 値=[" + oValue.HumanInputString + "]"); // ystem.Console.WriteLine(txt.ToString()); //} } record.Add(sFieldName, oValue); } this.List_Field.Add(record); // 正常 goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_UndefinedType: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー293!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(" 未定義の型です。プログラムのミスの可能性があります。"); s.Append(Environment.NewLine); s.Append(Environment.NewLine); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return; }
//──────────────────────────────────────── /// <summary> /// 例えば ("access",”from”)と指定すれば、 /// 指定リストの要素の中で <~ access=”from,to”> といった属性を持つものはヒットする。 /// /// 選択アイテムをリストから除外するなら bRemove=true にします。 /// </summary> /// <param name="sName"></param> /// <param name="sExpectedValue"></param> /// <param name="request_Items"></param> /// <param name="log_Reports"></param> /// <returns></returns> private static List<Expression_Node_String> SelectItemsByPmAsCsv_Full_( List<Expression_Node_String> ecList_Item, string sPmName, bool bUnconditional,//無条件一致なら真 string sExpectedValue, bool bRemove, EnumHitcount hits, Log_Reports log_Reports ) { Log_Method pg_Method = new Log_MethodImpl(0); pg_Method.BeginMethod(Info_Controls.Name_Library, "Util_E_NodeImpl", "SelectItemsByAttrAsCsv_Full_",log_Reports); // // //Util_E_NodeImpl dammy_This = new Util_E_NodeImpl(); List<Expression_Node_String> ecList_Result = new List<Expression_Node_String>(); for (int nI = 0; nI < ecList_Item.Count; nI++ ) { Expression_Node_String ec_Item = ecList_Item[nI]; if (log_Reports.Successful) { Expression_Node_String ec_AttrValue; bool bHit = ec_Item.TrySelectAttribute(out ec_AttrValue, sPmName, EnumHitcount.One_Or_Zero, log_Reports); if (bHit) { string sAttrValue = ec_AttrValue.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports); CsvTo_ListImpl to = new CsvTo_ListImpl(); List<string> sList_Value = to.Read(sAttrValue); bool bHit10 = false; if(bUnconditional) { //if(""!=sAttrValue) //{ bHit = true; //} } else if(sList_Value.Contains(sExpectedValue)) { bHit10 = true; } if (bHit10) { ecList_Result.Add(ec_Item); if (bRemove) { // 削除 ecList_Item.RemoveAt(nI); nI--; } if (EnumHitcount.First_Exist == hits || EnumHitcount.First_Exist_Or_Zero == hits) { // 最初の1件で削除は終了。複数件ヒットするかどうかは判定しない。 break; } } } } } //ystem.Console.WriteLine(Info_Forms.LibraryName + ":Util_E_NodeImpl.GetItemsByAttrAsCsv: 直後 list_E_Result.Count=[" + list_E_Result.Count + "]"); if (EnumHitcount.One == hits) { // 必ず1件だけヒットする想定。 if (ecList_Result.Count != 1) { goto gt_Error_NotOne; } } else if (EnumHitcount.First_Exist == hits) { // 必ずヒットする。複数件あれば、最初の1件だけ取得。 if (0 == ecList_Result.Count) { goto gt_Error_NoHit; } else if (1 < ecList_Result.Count) { ecList_Result.RemoveRange(1, ecList_Result.Count - 1); } } else if (EnumHitcount.First_Exist_Or_Zero == hits) { // ヒットすれば最初の1件だけ、ヒットしなければ0件の想定。 if (1 < ecList_Result.Count) { ecList_Result.RemoveRange(1, ecList_Result.Count - 1); } } else { } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NoHit: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー102!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("必ず、1件以上ヒットする指定でしたが、["); s.Append(ecList_Result.Count); s.Append("]件ヒットしました。"); s.Newline(); s.Newline(); s.AppendI(1, "ヒット件数=["); s.Append(ecList_Result.Count); s.Append("]"); s.Newline(); s.AppendI(1, "items.Count=["); s.Append(ecList_Item.Count); s.Append("]"); s.Newline(); s.AppendI(1, "sPmName=["); s.Append(sPmName); s.Append("]"); s.Newline(); s.AppendI(1, "無条件一致か?=["); s.Append(bUnconditional); s.Append("]"); s.Newline(); s.AppendI(1, "sExpectedValue=["); s.Append(sExpectedValue); s.Append("]"); s.Newline(); s.AppendI(1, "bRemove=["); s.Append(bRemove); s.Append("]"); s.Newline(); s.AppendI(1, "request_Items=["); s.Append(hits); s.Append("]"); s.Newline(); s.Append("┌────────┐処理後に残った内容 要素数=["); s.Append(ecList_Item.Count); s.Append("]"); s.Newline(); foreach (Expression_Node_String e_Item2 in ecList_Item) { string sAttrNameValue; bool bHit = e_Item2.TrySelectAttribute(out sAttrNameValue, sPmName, EnumHitcount.One_Or_Zero, log_Reports); s.AppendI(1, "・「E■["); s.Append(e_Item2.Cur_Configuration.Name); s.Append("] name=”["); s.Append(sAttrNameValue); s.Append("] 値=”["); s.Append(e_Item2.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports)); s.Append("]”」"); s.Newline(); e_Item2.ToText_Snapshot(s); } s.Append("└────────┘"); s.Newline(); // ヒント if(1<ecList_Item.Count) { Expression_Node_String parent_Expr = ecList_Item[0].Parent_Expression; if (null != parent_Expr) { s.Append("┌────────┐先頭要素の親"); s.Newline(); parent_Expr.ToText_Snapshot(s); s.Append("└────────┘"); s.Newline(); } } r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NotOne: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー101!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("必ず、1件のみ取得する指定でしたが、["); s.Append(ecList_Result.Count); s.Append("]件取得しました。"); s.Newline(); s.Newline(); s.AppendI(1, "sPmName=["); s.Append(sPmName); s.Append("]"); s.Newline(); s.AppendI(1, "無条件一致か?=["); s.Append(bUnconditional); s.Append("]"); s.Newline(); s.AppendI(1, "sExpectedValue=["); s.Append(sExpectedValue); s.Append("]"); s.Newline(); s.AppendI(1, "bRemove=["); s.Append(bRemove); s.Append("]"); s.Newline(); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: pg_Method.EndMethod(log_Reports); return ecList_Result; }
/// <summary> /// ヒットした件数がなかったとき、エラーになるか否か。 /// </summary> /// <param name="hits"></param> /// <param name="log_Reports"></param> /// <returns></returns> public static bool IsError_IfNoHit(EnumHitcount hits, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, "Utility_Hitcount", "IsError_IfNoHit", log_Reports); bool result; switch(hits) { case EnumHitcount.Exists: result = true;//エラーになる。 break; case EnumHitcount.First_Exist: result = true;//エラーになる。 break; case EnumHitcount.First_Exist_Or_Zero: result = false;//セーフ。 break; case EnumHitcount.One: result = true;//エラーになる。 break; case EnumHitcount.One_Or_Zero: result = false;//セーフ。 break; case EnumHitcount.Unconstraint: result = false;//セーフ。 break; default: //エラー result = true;//意味が変わるが、エラーにする。 goto gt_Error_Default; } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_Default: { if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー031!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("Enum型の対応していない値["); t.Append(hits.ToString()); t.Append("]"); t.Newline(); r.Message = t.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── #endregion gt_EndMethod: log_Method.EndMethod(log_Reports); return result; }
//──────────────────────────────────────── #endregion #region アクション //──────────────────────────────────────── /// <summary> /// attr系要素の追加。 /// /// 既に追加されている要素は、追加できない。 /// </summary> public void Add( string key, string value, Conf_String cValue, bool isRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Add", log_Reports); // // if (!this.map.ContainsKey(key)) { this.map.Add(key, value); } else { if (isRequired) { // エラー goto gt_Error_Duplicate; } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Duplicate: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー345!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("要素<"); s.Append(this.owner.Name); s.Append(">に、同じ名前の属性が重複していました。"); s.Newline(); s.Append("入れようとした要素の名前=["); s.Append(key); s.Append("]"); s.Newline(); // ヒント s.Append(r.Message_Conf(cValue)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── public override string Execute5_Main(Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_Functions.Name_Library, this, "Execute5_Main",log_Reports); string sFncName0; this.TrySelectAttribute(out sFncName0, PmNames.S_NAME.Name_Pm, EnumHitcount.One_Or_Zero, log_Reports); if (log_Reports.CanStopwatch) { log_Method.Log_Stopwatch.Message = "Nアクション[" + sFncName0 + "]実行"; log_Method.Log_Stopwatch.Begin(); } // // Expression_Node_String err_Ec_FcName1; if (this.EnumEventhandler == EnumEventhandler.O_Lr) { if (this.Functionparameterset.Sender is Customcontrol) { Customcontrol fcCc = (Customcontrol)this.Functionparameterset.Sender; string sName_Usercontrol = fcCc.ControlCommon.Expression_Name_Control.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); log_Reports.Comment_EventCreationMe = "[" + sName_Usercontrol + "]コントロールが、[" + sFncName0 + "]アクションを実行。"; } else { log_Reports.Comment_EventCreationMe = "[" + sFncName0 + "]アクションを実行。"; } // // // // // // このNAction29を含んでいるcontrol要素から // コントロールの名前を取得。 Expression_Node_String ec_FcName1; // // このNAction29要素を含んでいる control要素から、コントロールの名前を取得。 List<Usercontrol> list_FcUc; if (log_Reports.Successful) { // 正常時 Configuration_Node cf_Event = this.Cur_Configuration.GetParentByNodename( NamesNode.S_EVENT, EnumConfiguration.Unknown, false, log_Reports); if (null != cf_Event) { Configuration_Node owner_Configurationtree_Control = cf_Event.GetParentByNodename( NamesNode.S_CONTROL1, EnumConfiguration.Tree, true, log_Reports); if (null != owner_Configurationtree_Control) { string sName_Usercontrol; ((Configurationtree_Node)owner_Configurationtree_Control).Dictionary_Attribute.TryGetValue(PmNames.S_NAME, out sName_Usercontrol, true, log_Reports); Expression_Node_StringImpl ec_Str = new Expression_Node_StringImpl(this, this.Cur_Configuration); ec_Str.AppendTextNode( sName_Usercontrol, this.Cur_Configuration, log_Reports ); ec_FcName1 = ec_Str; } else { ec_FcName1 = null; } } else { ec_FcName1 = null; } // // 指定のコントロール // list_FcUc = this.Owner_MemoryApplication.MemoryForms.GetUsercontrolsByName( ec_FcName1, true, log_Reports ); } else { // // エラー。 ec_FcName1 = null; list_FcUc = null; err_Ec_FcName1 = ec_FcName1; goto gt_Error_NullFcUc; } // ここで、fcUc は必ずある。 Usercontrol fct = list_FcUc[0]; // // // // View // // // // 最初の1個のみ有効。必ずあるとする。 List<Expression_Node_String> ecList_View = fct.ControlCommon.Expression_Control.SelectDirectchildByNodename(NamesNode.S_VIEW, false, EnumHitcount.One, log_Reports); if (!log_Reports.Successful) { goto gt_EndMethod; } Expression_Node_StringImpl ec_View = (Expression_Node_StringImpl)ecList_View[0]; // // O → N は、Fcnfをロードした時点で実行済み。 if (ec_View.List_Expression_Child.Count < 1) { // // エラー。 // // このアクションを使うからには、 // 必ず<view>の中に子要素がないといけない。 err_Ec_FcName1 = ec_FcName1; goto gt_Error_EmptyView; } object errorRule = null; Expression_Node_String err_Ec_DataTarget = null; if (log_Reports.Successful) { // 正常時 ec_View.List_Expression_Child.ForEach(delegate(Expression_Node_String ec_Child, ref bool bRemove, ref bool bBreak) { string sFncName; ec_Child.TrySelectAttribute(out sFncName, PmNames.S_NAME.Name_Pm, EnumHitcount.One_Or_Zero, log_Reports); if ( NamesNode.S_FNC == ec_Child.Cur_Configuration.Name && NamesFnc.S_LISTBOX_LABELS == sFncName ) { // <f-list-box-labels> // // fcUc は、必ずリストボックス。 if (!(fct is UsercontrolListbox)) { // // エラー。 goto gt_Error_NotListbox; } UsercontrolListbox uctLst = (UsercontrolListbox)fct; // // リストボックスの表示を自作します。項目の高さが固定の場合。 uctLst.DrawMode = DrawMode.OwnerDrawFixed; // // N → Uc // // 描画プログラムの作成。 ListboxItemDrawer_02Impl drawer = new ListboxItemDrawer_02Impl( this.Owner_MemoryApplication); // // item-valur-to-variable="" 属性 // //if (null == nF11.E_ItemValueToVariable) { // <データ access="to">から取りたい。 Expression_Node_String ec_ItemValueToVariable = null;//ソース情報利用 List<Expression_Node_String> ecList_DataTarget; { List<Expression_Node_String> ecList_Data = uctLst.ControlCommon.Expression_Control.SelectDirectchildByNodename( NamesNode.S_DATA, false, EnumHitcount.Unconstraint, log_Reports); ecList_DataTarget = Utility_Expression_NodeImpl.SelectItemsByPmAsCsv(ecList_Data, PmNames.S_ACCESS.Name_Pm, ValuesAttr.S_TO, false, EnumHitcount.First_Exist, log_Reports); } if (!log_Reports.Successful) { goto gt_EndMethod2; } Expression_Node_String ec_DataTarget = ecList_DataTarget[0]; err_Ec_DataTarget = ec_DataTarget; if (null != ec_DataTarget) { bool bHit = ec_DataTarget.TrySelectAttribute( out ec_ItemValueToVariable, PmNames.S_NAME_VAR.Name_Pm, EnumHitcount.One, log_Reports); if (bHit) { drawer.Expression_ValueVariableName = ec_ItemValueToVariable; } else { // エラー。 goto gt_Error_NullItemValueToVariable; } } else { // エラー。 goto gt_Error_NotFoundDataTarget; } } //else //{ // // // // 変数名設定。 // drawer.Ec_ValueVariableName = nF11.E_ItemValueToVariable; //} // // <fnc name=”Sf:item-label;”> List<Expression_Node_String> ecList_Fnc = ec_Child.SelectDirectchildByNodename(NamesNode.S_FNC, false, EnumHitcount.Unconstraint, log_Reports); ecList_Fnc = Utility_Expression_NodeImpl.SelectItemsByPmAsCsv(ecList_Fnc, PmNames.S_NAME.Name_Pm, NamesFnc.S_ITEM_LABEL2, false, EnumHitcount.First_Exist, log_Reports); if (!log_Reports.Successful) { // エラー。 goto gt_EndMethod2; } drawer.Expression_ItemLabel = ecList_Fnc[0]; if (log_Reports.Successful) { // // 描画プログラムの変更。 uctLst.ListboxItemDrawer = drawer; } } else { errorRule = ec_Child; // // エラー。未定義の<view>。 goto gt_Error_UndefinedView; } goto gt_EndMethod2; // // // // // // エラー。 gt_Error_NotListbox: { Builder_TexttemplateP1p tmpl = new Builder_TexttemplateP1pImpl(); tmpl.SetParameter(1, ec_FcName1.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports), log_Reports);//コントロール名 tmpl.SetParameter(2, fct.GetType().Name, log_Reports);//コントロールのクラス名 this.Owner_MemoryApplication.CreateErrorReport("Er:110019;", tmpl, log_Reports); } goto gt_EndMethod2; // // エラー。 gt_Error_NotFoundDataTarget: { Builder_TexttemplateP1p tmpl = new Builder_TexttemplateP1pImpl(); tmpl.SetParameter(1, ec_FcName1.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports), log_Reports);//コントロール名 this.Owner_MemoryApplication.CreateErrorReport("Er:110020;", tmpl, log_Reports); } goto gt_EndMethod2; // // エラー。 gt_Error_NullItemValueToVariable: { Builder_TexttemplateP1p tmpl = new Builder_TexttemplateP1pImpl(); tmpl.SetParameter(1, PmNames.S_NAME_VAR.Name_Pm, log_Reports);//引数名NameVar tmpl.SetParameter(2, ec_FcName1.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports), log_Reports);//コントロール名 // // 「access="to"」要素を取得しているような。 // Log_TextIndented s1 = new Log_TextIndentedImpl(); err_Ec_DataTarget.ToText_Snapshot(s1); tmpl.SetParameter(3, s1.ToString(), log_Reports);//データターゲットの変数の中身 Log_TextIndented s2 = new Log_TextIndentedImpl(); err_Ec_DataTarget.Cur_Configuration.ToText_Content(s2); tmpl.SetParameter(4, s2.ToString(), log_Reports);//データターゲットの設定の中身 this.Owner_MemoryApplication.CreateErrorReport("Er:110021;", tmpl, log_Reports); } goto gt_EndMethod2; // // エラー。 gt_Error_UndefinedView: { Builder_TexttemplateP1p tmpl = new Builder_TexttemplateP1pImpl(); tmpl.SetParameter(1, errorRule.GetType().Name, log_Reports);//要素のクラス名 tmpl.SetParameter(2, ec_Child.Cur_Configuration.Name, log_Reports);//設定の子要素のノード名 tmpl.SetParameter(3, sFncName, log_Reports);//設定の子要素の関数名 this.Owner_MemoryApplication.CreateErrorReport("Er:110022;", tmpl, log_Reports); } goto gt_EndMethod2; gt_EndMethod2: ; }); // // 「表示プログラム」を作成、 // リストボックスにその「リスト作成プログラム」を渡す。 // リストボックスは再表示されるたびに、 // その「リスト作成プログラム」を実行。 // 以下、その「表示プログラム」の内容。 // // ループカウンタの回数だけ、リストに項目を追加。 // // その内容は、値が<a-item-value>から取得。 // // その内容は、表示ラベルが<a-item-label>から取得。 // // その表示ラベルは、次の条件に一致した時、グレー色にする。 // // <a-item-gray-out> // <f-all-true> // <a-empty-field> } goto gt_EndMethod; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NullFcUc: { Builder_TexttemplateP1p tmpl = new Builder_TexttemplateP1pImpl(); tmpl.SetParameter(1, err_Ec_FcName1.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports), log_Reports);//コントロール名 this.Owner_MemoryApplication.CreateErrorReport("Er:110023;", tmpl, log_Reports); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_EmptyView: { Builder_TexttemplateP1p tmpl = new Builder_TexttemplateP1pImpl(); tmpl.SetParameter(1, err_Ec_FcName1.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports), log_Reports);//検索ヒット数 this.Owner_MemoryApplication.CreateErrorReport("Er:110024;", tmpl, log_Reports); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return ""; }
//──────────────────────────────────────── public static Value_Humaninput NewInstance( object value, bool isRequired, string nodeConfigtree, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Table.Name_Library, "Utility_HumaninputValue", "NewInstance", log_Reports); Value_Humaninput result; if(value is String_HumaninputImpl) { result = new String_HumaninputImpl(nodeConfigtree); } else if(value is Int_HumaninputImpl) { result = new Int_HumaninputImpl(nodeConfigtree); } else if(value is Bool_HumaninputImpl) { result = new Bool_HumaninputImpl(nodeConfigtree); } else { result = null; if (isRequired) { //エラー goto gt_Error_AnotherType; } } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_AnotherType: if(log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー292!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("▲エラー201!(" + Info_Table.Name_Library + ")"); s.Newline(); s.Append("string,int,boolセルデータクラス以外のオブジェクトが指定されました。"); s.Newline(); s.Append("指定された値のクラス=["); s.Append(value.GetType().Name); s.Append("]"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return result; }
//──────────────────────────────────────── public void Judge( out bool isJudge, string name_KeyField, string value_Expected, bool isRequired_ExpectedValue, DataRow row, Configuration_Node parent_Query, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, this, "Judge",log_Reports); // // // // try { Value_Humaninput valueH = (Value_Humaninput)row[name_KeyField]; // (5)キーが空欄で、検索ヒット必須でなければ、無視します。【bool型フィールドの場合】 if (Bool_HumaninputImpl.IsSpaces(valueH)) { isJudge = false; goto gt_EndMethod; } // // (6)この行の、キー_フィールドの値を取得。 // bool isKeyValue; bool isParsedSuccessful = Bool_HumaninputImpl.TryParse( valueH, out isKeyValue, EnumOperationIfErrorvalue.Error, null, log_Reports ); if (log_Reports.Successful) { if (!isParsedSuccessful) { // エラー。 isJudge = false; if (log_Reports.CanCreateReport) { Log_RecordReports d_Report = log_Reports.BeginCreateReport(EnumReport.Error); d_Report.SetTitle("▲エラー699!", log_Method); d_Report.Message = "bool型パース失敗。"; log_Reports.EndCreateReport(); } goto gt_EndMethod; } } bool isExpectedValue; if (log_Reports.Successful) { // (8)キー値をbool型に変換します。 bool isParseSuccessful2 = bool.TryParse(value_Expected, out isExpectedValue); if (!isParseSuccessful2) { isJudge = false; if (isRequired_ExpectedValue) { // 空値ではダメという設定の場合。 goto gt_Error_Parse; } goto gt_EndMethod; } } else { isExpectedValue = false; } // (8)該当行をレコードセットに追加。 if (log_Reports.Successful) { if (isKeyValue == isExpectedValue) { isJudge = true; } else { isJudge = false; } } else { isJudge = false; } } catch (RowNotInTableException) { // (9)指定行がなかった場合は、スルー。 isJudge = false; // // 指定の行は、テーブルの中にありませんでした。 // 再描画と、行の削除が被ったのかもしれません。 // いわゆる「処理中」です。 // //.WriteLine(this.GetType().Name+"#GetValueStringList: ["+refTable.Name+"]テーブルには、["+ttbwIndex+"]行が存在しませんでした。もしかすると、削除されたのかもしれません。エラー:"+e.Message); } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Parse: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー286!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.AppendI(0, "<Select_KeyBoolImplクラス>"); s.Append(Environment.NewLine); s.AppendI(1, "これはbool型値のプログラムです。他の型のプログラムを使ってください。"); s.Append(Environment.NewLine); s.AppendI(1, "sExpectedValue=["); s.Append(value_Expected); s.Append("]"); s.Append(Environment.NewLine); s.Append(Environment.NewLine); // ヒント parent_Query.ToText_Locationbreadcrumbs(s); s.AppendI(0, "</Select_KeyBoolImplクラス>"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// 「ディレクトリー」と「入力値」の2つを入力すると、「絶対パス」を返します。 /// /// ────────── /// /// 未設定の場合は、空文字列を返します。 /// ※bug:フォルダーパスの場合も空文字列になる?? /// /// ・ファイルパスとして利用できない文字や、予約語が含まれていると例外を投げます。 /// ・絶対パスの文字列の長さが、ファイルシステムで使える制限を越えると例外を投げます。 /// /// もし、設定されたパスが相対パスだった場合に、ベース・パスが設定されていなければ、 /// 起動「.exe」のあったパスが頭に付く。 /// </summary> /// <param name="baseDirectory"></param> /// <param name="humanInputText"></param> /// <param name="flagCheckPathTooLong">絶対パスの文字列の長さが、ファイルシステムで使える上限を超えていた場合に真、そうでない場合 偽にセットされます。</param> /// <param name="okPathTooLong">絶対パスの文字列の長さが、ファイルシステムで使える上限を超えていた場合に、「正常扱いにするなら」真、「エラー扱いにするなら」偽。</param> /// <param name="cur_Conf">デバッグ用情報。人間オペレーターが修正するべき箇所などの情報。</param> /// <returns></returns> public static string ToFilepathabsolute( string directory_Base, string humaninput, ref bool ref_IsTooLong_Path, bool isSafe_TooLong_Path, Log_Reports log_Reports, Configuration_Node cur_Conf ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, "Utility_Configurationtree_Filepath", "ToFilepathabsolute②", log_Reports); // // // // 修正履歴(2009-12-02) // // ・カレント・ディレクトリの移動を使ったコードを書いてはいけない。 // MS-DOSの名残り? // // ・起動「.exe」のディレクトリは Application.StartupPath で取得できる。 // // ・備考: // System.IO.Directory.GetCurrentDirectory()は、 // 「プロセスが開始されたディレクトリ」を返すので、 // openFileDialogで開いたディレクトリを返すこともある。 // // System.IO.Path.GetFullPath(path)も同じ。 Exception err_Excp; string result_Filepath;//ファイルパス // フラグのクリアー。 ref_IsTooLong_Path = false; // // 人間がCSVファイルに記述しているファイル・パス。 // // 「絶対パス」「相対パス」のどちらでも指定されます。 // string filepath_Source = humaninput.Trim(); if ("" == filepath_Source) { // 未設定の場合。 result_Filepath = "";//ファイルパスとしては使えない文字列。 goto gt_EndMethod; } // 「絶対パス」か、「相対パス」かを判断します。 bool isRooted_Path = Utility_Configurationtree_Filepath.IsRooted_Path( filepath_Source, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 result_Filepath = "";//ファイルパスとしては使えない文字列。 goto gt_EndMethod; } if (!isRooted_Path) { // 相対パスの場合 // 「相対パス」に「ベース・ディレクトリー文字列」を連結して、「絶対パス」に変換します。 if ("" != directory_Base) { // 相対パスの相対元となるディレクトリーが設定されていれば。 if (!directory_Base.EndsWith(Path.DirectorySeparatorChar.ToString())) { filepath_Source = directory_Base + Path.DirectorySeparatorChar + filepath_Source; } else { filepath_Source = directory_Base + filepath_Source; } } else { // 起動「.exe」のあったパスを、相対の元となるディレクトリーとします。 if (!directory_Base.EndsWith(Path.DirectorySeparatorChar.ToString())) { filepath_Source = Application.StartupPath + Path.DirectorySeparatorChar + filepath_Source; } else { filepath_Source = Application.StartupPath + filepath_Source; } } } // ここで、パスは 絶対パスに変換されています。 try { // カレントディレクトリは使わない。 // 絶対パスの場合、GetFullPathを通す必要はないが、 // ファイルパスに使えない文字列を判定するために、 // 例外を返すメソッドを使っています。 result_Filepath = System.IO.Path.GetFullPath(filepath_Source); } catch (ArgumentException e) { // 指定のファイルパスに「*」など、ファイルパスとして使えない文字列が含まれていた場合など。 result_Filepath = "";//ファイルパスとしては使えない文字列。 err_Excp = e; goto gt_Error_ArgumentException; } catch (PathTooLongException e) { // ディレクトリーの文字数が、制限数を超えた場合などのエラー。 result_Filepath = "";//ファイルパスとしては使えない文字列。 if (isSafe_TooLong_Path) { // 正常処理扱いとします。 } else { // 異常扱いとします。 err_Excp = e; goto gt_Error_PathTooLongException; } ref_IsTooLong_Path = true; } catch (NotSupportedException e) { //パスのフォーマットが間違っているなどのエラー。 result_Filepath = "";//ファイルパスとしては使えない文字列。 err_Excp = e; goto gt_Error_NotSupportedException; } catch (Exception e) { // それ以外のエラー。 result_Filepath = "";//ファイルパスとしては使えない文字列。 err_Excp = e; goto gt_Error_Exception; } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_ArgumentException: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー107!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("使えないファイルパスです。["); s.Append(filepath_Source); s.Append("] :"); s.Append(err_Excp.Message); cur_Conf.ToText_Locationbreadcrumbs(s); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_PathTooLongException: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー108!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("エラー 入力パス=[" + filepath_Source + "]:(" + err_Excp.GetType().Name + ") "); s.Append(err_Excp.Message); cur_Conf.ToText_Locationbreadcrumbs(s); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NotSupportedException: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー109!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("ファイルパスが間違っているかもしれません。"); s.Newline(); s.AppendI(1,"入力パス=[" + filepath_Source + "]"); s.Newline(); // ヒント s.Append(r.Message_SException(err_Excp)); cur_Conf.ToText_Locationbreadcrumbs(s); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_Exception: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー109!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("エラー 入力パス=[" + filepath_Source + "]"); s.Newline(); // ヒント s.Append(r.Message_SException(err_Excp)); cur_Conf.ToText_Locationbreadcrumbs(s); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return result_Filepath; }
//──────────────────────────────────────── /// <summary> /// /// </summary> /// <param name="e_Result">検索結果。</param> /// <param name="name"></param> /// <param name="bRequired"></param> /// <param name="hits"></param> /// <param name="log_Reports"></param> /// <returns>検索結果が1件以上あれば真。</returns> public bool TrySelect( out Expression_Node_String out_Result_Expr, string name, EnumHitcount hits, Log_Reports log_Reports//bug:ヌルのことがある? ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "TrySelect", log_Reports); // bool isHit; if (this.dicExpression_Item.ContainsKey(name)) { // ヒット。 out_Result_Expr = this.dicExpression_Item[name]; isHit = true; } else { // 一致なし。 isHit = false; if (Utility_Hitcount.IsError_IfNoHit(hits, log_Reports)) { //エラーにする。 out_Result_Expr = null; goto gt_Error_NotFoundOne; } else { // 該当しないキーを指定され、値を取得できなかったが、エラー報告しない。 Configurationtree_Node parent_Conf = new Configurationtree_NodeImpl("!ハードコーディング_NStringDictionaryImpl#Get", null); out_Result_Expr = new Expression_Leaf_StringImpl(null, parent_Conf); } } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundOne: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー141!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("指定された名前["); s.Append(name); s.Append("]は、“EDic(連想配列)”の中にありませんでした。"); s.Newline(); s.Append("┌────────┐キー一覧(個数=["); s.Append(this.dicExpression_Item.Count); s.Append("])"); s.Newline(); foreach (string sKey in this.dicExpression_Item.Keys) { s.Append("["); s.Append(sKey); s.Append("]"); s.Newline(); } s.Append("└────────┘"); s.Newline(); // ヒント if (null != this.Owner_Conf) { s.Append("◆オーナー情報1"); s.Newline(); this.Owner_Conf.ToText_Content(s); } if (0 < this.dicExpression_Item.Count) { foreach (Expression_Node_String e_Item in this.dicExpression_Item.Values) { Expression_Node_String e_Parent = e_Item.Parent_Expression; if (null != e_Parent)//親要素が設定されていないことがある。 { // 最初の1個。 s.Append("◆最初の要素の親の情報。"); s.Newline(); e_Parent.ToText_Snapshot(s); } break; } } // // オーナーの情報。 if (null != this.owner_Conf)//オーナー要素が設定されていないことがある。 { s.Newline(); s.Newline(); s.Append("◆オーナー情報2。"); s.Newline(); this.owner_Conf.ToText_Locationbreadcrumbs(s); } r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return(isHit); }
//──────────────────────────────────────── public override void XmlToConfigurationtree( XmlElement cur_X,//<arg1> Configurationtree_Node parent_Cf,//<fnc> MemoryApplication memoryApplication, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_XmlToConf.Name_Library, this, "XmlToConfigurationtree", log_Reports); // // // // // // 自 // // // Configurationtree_Node cur_Cf = this.CreateMyself(cur_X, parent_Cf, memoryApplication, log_Reports); // // // // 属性 // // // //string sFncName; //s_Parent.Dictionary_Attribute.TryGetValue(PmNames.NAME.Name_Attr, out sFncName, false, log_Reports); if (NamesNode.S_VALIDATOR == parent_Cf.Name) { // // <validator>の子<arg> // // // name=”” { XmlNode xNode = cur_X.Attributes.GetNamedItem(PmNames.S_NAME.Name_Attribute); if (null != xNode) { string sName = xNode.Value; cur_Cf.Dictionary_Attribute.Set(PmNames.S_NAME.Name_Pm, sName, log_Reports); } } // // value=”” string sValue; { XmlNode xNode = cur_X.Attributes.GetNamedItem(PmNames.S_VALUE.Name_Attribute); if (null != xNode) { sValue = xNode.Value; cur_Cf.Dictionary_Attribute.Add(PmNames.S_VALUE.Name_Pm, sValue, cur_Cf, true, log_Reports); } else { sValue = ""; } } { string sName; cur_Cf.Dictionary_Attribute.TryGetValue(PmNames.S_NAME, out sName, false, log_Reports); //O_Name o_Name = new O_NameImpl(sName, s_Cur); parent_Cf.Dictionary_Attribute.Add( sName, sValue, parent_Cf, false, log_Reports); } } else { this.Parse_SAttribute(cur_X, cur_Cf, memoryApplication, log_Reports); } // // // // 子 // // // this.Parse_ChildNodes(cur_X, cur_Cf, memoryApplication, log_Reports); // // // // 親へ連結 // // // string err_Parent_SName; string parent_SName_Fnc; string parent_SAmemory; if(!log_Reports.Successful) { // エラー goto gt_EndMethod; } else if ( // 親<data > NamesNode.S_DATA == parent_Cf.Name ) { bool bHit = parent_Cf.Dictionary_Attribute.TryGetValue(PmNames.S_NAME, out parent_SName_Fnc, false, log_Reports); bool bHit3 = parent_Cf.Dictionary_Attribute.TryGetValue(PmNames.S_MEMORY, out parent_SAmemory, true, log_Reports); if ( ValuesAttr.S_RECORDS == parent_SAmemory || ValuesAttr.S_VARIABLE == parent_SAmemory ) { // // 親 <data memory=”records”> // 親 <data memory=”variable”> // // // 属性としては追加する。 // string sName_Fnc; bool bHit2 = cur_Cf.Dictionary_Attribute.TryGetValue(PmNames.S_NAME, out sName_Fnc, false, log_Reports); if (bHit2) { string sValue_Arg; cur_Cf.Dictionary_Attribute.TryGetValue(PmNames.S_VALUE, out sValue_Arg, false, log_Reports); // 「S■data-source」の(<arg5 name属性>としてtarget値を追加。 // 属性とする。 if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole( "<データ target=[" + parent_SAmemory + "]>に属性追加 [" + sName_Fnc + "]←[" + sValue_Arg + "]"); } parent_Cf.Dictionary_Attribute.Add(sName_Fnc, sValue_Arg, parent_Cf, true, log_Reports); } } else { // エラー err_Parent_SName = parent_Cf.Name; goto gt_Error_Target; } } else { // 親が<data>以外。 bool bHit = parent_Cf.Dictionary_Attribute.TryGetValue(PmNames.S_NAME, out parent_SName_Fnc, true, log_Reports);//name属性が無い親もある?? if (!log_Reports.Successful) { log_Method.WriteWarning_ToConsole("s_Parent.Name_Node=[" + parent_Cf.Name + "]"); } else { } if ( NamesNode.S_FNC != parent_Cf.Name && NamesNode.S_VALIDATOR != parent_Cf.Name && NamesNode.S_COMMON_FUNCTION != parent_Cf.Name && NamesFnc.S_SWITCH != parent_SName_Fnc //旧仕様に対応 ) { // 親要素が<fnc>でも<validator><common-function><f-switch>でもない。 // エラー err_Parent_SName = parent_Cf.Name; goto gt_Error_Parent; } else if ( // 親が<fnc name=”Sf:where;”> NamesNode.S_FNC == parent_Cf.Name && NamesFnc.S_WHERE == parent_SName_Fnc) { // この子arg1要素は、 // 親要素「S■f-cell」には追加しません。 // 【追加 2012-06-02】 // 現状では、「S■a-where」に子「S■arg1」要素が含まれていると、 // 「E■f-cell」にarg1要素を追加してしまうので都合が悪い。 // // 属性としては追加する。 // string sArgAname; bool bHit2 = cur_Cf.Dictionary_Attribute.TryGetValue(PmNames.S_NAME, out sArgAname, true, log_Reports); if (!log_Reports.Successful) { goto gt_EndMethod; } string sValue; cur_Cf.Dictionary_Attribute.TryGetValue(PmNames.S_VALUE, out sValue, false, log_Reports); // 「S■fnc」のlogic属性として追加。 // 属性連結 parent_Cf.Dictionary_Attribute.Add(sArgAname, sValue, parent_Cf, true, log_Reports); } else { // 属性にせず、子まま連結。 // 子連結 parent_Cf.List_Child.Add(cur_Cf, log_Reports); } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Parent: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー361!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("<"); t.Append(cur_X.Name); t.Append(">要素の親は、<fnc>でなければなりませんでしたが、別の要素<"); t.Append(err_Parent_SName); t.Append(">でした。"); t.Newline(); t.Newline(); // ヒント t.Append(r.Message_Configuration(parent_Cf)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_Target: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー562!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("<"); s.Append(cur_X.Name); s.Append(">要素のtarget属性が予想外でした。<["); s.Append(err_Parent_SName); s.Append("] target=”["); s.Append(parent_SAmemory); s.Append("]”>"); s.Newline(); s.Newline(); // ヒント s.Append(r.Message_Configuration(parent_Cf)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
/// <summary> /// 大雑把にfunctionを一覧。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { Log_ReportsImpl.BDebugmode_Static = true; Log_Reports log_Reports; //(2)メソッド開始 Log_Method log_Method = new Log_MethodImpl(); // デバッグモード静的設定の後で。 log_Method.BeginMethod(Info_Actorslist.Name_Library, this, "button2_Click", out log_Reports); Exception error_Exception; //コンフィグファイル ConfigxmlImpl configxml = new ConfigxmlImpl(); configxml.Read(log_Reports); //CSV→テーブル Table_Humaninput tableH; if (log_Reports.Successful) { if(!File.Exists(configxml.FilepathExportLualist)) { goto gt_Error_File1; } string csvtext = File.ReadAllText(configxml.FilepathExportLualist); CsvTo_Table_HumaninputImpl trans = new CsvTo_Table_HumaninputImpl(); tableH = trans.Read( csvtext, new Request_ReadsTableImpl(), new Format_Table_HumaninputImpl(), //true, log_Reports ); } else { tableH = null; } //各.luaファイル List<string> listFile = new List<string>(); List<string> listRow = new List<string>(); List<string> listFunction = new List<string>(); if (log_Reports.Successful) { Regex regex2 = new Regex(@"^\s*function\s+(.*)$", RegexOptions.Compiled); tableH.ForEach_Datapart( (Record_Humaninput recordH, ref bool isBreak2, Log_Reports log_Reports2) => { string filepathRelational = recordH.TextAt("FILE"); string filepath = Path.Combine(configxml.FolderpathProject, filepathRelational); //ystem.Console.WriteLine("filepath=[" + filepath + "]"); string luatext = File.ReadAllText(filepath, Encoding.GetEncoding("Shift-JIS")); string[] lines = luatext.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); int row = 1;//行番号 foreach (string line in lines) { Match m2 = regex2.Match(line); if (m2.Success) { listFile.Add(filepathRelational); listRow.Add(row.ToString()); listFunction.Add(line); //System.Console.WriteLine("ファイル=[" + filepathRelational + "] [" + row + "]行 関数line=[" + line + "]"); } else { } row++; } }, log_Reports); } //配列(空回し);buffer Dictionary<string, string> dictionary1 = new Dictionary<string, string>();// 関数名の問題文字列:["シーン","クラスネーム"] if (log_Reports.Successful) { Regex regex4 = new Regex(@"^\s*function\s+(.*?)(_OnClose|_OnVanish)\s*\(.*$", RegexOptions.Compiled); //「_OnClose」ならシーン、 //「_OnVanish」ならクラスネームに確定します。 for (int i = 0; i < listFunction.Count; i++) { string function = listFunction[i]; Match m4 = regex4.Match(function); if (m4.Success) { if ("_OnClose" == m4.Groups[2].Value) { //シーン dictionary1.Add(m4.Groups[1].Value, "シーン"); } else if ("_OnVanish" == m4.Groups[2].Value) { //クラスネーム dictionary1.Add(m4.Groups[1].Value, "クラスネーム"); } else { } } } } //配列→CSV if (log_Reports.Successful) { Regex regex3 = new Regex(@"^\s*function\s+(.*?)(?:_OnStart|_OnStep|_OnClose|_OnVanish|_OnDraw)\s*\(.*$", RegexOptions.Compiled); Regex regex4 = new Regex(@"^\s*function\s+(?:OnLoad|OnVanish)\s*\(.*$", RegexOptions.Compiled); Regex regex5 = new Regex(@"^\s*function\s+(.*?)_init\s*\(.*$", RegexOptions.Compiled); Regex regex6 = new Regex(@"^\s*function\s+(.*?)Thread\s*\(.*$", RegexOptions.Compiled); Regex regex7 = new Regex(@"^\s*function\s+thread_(.*?)\s*\(.*$", RegexOptions.Compiled); CsvLineParserImpl parser = new CsvLineParserImpl(); StringBuilder sb = new StringBuilder(); sb.Append("NO,FILE,ROW,INITIALIZER,SCENE,THREAD,CLASS_NAME,FUNCTION,END");//,EOL sb.Append(Environment.NewLine); sb.Append("int,string,int,string,string,string,string,string,"); sb.Append(Environment.NewLine); sb.Append("-1,ファイルパス,行番号,suica32用ローダースレッド・ハンドラ?,シーン,スレッド?,クラス名,関数シグネチャー,"); sb.Append(Environment.NewLine); int row = 0; for (int i = 0; i < listFunction.Count; i++) { string file = listFile[i]; string numberRow = listRow[i]; string function = listFunction[i]; string initializer = ""; string scene = ""; string thread = ""; string classname = ""; Match m3 = regex3.Match(function); if (m3.Success) { string functionname2 = m3.Groups[1].Value; if (dictionary1.ContainsKey(functionname2)) { switch (dictionary1[functionname2]) { case "シーン": scene = functionname2; break; case "クラスネーム": classname = functionname2; break; default: break; } } goto gt_Csv; } Match m4 = regex4.Match(function); if (m4.Success) { scene = Path.GetFileNameWithoutExtension(file); goto gt_Csv; } Match m5 = regex5.Match(function); if (m5.Success) { initializer = m5.Groups[1].Value; goto gt_Csv; } Match m6 = regex6.Match(function); if (m6.Success) { thread = m6.Groups[1].Value; goto gt_Csv; } Match m7 = regex7.Match(function); if (m7.Success) { thread = m7.Groups[1].Value; goto gt_Csv; } gt_Csv: sb.Append(row); sb.Append(","); sb.Append(file); sb.Append(","); sb.Append(numberRow); sb.Append(","); sb.Append(initializer); sb.Append(","); sb.Append(scene); sb.Append(","); sb.Append(thread); sb.Append(","); sb.Append(classname); sb.Append(","); sb.Append(parser.EscapeCell(function)); sb.Append(","); sb.Append(Environment.NewLine); //ystem.Console.WriteLine("row=[" + row + "] file=[" + file + "] numberRow=[" + numberRow + "] initializer=[" + initializer + "] scene=[" + scene + "] thread=[" + thread + "] classname=[" + classname + "] classname=[" + classname + "] function=[" + parser.EscapeCell(function) + "]"); row++; } sb.Append("EOF,,,,,,,,"); sb.Append(Environment.NewLine); string csvfile = Path.Combine(Application.StartupPath, configxml.FilepathExportFunctionlist); System.Console.WriteLine("csvfile=[" + csvfile + "]"); File.WriteAllText(csvfile, sb.ToString(), Encoding.UTF8); } goto gt_EndMethod; #region 異常系 //──────────────────────────────────────── gt_Error_File1: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー13007!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("ファイルが足りません。"); s.Append(Environment.NewLine); s.Append("readme.txtを読んで、手順を踏んでください。"); s.Append(Environment.NewLine); s.Append(" .lua一覧CSVファイル=["); s.Append(configxml.FilepathExportLualist); s.Append("]"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion gt_EndMethod: log_Method.EndMethod(log_Reports); log_Reports.EndLogging(log_Method); }
//──────────────────────────────────────── public void Pop(Log_Method log_Method) { Log_RecordCallstack err_Log_RecordCallstack; if (0 < this.stack.Count) { Log_RecordCallstack log_RecordCallstack = this.stack.Pop(); if (!log_RecordCallstack.Log_Method.Equals(log_Method)) { // エラー err_Log_RecordCallstack = log_RecordCallstack; goto gt_Error_MissmatchPop; } } else { // エラー goto gt_Error_EmptyPop; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_MissmatchPop: { Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("最後にPushしたものに一致しないものをPopしました。"); s.Newline(); s.Append("今回Popした問題場所 : 今回Popしたもの"); s.Newline(); s.Append("定義SLibraryName [" + log_Method.Name_Library + "] : [" + err_Log_RecordCallstack.Log_Method.Name_Library + "]"); s.Newline(); s.Append("呼出SClassName [" + log_Method.Name_Class + "] : [" + err_Log_RecordCallstack.Log_Method.Name_Class + "]"); s.Newline(); s.Append("BStatic [" + log_Method.IsStatic + "] : [" + err_Log_RecordCallstack.Log_Method.IsStatic + "]"); s.Newline(); s.Append("SMethodName [" + log_Method.Name_Method + "] : [" + err_Log_RecordCallstack.Log_Method.Name_Method + "]"); s.Newline(); s.Append("もしかして?"); s.Newline(); s.Append(" ・EndMethod()が飛ばされた? 関数の途中でreturnやExceptionで抜けた場合や、EndMethodの記述漏れ?"); s.Newline(); //throw new Exception(s.ToString()); } goto gt_EndMethod; gt_Error_EmptyPop: { Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("PushしたものがないのにPopしました。"); s.Newline(); s.Append("今回Popした問題場所"); s.Newline(); s.Append("定義SLibraryName [" + log_Method.Name_Library + "]"); s.Newline(); s.Append("呼出SClassName [" + log_Method.Name_Class + "]"); s.Newline(); s.Append("BStatic [" + log_Method.IsStatic + "]"); s.Newline(); s.Append("SMethodName [" + log_Method.Name_Method + "]"); s.Newline(); throw new Exception(s.ToString()); } //goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: ; }
//──────────────────────────────────────── public string ToCsvText( Table_Humaninput tableH, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Table.Name_Library, this, "ToCsvText",log_Reports); Log_TextIndented result = new Log_TextIndentedImpl(); RecordFielddefinition error_RecordFielddefinition; Exception err_Excep; int error_IndexColumn; Fielddefinition error_Fielddefinition; object error_Item; if (null == tableH) { // エラー goto gt_Error_NullTable; } CsvLineParserImpl csvParser = new CsvLineParserImpl(); // フィールド名をカンマ区切りで出力します。最後にENDを付加します。 // フィールド定義部 if (tableH.RecordFielddefinition.Count < 1) { //エラー。 error_RecordFielddefinition = tableH.RecordFielddefinition; goto gt_Error_FieldZero; } // フィールド定義部:名前 tableH.RecordFielddefinition.ForEach(delegate(Fielddefinition fielddefinition, ref bool isBreak, Log_Reports log_Reports2) { if (this.ExceptedFields.TryExceptedField(fielddefinition.Name_Trimupper)) { // 出力しないフィールドの場合、無視します。 } else { result.Append(csvParser.EscapeCell(fielddefinition.Name_Humaninput)); result.Append(","); } }, log_Reports); result.Append(ToCsv_Table_Humaninput_RowColRegularImpl.S_END); result.Append(Environment.NewLine);//改行 // フィールド定義部:型 tableH.RecordFielddefinition.ForEach(delegate(Fielddefinition fielddefinition, ref bool isBreak, Log_Reports log_Reports2) { if (this.ExceptedFields.TryExceptedField(fielddefinition.Name_Trimupper)) { // 出力しないフィールドの場合、無視します。 } else { switch(fielddefinition.Type_Field) { case EnumTypeFielddefinition.String: { result.Append(FielddefinitionImpl.S_STRING); } break; case EnumTypeFielddefinition.Int: { result.Append(FielddefinitionImpl.S_INT); } break; case EnumTypeFielddefinition.Bool: { result.Append(FielddefinitionImpl.S_BOOL); } break; default: { // TODO エラー対応。 // 未定義の型があった場合、そのまま出力します。 // C#のメッセージになるかと思います。 result.Append(fielddefinition.ToString_Type()); } break; } result.Append(","); } }, log_Reports); result.Append(ToCsv_Table_Humaninput_RowColRegularImpl.S_END); result.Append(Environment.NewLine);//改行 // フィールド定義部:コメント tableH.RecordFielddefinition.ForEach(delegate(Fielddefinition fielddefinition, ref bool isBreak, Log_Reports log_Reports2) { if (this.ExceptedFields.TryExceptedField(fielddefinition.Name_Trimupper)) { // 出力しないフィールドの場合、無視します。 } else { result.Append(csvParser.EscapeCell(fielddefinition.Comment)); result.Append(","); } }, log_Reports); result.Append(ToCsv_Table_Humaninput_RowColRegularImpl.S_END); result.Append(Environment.NewLine);//改行 // 0行目から数えて3行目以降はデータ・テーブル部。 // データ・テーブル部 DataTable dataTable = tableH.DataTable; // 各行について for (int nRowIndex = 0; nRowIndex < dataTable.Rows.Count; nRowIndex++) { DataRow dataRow = dataTable.Rows[nRowIndex]; // // 各フィールドについて // object[] itemArray = dataRow.ItemArray;// ItemArrayは1回の呼び出しが重い。 for (int indexColumn = 0; indexColumn < itemArray.Length; indexColumn++) { // TODO:範囲 リストサイズが0の時がある←プログラムミス? Fielddefinition fielddefinition; try { fielddefinition = tableH.RecordFielddefinition.ValueAt(indexColumn); } catch (Exception e) { // エラー。 err_Excep = e; error_RecordFielddefinition = tableH.RecordFielddefinition; error_IndexColumn = indexColumn; goto gt_Error_OutOfIndex; } if (this.ExceptedFields.TryExceptedField(fielddefinition.Name_Trimupper)) { // 出力しないフィールドの場合、無視します。 } else { string value_Cell; object item = itemArray[indexColumn]; if (item is Value_Humaninput) { value_Cell = ((Value_Humaninput)item).Text; } else if (item is string) { //フィールド定義部など。 value_Cell = (string)item; } else if (item is DBNull) { //空欄。 value_Cell = ""; } else { // エラー error_Item = item; error_Fielddefinition = fielddefinition; goto gt_Error_UndefinedFieldType; } result.Append(csvParser.EscapeCell(value_Cell)); result.Append(this.charSeparator); } } result.Append(ToCsv_Table_Humaninput_RowColRegularImpl.S_END); result.Append(Environment.NewLine);//改行 } result.Append(ToCsv_Table_Humaninput_RowColRegularImpl.S_EOF); // 最後に一応、改行を付けておきます。 result.Append(Environment.NewLine);//改行 goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_FieldZero: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー854!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("(プログラム内部エラー)テーブルの列定義が0件です。 error_RecordFielddefinition.Count["); s.Append(error_RecordFielddefinition.Count); s.Append("] テーブル名=["); s.Append(tableH.Name); s.Append("]"); s.Newline(); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_OutOfIndex: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー853!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("(プログラム内部エラー)err_NColIndex=["); s.Append(error_IndexColumn); s.Append("] error_RecordFielddefinition.Count["); s.Append(error_RecordFielddefinition.Count); s.Append("]"); s.Newline(); // ヒント s.Append(r.Message_SException(err_Excep)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_UndefinedFieldType: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー855!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("(プログラム内部エラー)CSVを出力しようとしたとき、未定義のフィールド型=["); s.Append(error_Fielddefinition.ToString_Type()); s.Append("]がありました。"); s.Newline(); s.Append("型名=["); s.Append(error_Item.GetType().Name); s.Append("]"); s.Newline(); s.Append("型は["); s.Append(typeof(String_HumaninputImpl)); s.Append("],["); s.Append(typeof(Int_HumaninputImpl)); s.Append("],["); s.Append(typeof(Bool_HumaninputImpl)); s.Append("]が使えます。"); s.Newline(); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NullTable: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー852!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("(プログラム内部エラー)tableがヌルでした。"); s.Newline(); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return result.ToString(); }
//──────────────────────────────────────── /// <summary> /// 絶対パスを取得します。 /// /// 未設定の場合は、空文字列を返します。 /// /// ・ファイルパスとして利用できない文字や、予約語が含まれていると例外を投げます。 /// ・絶対パスの文字列の長さが、ファイルシステムで使える制限を越えると例外を投げます。 /// /// 設定されたパスが相対パスだった場合に、ベース・パスが設定されていなければ、 /// 起動「.exe」のあったパスが頭に付く。 /// </summary> /// <returns></returns> public override string Lv4Execute_OnImplement( EnumHitcount request, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Execute4_OnExpressionString", log_Reports); // // // 絶対パスにして返します。 string sFpath; if (this.Conf is Conf_Filepath) { Conf_Filepath cf_Fpath = (Conf_Filepath)this.Conf; bool bCheckPathTooLong = false; if (log_Reports.Successful) { sFpath = Util_Filepath.ToAbsolute( this.Directory_Base, cf_Fpath.GetHumaninput(), //this.SHumanInput相当 ref bCheckPathTooLong, //ファイル名の長さチェックは、もう済んでいるものとして、行いません。 false, //ファイル名の長さが上限超過ならエラー log_Reports, //out sErrorMsg, this.Conf ); } else { sFpath = ""; } } else { // エラー。 sFpath = ""; if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー901!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("#GetSAbsoluteFilePath:型が違います。[" + this.Conf.GetType().Name + "]"); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; // // gt_EndMethod: log_Method.EndMethod(log_Reports); return(sFpath); }
//──────────────────────────────────────── /// <summary> /// 変数を登録します。 /// /// 既に使われている変数の名前で登録しようとした場合、エラーです。 /// /// 文字列、ファイルパスの区別はありません。 /// </summary> /// <param select="oVariableName"></param> /// <param select="initialString"></param> /// <param select="log_Reports"></param> public void PutString(string sName_Variable, string sInitial, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "PutString",log_Reports); if (NamesVar.Test_Filepath(sName_Variable)) { //エラー。この関数で、ファイルパスを登録してはいけません。 goto gt_Error_Filepath; } if (this.dictionaryExpression_Item.ContainsKey(sName_Variable)) { goto gt_Error_ContainsKey; } Expression_Leaf_StringImpl ec_Str = new Expression_Leaf_StringImpl(null, new Configurationtree_NodeImpl("<変数PutStringから>", null)); ec_Str.SetString(sInitial, log_Reports); try { this.dictionaryExpression_Item.Add(sName_Variable, ec_Str); } catch (ArgumentException e) { // キーの重複。 throw e; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Filepath: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー35!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("プログラムエラー! 文字列変数登録関数を使って、ファイルパス変数を追加しようとしました。"); s.Newline(); s.Append("変数[" + sName_Variable + "]。"); s.Newline(); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_ContainsKey: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("Er:401;", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("同じ名前の変数を2度登録しないでください。"); s.Newline(); s.Append("変数[" + sName_Variable + "]は既に登録されていますが、さらに登録されました。"); s.Newline(); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// 「ディレクトリー」と「入力値」の2つを入力すると、「絶対パス」を返します。 /// /// ────────── /// /// 未設定の場合は、空文字列を返します。 /// ※bug:フォルダーパスの場合も空文字列になる?? /// /// ・ファイルパスとして利用できない文字や、予約語が含まれていると例外を投げます。 /// ・絶対パスの文字列の長さが、ファイルシステムで使える制限を越えると例外を投げます。 /// /// もし、設定されたパスが相対パスだった場合に、ベース・パスが設定されていなければ、 /// 起動「.exe」のあったパスが頭に付く。 /// </summary> /// <param name="baseDirectory"></param> /// <param name="humanInputText"></param> /// <param name="flagCheckPathTooLong">絶対パスの文字列の長さが、ファイルシステムで使える上限を超えていた場合に真、そうでない場合 偽にセットされます。</param> /// <param name="okPathTooLong">絶対パスの文字列の長さが、ファイルシステムで使える上限を超えていた場合に、「正常扱いにするなら」真、「エラー扱いにするなら」偽。</param> /// <param name="cur_Conf">デバッグ用情報。人間オペレーターが修正するべき箇所などの情報。</param> /// <returns></returns> public static string ToFilepathabsolute( string directory_Base, string humaninput, ref bool ref_IsTooLong_Path, bool isSafe_TooLong_Path, Log_Reports log_Reports, Configuration_Node cur_Conf ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, "Utility_Configurationtree_Filepath", "ToFilepathabsolute②", log_Reports); // // // // 修正履歴(2009-12-02) // // ・カレント・ディレクトリの移動を使ったコードを書いてはいけない。 // MS-DOSの名残り? // // ・起動「.exe」のディレクトリは Application.StartupPath で取得できる。 // // ・備考: // System.IO.Directory.GetCurrentDirectory()は、 // 「プロセスが開始されたディレクトリ」を返すので、 // openFileDialogで開いたディレクトリを返すこともある。 // // System.IO.Path.GetFullPath(path)も同じ。 Exception err_Excp; string result_Filepath;//ファイルパス // フラグのクリアー。 ref_IsTooLong_Path = false; // // 人間がCSVファイルに記述しているファイル・パス。 // // 「絶対パス」「相対パス」のどちらでも指定されます。 // string filepath_Source = humaninput.Trim(); if ("" == filepath_Source) { // 未設定の場合。 result_Filepath = "";//ファイルパスとしては使えない文字列。 goto gt_EndMethod; } // 「絶対パス」か、「相対パス」かを判断します。 bool isRooted_Path = Utility_Configurationtree_Filepath.IsRooted_Path( filepath_Source, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 result_Filepath = "";//ファイルパスとしては使えない文字列。 goto gt_EndMethod; } if (!isRooted_Path) { // 相対パスの場合 // 「相対パス」に「ベース・ディレクトリー文字列」を連結して、「絶対パス」に変換します。 if ("" != directory_Base) { // 相対パスの相対元となるディレクトリーが設定されていれば。 if (!directory_Base.EndsWith(Path.DirectorySeparatorChar.ToString())) { filepath_Source = directory_Base + Path.DirectorySeparatorChar + filepath_Source; } else { filepath_Source = directory_Base + filepath_Source; } } else { // 起動「.exe」のあったパスを、相対の元となるディレクトリーとします。 if (!directory_Base.EndsWith(Path.DirectorySeparatorChar.ToString())) { filepath_Source = Application.StartupPath + Path.DirectorySeparatorChar + filepath_Source; } else { filepath_Source = Application.StartupPath + filepath_Source; } } } // ここで、パスは 絶対パスに変換されています。 try { // カレントディレクトリは使わない。 // 絶対パスの場合、GetFullPathを通す必要はないが、 // ファイルパスに使えない文字列を判定するために、 // 例外を返すメソッドを使っています。 result_Filepath = System.IO.Path.GetFullPath(filepath_Source); } catch (ArgumentException e) { // 指定のファイルパスに「*」など、ファイルパスとして使えない文字列が含まれていた場合など。 result_Filepath = "";//ファイルパスとしては使えない文字列。 err_Excp = e; goto gt_Error_ArgumentException; } catch (PathTooLongException e) { // ディレクトリーの文字数が、制限数を超えた場合などのエラー。 result_Filepath = "";//ファイルパスとしては使えない文字列。 if (isSafe_TooLong_Path) { // 正常処理扱いとします。 } else { // 異常扱いとします。 err_Excp = e; goto gt_Error_PathTooLongException; } ref_IsTooLong_Path = true; } catch (NotSupportedException e) { //パスのフォーマットが間違っているなどのエラー。 result_Filepath = "";//ファイルパスとしては使えない文字列。 err_Excp = e; goto gt_Error_NotSupportedException; } catch (Exception e) { // それ以外のエラー。 result_Filepath = "";//ファイルパスとしては使えない文字列。 err_Excp = e; goto gt_Error_Exception; } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_ArgumentException: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー107!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("使えないファイルパスです。["); s.Append(filepath_Source); s.Append("] :"); s.Append(err_Excp.Message); cur_Conf.ToText_Locationbreadcrumbs(s); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_PathTooLongException: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー108!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("エラー 入力パス=[" + filepath_Source + "]:(" + err_Excp.GetType().Name + ") "); s.Append(err_Excp.Message); cur_Conf.ToText_Locationbreadcrumbs(s); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NotSupportedException: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー109!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("ファイルパスが間違っているかもしれません。"); s.Newline(); s.AppendI(1, "入力パス=[" + filepath_Source + "]"); s.Newline(); // ヒント s.Append(r.Message_SException(err_Excp)); cur_Conf.ToText_Locationbreadcrumbs(s); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_Exception: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー109!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append(Environment.NewLine); s.Append("エラー 入力パス=[" + filepath_Source + "]"); s.Newline(); // ヒント s.Append(r.Message_SException(err_Excp)); cur_Conf.ToText_Locationbreadcrumbs(s); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return(result_Filepath); }
//──────────────────────────────────────── /// <summary> /// 実行します。 /// </summary> /// <param name="filePathList">保存するファイルの相対パスの一覧。「起動アプリケーション・ファイル(.exe)からの相対パス」として設定してあること。</param> /// <param name="oDateBackupBaseDirectory"></param> /// <param name="d_Thread"></param> public void Perform( Log_Reports log_Reports ) { Log_Method pg_Method = new Log_MethodImpl(); pg_Method.BeginMethod(Info_Operating.Name_Library, this, "Perform",log_Reports); // // // // Exception err_Excp; string err_SFpatha_Source; string err_SFpatha_Dst; if (null == this.Expression_Filepath_Backuphome) { // エラー goto gt_Error_BkFolder;//todo:バックアップを無視する。 } // // バックアップ・ディレクトリーの絶対パス // // 例:「editor-backup」 // string sFpatha_BkHome = this.Expression_Filepath_Backuphome.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } //.WriteLine(this.GetType().Name + "#Perform: バックアップディレクトリーの絶対パス=[" + backupAbsFilePath + "]" ); // 日付フォルダー名(FOlder Name) string sDateFon = DatebackupImpl.CreateDateFolderName(this.Name_Sub); Configurationtree_Node s_ParentNode = new Configurationtree_NodeImpl("!ハードコーディング_DataBackup#Perform", null); // バックアップ・フォルダー下の日付ファイル名 // 日付フォルダーパス(「…略…\20091201」など) string sFopatha_date; { Expression_Node_Filepath ec_Dir; { Configurationtree_NodeFilepath cf_dir = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L03_3", s_ParentNode); cf_dir.InitPath(sFpatha_BkHome, sDateFon, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } ec_Dir = new Expression_Node_FilepathImpl(cf_dir); } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } sFopatha_date = ec_Dir.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } } // temp日付フォルダーパス(「…略…\temp20091201」など) string sFopatha_dateTemp; { Expression_Node_Filepath ec_Dir; { Configurationtree_NodeFilepath s_dir = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L03_4", s_ParentNode); s_dir.InitPath(sFpatha_BkHome, "temp" + sDateFon, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } ec_Dir = new Expression_Node_FilepathImpl(s_dir); } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } sFopatha_dateTemp = ec_Dir.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } } //.WriteLine(this.GetType().Name + "#Perform: absDateDirTemp=[" + absDateDirTemp + "]"); if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } // 今日の日付のフォルダーの有無を確認します。 if (Directory.Exists(sFopatha_date)) { // ある場合 // バックアップは取りません。 // 注意書きを出力してみる。 //.WriteLine(this.GetType().Name + "#Perform: バックアップを取りません。バックアップ・フォルダーに、既に今日の日付フォルダーがあるので。[" + absDateDir + "]"); // スキップ goto gt_EndMethod; } // // まず、今日の日付のテンポラリーファイル(「temp20091201」など)が存在すれば、削除します。 // if (Directory.Exists(sFopatha_dateTemp)) { // ある場合 // 該当する「tempXXXXXXXX」フォルダーを削除します。 // フォルダーの中身も破棄します。 Directory.Delete(sFopatha_dateTemp, true); } // // 今日の日付のテンポラリー・ディレクトリーを作成します。 // // Directory.CreateDirectory(sFopatha_dateTemp); // 作っておかないと、自作のクラスの中で「存在しないファイルパス・エラー」という事前チェックが誤発動してしまいます。 // バックアップを取ります。 foreach (Expression_Node_Filepath ec_Fpath_WrittenPlace in list_Expression_Filepath_Request) { //.WriteLine(this.GetType().Name + "#Perform: バックアップを取りたいファイルのパス sourceFilePath.HumanInputText=[" + oWrittenPlaceFilePath.HumanInputText + "]"); // 保存先 Expression_Node_Filepath ec_Fpath_Dst; { Configurationtree_NodeFilepath cf_fpath_Destination = new Configurationtree_NodeFilepathImpl("ファイルパス出典未指定L03_5", s_ParentNode); cf_fpath_Destination.InitPath( sFopatha_dateTemp, ec_Fpath_WrittenPlace.Humaninput, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } ec_Fpath_Dst = new Expression_Node_FilepathImpl(cf_fpath_Destination); } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } string sFpatha_Source = ec_Fpath_WrittenPlace.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } // 人間オペレーターが記述しているファイルパス。 // 「相対パス」か「絶対パス」のどちらか。 string sFpath_HumanInput = ec_Fpath_Dst.Humaninput; // // 絶対パスで指定されたファイルを、バックアップに保存する方法 // // 例: 例えば、「C:\」を「C@\」に置換し、日付フォルダーの下に保存します。 // // 注意:「C:」より長い文字列と置換すると、文字列の長さ制限に引っかかることがあります。 // // 「絶対パス」か、「相対パス」かを判断します。 bool bPathRooted = Utility_Configurationtree_Filepath.IsRooted_Path(sFpath_HumanInput, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } // 絶対パスへの対応。 if (bPathRooted) { // 絶対パスであれば、「C:\」といった文字列が先頭に来ることが予想されます。 // 文字「:」が 2文字目 だけに存在することを想定して、 // 「:」を「@」に置換します。 // // 「絶対パスのようなもの」を、バックアップ日付フォルダーの下に作る想定です。 // ファイル名が長くなりすぎるので、この後、ファイル名を縮める処理になることが多い。 // //.WriteLine(this.GetType().Name + "#Perform: バックアップを取りたいファイルのパス名 humanInputFilePathStr=[" + humanInputFilePathStr + "]"); string sNewRelHPath3 = sFpath_HumanInput.Replace(":", "@"); //.WriteLine(this.GetType().Name + "#Perform: コロン記号を置換した後のファイルパス名 newRelHPathStr3=[" + newRelHPathStr3 + "]"); // 絶対パスでバックアップ対象ファイルが指定されていた場合 // // 「C:\banana」は、「C@\banana」に置換 // // 設定のし直し。 // 出力ファイルの絶対パスが長すぎると真。 bool isTooLong_Path = Utility_Configurationtree_Filepath.IsTooLong_Path( sNewRelHPath3, log_Reports, s_ParentNode ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } if (isTooLong_Path) { // 強引に短縮。 sNewRelHPath3 = DatebackupImpl.ReplaceToJammingFilePath( sNewRelHPath3, this.NSubstitutionFileNumber, this.GetType().Name + "#Perform:" ); this.NSubstitutionFileNumber++; //.WriteLine(this.GetType().Name + "#Perform: 短くした保存先ファイルパス名 newRelHPathStr3=[" + newRelHPathStr3 + "]"); // それでも、出力ファイルの絶対パスが長すぎると、後ろのプログラムで例外を投げます。 } // (2010-02-24 ※修正) // 保存先ファイルパスをセット。 ec_Fpath_Dst.SetHumaninput( sNewRelHPath3, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } } // 絶対パスへの対応終了 if (!log_Reports.Successful)// 異常時はスキップ { goto gt_EndMethod; } // もう一回、絶対パスの取得し直し string sFpatha_Dst = ec_Fpath_Dst.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } // ファイルのコピーで作成します。 //.WriteLine(this.GetType().Name + "#Perform: [" + sourceAbsFilePath + "]を"); //.WriteLine(this.GetType().Name + "#Perform: [" + absDstPathStr + "]にコピーします。"); try { string sDestinationParent = Path.GetDirectoryName(sFpatha_Dst); if (!Directory.Exists(sDestinationParent)) { // 指定のファイルの、ディレクトリーが存在しなかった場合。 // ディレクトリーを作成します。 Directory.CreateDirectory(sDestinationParent); } } catch (Exception e) { // エラー err_Excp = e; goto gt_Error_MissIo; } try { // todo: 同名のファイルがあれば、「aaa(1).txt」「aaa(2).txt」といった風に番号を付けていきたい。 // ファイルのコピー System.IO.File.Copy(sFpatha_Source, sFpatha_Dst, false); } catch (Exception e) { // エラー err_Excp = e; err_SFpatha_Source = sFpatha_Source; err_SFpatha_Dst = sFpatha_Dst; goto gt_Error_MissCopy; } } if (!log_Reports.Successful) { // 異常時はスキップ goto gt_EndMethod; } try { // テンポラリーフォルダーを、正規の名前にリネームします。 Directory.Move(sFopatha_dateTemp, sFopatha_date); } catch (Exception e) { // エラー err_Excp = e; goto gt_Error_MissMove; } // 「バックアップ日付フォルダー」が11個以上あるとき、 // 日付が新しいものを(指定)個残して 他の日付フォルダーを破棄します。 this.DeleteOldBackup( sFpatha_BkHome, sName_Sub, log_Reports ); // 異常時は、「temp20091202」といった、処理を中断したゴミ・ファイルが残ることがあります。 goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_BkFolder: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle( "▲エラー508!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("バックアップ・フォルダーが指定されていません。"); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_MissIo: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle( "▲エラー65507!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("エラー:"); // // ヒント s.Append(r.Message_SException(err_Excp)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_MissCopy: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle( "▲エラー65506!", pg_Method); StringBuilder t = new StringBuilder(); t.Append("ファイルのコピーに失敗。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("["); t.Append(err_SFpatha_Source); t.Append("]"); t.Append("を"); t.Append(Environment.NewLine); t.Append("["); t.Append(err_SFpatha_Dst); t.Append("]"); t.Append("へコピーしようとしたとき。"); t.Append(Environment.NewLine); // // ヒント t.Append(r.Message_SException(err_Excp)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_MissMove: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle( "▲エラー65508!", pg_Method); Log_TextIndentedImpl t = new Log_TextIndentedImpl(); t.Append("ファイルのリネーム(Move)に失敗。"); // // ヒント t.Append(r.Message_SException(err_Excp)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: pg_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// ノード名を指定して、直近の子ノードを取得したい。 /// </summary> /// <param name="sName"></param> /// <param name="bRequired">偽を指定した時は、要素数0のリストを返す。</param> /// <param name="log_Reports"></param> /// <returns></returns> public List <Configurationtree_Node> GetChildrenByNodename(string sName, bool bRequired, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "GetChildrenByNodename", log_Reports); // // List <Configurationtree_Node> result = new List <Configurationtree_Node>(); if (log_Reports.Successful) { this.list_Child.ForEach(delegate(Configurationtree_Node child_Conf, ref bool bBreak) { if (sName == child_Conf.Name) { // ノード名が一致 result.Add(child_Conf); } else { // ノード名が一致しないとき } }); } else { // 既にエラーが出ているとき goto gt_EndMethod; } if (result.Count < 1 && bRequired) { if (bRequired) { goto gt_Error_EmptyHitChild; } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_EmptyHitChild: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー502!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("該当した子要素がありませんでした。"); s.Newline(); s.Append("指定ノード名["); s.Append(sName); s.Append("]"); s.Newline(); // ヒント s.Append(r.Message_Configuration(this)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return(result); }
//──────────────────────────────────────── public void ToMemory_DataTargetFcell( string sValue_Output, Expression_Node_String ec_SfCell,//Sf:cell; MemoryApplication moApplication, Log_Reports log_Reports ) { Log_Method pg_Method = new Log_MethodImpl(0); pg_Method.BeginMethod(Info_Controls.Name_Library, this, "ToM_DataTargetFcell",log_Reports); // // string sName_Fnc; ec_SfCell.TrySelectAttribute(out sName_Fnc, PmNames.S_NAME.Name_Pm, EnumHitcount.One, log_Reports); if (NamesFnc.S_CELL != sName_Fnc) { // エラー。 goto gt_Error_NotSfcell; } // ■f-cellの子要素 Expression_Node_String ec_KeyExpected1 = null; int nKeyCount = 0; { // //「E■f-cell」の子要素のリスト。 ec_SfCell.List_Expression_Child.ForEach(delegate(Expression_Node_String e_Item, ref bool bRemove2, ref bool bBreak2) { // キー値 が1つ入っています。 ec_KeyExpected1 = e_Item; nKeyCount++; }); } // それでも @keyValueを取得できなければ。 if (null == ec_KeyExpected1) { //「E■rec-cond」を調べる。 Expression_Node_String ec_Where; bool bHit2 = ec_SfCell.TrySelectAttribute(out ec_Where, PmNames.S_WHERE.Name_Pm, EnumHitcount.One_Or_Zero, log_Reports); if (bHit2) { ec_Where.List_Expression_Child.ForEach(delegate(Expression_Node_String e_Item, ref bool bRemove2, ref bool bBreak2) { if (NamesNode.S_FNC == e_Item.Cur_Configuration.Name) { //ystem.Console.WriteLine(Info_Forms.LibraryName + ":" + this.GetType().Name + "#ToM: 「E■f-cell」の「E■@where」属性の下の「E■fnc」を解析。その子要素がvalue相当であるはず。"); ec_KeyExpected1 = e_Item; } else { } }); } } if (1 < nKeyCount) { ec_KeyExpected1 = null; if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー311!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("「E■f-cell」系要素の子要素が、「E■rec-cond」を除いて[" + nKeyCount + "]個ありました。"); s.Newline(); s.Append("この子要素は キー値になるもので、1個でなければいけません。"); s.Newline(); // 一覧 s.Append("──────────子要素名一覧"); s.Newline(); ec_SfCell.List_Expression_Child.ForEach(delegate(Expression_Node_String e_Str1, ref bool bRemove2, ref bool bBreak2) { if ("" == e_Str1.Cur_Configuration.Name) { s.Append("E■(要素名無し)"); s.Newline(); } else { s.Append("E■"); s.Append(e_Str1.Cur_Configuration.Name); s.Newline(); } }); s.Append("──────────"); s.Newline(); // ヒント s.Append(r.Message_Configuration(ec_SfCell.Cur_Configuration)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } else if (null == ec_KeyExpected1) { if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー312!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); //s.Append("「E■f-cell」系要素の子要素に、「E■f-text」や「E■f-cell」が無いのか、有っても値がありませんでした。"); s.Append("「E■f-cell」の「keyValue」相当の値が指定されていませんでした。"); s.Newline(); // 一覧 s.Append("──────────子要素名一覧"); s.Newline(); ec_SfCell.List_Expression_Child.ForEach(delegate(Expression_Node_String e_Str1, ref bool bRemove2, ref bool bBreak2) { if ("" == e_Str1.Cur_Configuration.Name) { s.Append("E■(要素名無し)"); s.Newline(); } else { s.Append("E■"); s.Append(e_Str1.Cur_Configuration.Name); s.Newline(); } }); s.Append("──────────"); s.Newline(); // ヒント s.Append(r.Message_Configuration(ec_SfCell.Cur_Configuration)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } if (log_Reports.Successful) { // // <f-cell>1つにつき。 // ExpressionToMemory_FcellImpl to = new ExpressionToMemory_FcellImpl(); to.Translate( sValue_Output, ec_KeyExpected1, ec_SfCell,// <f-cell>相当と想定。 moApplication, log_Reports ); } goto gt_EndMethod; // // gt_Error_NotSfcell: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー909!", pg_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("Sf:cell;でないExpression_Node_Stringが指定されました。"); s.Append(Environment.NewLine); s.Append(Environment.NewLine); // ヒント s.Append(r.Message_Configuration(ec_SfCell.Cur_Configuration)); if (null != ec_SfCell) { ec_SfCell.ToText_Snapshot(s); } r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; // // gt_EndMethod: pg_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// 変数名を指定することで、ファイルパスを返します。 /// </summary> /// <param select="oVariableName"></param> /// <param select="bRequired"></param> /// <param select="log_Reports"></param> /// <returns></returns> public Expression_Node_Filepath GetExpressionfilepathByVariablename( Expression_Node_String ec_Name_Variable, bool bRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "GetExpressionfilepathByVariablename",log_Reports); // // // // Expression_Node_Filepath ec_Fpath_Result; string sName_Var = ec_Name_Variable.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports); if (!this.dictionaryExpression_Item.ContainsKey(sName_Var)) { ec_Fpath_Result = null; if (bRequired) { // 未該当の場合、エラーにします。 goto gt_Error_NotFoundVariable; } } else { Expression_Node_String ec_Str = this.dictionaryExpression_Item[sName_Var]; if (ec_Str is Expression_Node_Filepath) { ec_Fpath_Result = (Expression_Node_Filepath)ec_Str; //if (ec_Fpath_Result.SDirectory_Base == "" && null != this.ec_FpathBaseOrNull) //{ // string sFopath = this.ec_FpathBaseOrNull.Execute4_OnExpressionString( // EnumHitcount.Unconstraint, log_Reports); // if (log_Reports.Successful) // { // ec_Fpath_Result.SetDirectory_Base(sFopath, log_Reports); // } //} } else { ec_Fpath_Result = null; goto gt_Error_AnotherClass; } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundVariable: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー376!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("変数["); s.Append(sName_Var); s.Append("]は存在しませんでした。"); s.Append(Environment.NewLine); s.Append(Environment.NewLine); s.Append("ヒント:登録されている変数の個数=["); s.Append(this.dictionaryExpression_Item.Count); s.Append("]"); s.Append(Environment.NewLine); s.Append("──────────ここから"); s.Append(Environment.NewLine); foreach (KeyValuePair<string, Expression_Node_String> kvp in this.dictionaryExpression_Item) { s.Append("key=[" + kvp.Key + "] value=[" + kvp.Value.Execute4_OnExpressionString(EnumHitcount.Unconstraint,log_Reports) + "]"); s.Append(Environment.NewLine); } s.Append("──────────ここまで"); s.Append(Environment.NewLine); // ヒント s.Append(r.Message_Configuration(ec_Name_Variable.Cur_Configuration)); //s.Append(r.Message_Configuration(ec_Name_Variable.Cur_Configurationtree.Parent)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_AnotherClass: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー909", log_Method); r.Message = "変数[" + sName_Var + "]はファイルパス型を期待しましたが、ファイルパス型ではありませんでした。"; log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return ec_Fpath_Result; }
//──────────────────────────────────────── /// <summary> /// パーサーのハブ。 /// /// </summary> /// <param name="request_ReadsTable">テーブルに付けたい名前や、ファイルパスの要求。</param> /// <param name="xenonTableFormat_puts">テーブルの行列が逆になっているなどの、設定。</param> /// <param name="isRequired">テーブルが無かった場合、エラーとするなら真。</param> /// <param name="out_sErrorMsg"></param> /// <returns></returns> public Table_Humaninput Read( Request_ReadsTable request_ReadsTable, Format_Table_Humaninput xenonTableFormat_puts, bool isRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, this, "Read",log_Reports); Table_Humaninput xenonTable_Result; string filepathabsolute_Csv = request_ReadsTable.Expression_Filepath.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports); if (!log_Reports.Successful) { // 既エラー。 xenonTable_Result = null; goto gt_EndMethod; } string string_Csv; // CSVテキスト Exception error_Excp; if (CsvTo_Table_HumaninputImpl.S_WRITE_ONLY!=request_ReadsTable.Use) { // 書き出し専用でなければ。 // ファイル読取を実行します。 try { if (!System.IO.File.Exists(filepathabsolute_Csv)) { // ファイルが存在しない場合。 xenonTable_Result = null; goto gt_Error_NotExistsFile; } // TODO:IOException 別スレッドで開いているときなど。 string_Csv = System.IO.File.ReadAllText(filepathabsolute_Csv, Global.ENCODING_CSV); //log_Method.WriteDebug_ToConsole(string_Csv); } catch (System.IO.IOException e) { // エラー処理。 xenonTable_Result = null; string_Csv = ""; error_Excp = e; goto gt_Error_FileOpen; } catch (Exception e) { // エラー処理。 xenonTable_Result = null; string_Csv = ""; error_Excp = e; goto gt_Error_Exception; } } else { string_Csv = ""; } xenonTable_Result = this.Read( string_Csv, request_ReadsTable, xenonTableFormat_puts, log_Reports ); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } // NOフィールドの値を 0からの連番に振りなおします。 xenonTable_Result.RenumberingNoField(); if (isRequired && null == xenonTable_Result) { goto gt_Error_NullTable; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_FileOpen: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("Er:201;", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("ファイルの読取りに失敗しました。"); s.Newline(); s.Newline(); s.Append(" ファイル=["); s.Append(filepathabsolute_Csv); s.Append("]"); s.Newline(); s.Newline(); s.Append("もしかして?"); s.Newline(); s.Append(" ・ファイルの有無、ファイル名、ファイル パスを確認してください。"); s.Newline(); s.Append(" ・別アプリケーションで ファイルを開いていれば、閉じてください。"); s.Newline(); s.Newline(); // // ヒント request_ReadsTable.Expression_Filepath.Cur_Configuration.ToText_Locationbreadcrumbs(s); s.Append(error_Excp.Message); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NotExistsFile: if(log_Reports.CanCreateReport) { if ("" == request_ReadsTable.Expression_Filepath.Directory_Base) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("Er:202;", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("指定されたファイルはありませんでした。CSVファイルを読み込もうとしたとき。"); s.Newline(); s.Newline(); s.AppendI(1, "指定されたファイルパス=["); s.Append(filepathabsolute_Csv); s.Append("]"); s.Newline(); { s.AppendI(1, "ベース・ディレクトリは指定されていません。"); s.Newline(); s.AppendI(2, "もし相対パスが指定されていた場合、実行した.exeファイルからの相対パスとします。"); s.Newline(); s.Newline(); } s.Append(" ヒント:ファイルの有無、ファイル名、ファイル パスを確認してください。"); s.Newline(); // ヒント s.Append(r.Message_Configuration( request_ReadsTable.Expression_Filepath.Cur_Configuration)); r.Message = s.ToString(); } else { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー235!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("指定されたファイルはありませんでした。CSVファイルを読み込もうとしたとき。"); s.Newline(); s.Newline(); s.AppendI(1, "指定されたファイルパス=["); s.Append(filepathabsolute_Csv); s.Append("]"); s.Newline(); { s.AppendI(1, "指定されたベース・ディレクトリ=["); s.Append(request_ReadsTable.Expression_Filepath.Directory_Base); s.Append("]"); s.Newline(); s.Newline(); } s.Append(" ヒント:ファイルの有無、ファイル名、ファイル パスを確認してください。"); s.Newline(); // ヒント s.Append(r.Message_Configuration( request_ReadsTable.Expression_Filepath.Cur_Configuration)); r.Message = s.ToString(); } log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_Exception: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー104!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("▲エラー4030!(" + Info_Table.Name_Library + ")"); s.Newline(); s.Append("CSV読み取り中にエラーが発生しました。"); s.Append(Environment.NewLine); s.Append(Environment.NewLine); s.Append("指定CSVファイル=["); s.Append(filepathabsolute_Csv); s.Append("]"); s.Append(Environment.NewLine); s.Append(Environment.NewLine); // // ヒント request_ReadsTable.Expression_Filepath.Cur_Configuration.ToText_Locationbreadcrumbs(s); s.Append("エラーの種類:"); s.Append(error_Excp.GetType().Name); s.Append(Environment.NewLine); s.Append(Environment.NewLine); s.Append("エラーメッセージ:"); s.Append(error_Excp.Message); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NullTable: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー105!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("▲エラー131!"); s.Newline(); s.Append("["); s.Append(request_ReadsTable.Name_PutToTable); s.Append("]テーブルがありませんでした。"); s.Append(Environment.NewLine); s.Append(Environment.NewLine); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return xenonTable_Result; }
//──────────────────────────────────────── /// <summary> /// 「変数設定ファイル」のテーブルを読み取り、変数を登録します。 /// </summary> /// <param oVariableName="varOTable"></param> /// <param oVariableName="log_Reports"></param> public void Load( Table_Humaninput o_Table_Var, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(1, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "Load",log_Reports); // if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole("「変数登録ファイル」を Load します。"); } // // // // if (null == o_Table_Var) { goto gt_Error_NullTable; } if (null != this.parent_Variablesconfig_Configurationtree) { goto gt_Error_DoubleLoad; } string err_SFolder; string err_SName; if (log_Reports.Successful) { this.parent_Variablesconfig_Configurationtree = new Configurationtree_NodeImpl(NamesNode.S_VARIABLE_CONFIG, o_Table_Var.Expression_Filepath_ConfigStack.Cur_Configuration); if (!log_Reports.Successful) { // 既エラー。 goto gt_EndMethod; } foreach (DataRow dataRow in o_Table_Var.DataTable.Rows) { string sStringValue;// = ""; // ソース情報として使うだけ。 Configurationtree_Node cf_VarRecord1 = new Configurationtree_NodeImpl(NamesNode.S_VARIABLE_RECORD, parent_Variablesconfig_Configurationtree); // 注意: dataRow[]の連想配列は大文字・小文字を区別しないのが欠点。 //NAME列 { string sFldName = NamesFld.S_NAME;//フィールド名。 if (o_Table_Var.ContainsField(sFldName,true,log_Reports)) { if (String_HumaninputImpl.TryParse( dataRow[sFldName], out sStringValue, o_Table_Var.Name, sFldName, log_Method, log_Reports)) { } else { sStringValue = ""; } if (!log_Reports.Successful) { // エラー goto gt_EndMethod; } cf_VarRecord1.Dictionary_Attribute.Set(PmNames.S_NAME.Name_Pm, sStringValue, log_Reports); } } // FOLDER列 (オプション) { string sFldName = NamesFld.S_FOLDER; if (o_Table_Var.ContainsField(sFldName, false, log_Reports)) { if (String_HumaninputImpl.TryParse( dataRow[sFldName], out sStringValue, o_Table_Var.Name, sFldName, log_Method, log_Reports)) { } else { sStringValue = ""; } if (!log_Reports.Successful) { // エラー goto gt_EndMethod; } //if (log_Method.CanDebug(1)) //{ // log_Method.WriteDebug_ToConsole("「変数登録ファイル」FOLDER列=[" + sStringValue + "]"); //} cf_VarRecord1.Dictionary_Attribute.Set(PmNames.S_FOLDER.Name_Pm, sStringValue, log_Reports); } else { //なければ無視。 } } // VALUE列 { string sFldName = NamesFld.S_VALUE;//フィールド名。 if (o_Table_Var.ContainsField(sFldName, true, log_Reports)) { if (String_HumaninputImpl.TryParse( dataRow[sFldName], out sStringValue, o_Table_Var.Name, sFldName, log_Method, log_Reports)) { } else { sStringValue = ""; } if (!log_Reports.Successful) { // エラー goto gt_EndMethod; } cf_VarRecord1.Dictionary_Attribute.Set(PmNames.S_VALUE.Name_Pm, sStringValue, log_Reports); } } // // 変数を登録。 // if (log_Reports.Successful) { //NAME列 string sName; cf_VarRecord1.Dictionary_Attribute.TryGetValue(PmNames.S_NAME, out sName, true, log_Reports); //FOLDER列 (オプション) string sFolder; bool bExistsFolder = cf_VarRecord1.Dictionary_Attribute.TryGetValue(PmNames.S_FOLDER, out sFolder, false, log_Reports); string sValue; cf_VarRecord1.Dictionary_Attribute.TryGetValue(PmNames.S_VALUE, out sValue, false, //空文字列でも可。 log_Reports); if (NamesVar.Test_Filepath(sName)) { //ファイルパス変数の場合。 Configurationtree_NodeFilepath cf_Fpath = new Configurationtree_NodeFilepathImpl("変数[" + sName + "]", this.parent_Variablesconfig_Configurationtree); cf_Fpath.InitPath( sValue, log_Reports ); if ("" != sFolder) { //if (log_Method.CanDebug(1)) //{ // log_Method.WriteDebug_ToConsole("「変数登録ファイル」FOLDER列指定あり=[" + sFolder + "]"); //} Expression_Node_String ec_Namevar_Folder = new Expression_Leaf_StringImpl(sFolder, null, this.parent_Variablesconfig_Configurationtree); Expression_Node_Filepath ec_Fopath_Folder = this.GetExpressionfilepathByVariablename( ec_Namevar_Folder, true, log_Reports ); cf_Fpath.SetDirectory_Base(ec_Fopath_Folder.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports)); } //else //{ // if (log_Method.CanDebug(1)) // { // log_Method.WriteDebug_ToConsole("「変数登録ファイル」FOLDER列指定なし"); // } //} Expression_Node_Filepath ec_Fpath = new Expression_Node_FilepathImpl(cf_Fpath); this.PutFilepath( sName, ec_Fpath, true, log_Reports ); //if (log_Method.CanDebug(1)) //{ // log_Method.WriteDebug_ToConsole("「変数登録ファイル」ファイルパス変数=[" + sName + "] 値=[" + ec_Fpath.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports) + "]"); //} } else { //ファイルパス以外の変数の場合。 //if (log_Method.CanDebug(1)) //{ // log_Method.WriteDebug_ToConsole("「変数登録ファイル」ファイルパス以外の変数=[" + sName + "]"); //} if (bExistsFolder && "" != sFolder) { //ファイルパス変数以外の変数で、FOLDER列値を指定しているのはエラーです。 //※FOLDER列が存在する場合だけエラーチェックします。FOLDER列値がない場合は、sFolderには"null"が入っているので無視します。 err_SName = sName; err_SFolder = sFolder; goto gt_Error_InputFolder; } this.PutString( sName, sValue, log_Reports ); } } } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_InputFolder: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("Er:402;", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("["); s.Append(err_SName); s.Append("]変数に、"); s.Append(PmNames.S_FOLDER.Name_Attribute); s.Append( "列値を指定しているのはエラーです。"); s.Newline(); s.Append( PmNames.S_FOLDER.Name_Attribute ); s.Append("列値は、ファイルパス変数にしか書いてはいけません。"); s.Newline(); s.Append("ファイルパス変数は、「"); s.Append(NamesVar.S_SP_); s.Append("」、「"); s.Append(NamesVar.S_UP_); s.Append("」で始まる名前の変数です。"); s.Newline(); s.Newline(); s.AppendI(1, PmNames.S_FOLDER.Name_Attribute); if (null == err_SFolder) { s.Append("=ヌル。"); } else { s.Append("=["); s.Append(err_SFolder); s.Append("]"); } s.Newline(); s.Newline(); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_NullTable: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー918!", log_Method); StringBuilder t = new StringBuilder(); t.Append("指定されたテーブルは、ヌルでした。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); // ヒント r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_DoubleLoad: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー919!", log_Method); StringBuilder t = new StringBuilder(); t.Append("既に「変数設定ファイル」はロードされているのに、"); t.Append(Environment.NewLine); t.Append("また 「変数設定ファイル」をロードしようとしました。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); // ヒント r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
/// <summary> /// ヒットした件数がなかったとき、エラーになるか否か。 /// </summary> /// <param name="hits"></param> /// <param name="log_Reports"></param> /// <returns></returns> public static bool IsError_IfNoHit(EnumHitcount hits, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, "Utility_Hitcount", "IsError_IfNoHit", log_Reports); bool result; switch (hits) { case EnumHitcount.Exists: result = true; //エラーになる。 break; case EnumHitcount.First_Exist: result = true; //エラーになる。 break; case EnumHitcount.First_Exist_Or_Zero: result = false; //セーフ。 break; case EnumHitcount.One: result = true; //エラーになる。 break; case EnumHitcount.One_Or_Zero: result = false; //セーフ。 break; case EnumHitcount.Unconstraint: result = false; //セーフ。 break; default: //エラー result = true; //意味が変わるが、エラーにする。 goto gt_Error_Default; } goto gt_EndMethod; // #region 異常系 //──────────────────────────────────────── gt_Error_Default: { if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー031!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("Enum型の対応していない値["); t.Append(hits.ToString()); t.Append("]"); t.Newline(); r.Message = t.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── #endregion gt_EndMethod: log_Method.EndMethod(log_Reports); return(result); }
//──────────────────────────────────────── /// <summary> /// 文字列型変数の値をセットします。 /// </summary> /// <param select="oVariableName"></param> /// <param select="nValue"></param> /// <param select="bRequired"></param> public void SetStringValue( XenonName o_Name_Variable, string sValue, bool bRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "SetStringValue",log_Reports); // // if (bRequired && !this.dictionaryExpression_Item.ContainsKey(o_Name_Variable.SValue)) { goto gt_Error_NotFoundVariable; } else { Expression_Leaf_StringImpl ec_Str = new Expression_Leaf_StringImpl(null, new Configurationtree_NodeImpl("<SetStringValueから>", null)); ec_Str.SetString(sValue, log_Reports); this.dictionaryExpression_Item[o_Name_Variable.SValue] = ec_Str; //.WriteLine(this.GetType().Name + "#SetStringValue: ◆ 文字列型変数[" + oVariableName.OValue + "]に、値["+value+"]をセットしました。"); } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundVariable: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー923!", log_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("["); t.Append(o_Name_Variable.SValue); t.Append("]という名前の 文字列型の変数は、存在しませんでした。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append(" ヒント: 「変数設定ファイル」に登録されている変数だけ使えます。"); t.Append(Environment.NewLine); t.Append(" ヒント: 変数名の英字の大文字・小文字は完全に一致していますか?"); t.Append(Environment.NewLine); t.Append(" ヒント: 「ファイルパス型」と「文字列型」の2つがあります。"); t.Append(" 文字列型として利用されようとしました。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append(" 「変数設定ファイル」のファイルパス:"); t.Append(Environment.NewLine); t.Append(" "); if (null != this.parent_Variablesconfig_Configurationtree) { this.parent_Variablesconfig_Configurationtree.ToText_Locationbreadcrumbs(t); } else { t.Append("ヌル"); } t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append(" 問題箇所ヒント:"); t.Append(Environment.NewLine); t.Append(" "); o_Name_Variable.Cur_Configuration.ToText_Locationbreadcrumbs(t); t.Append(Environment.NewLine); t.Append(Environment.NewLine); // ヒント t.Append(r.Message_SSeparator()); t.Append(" 変数一覧:"); t.Append(Environment.NewLine); foreach (string sVarName in this.DictionaryExpression_Item.Keys) { t.Append(" "); t.Append(sVarName); t.Append(Environment.NewLine); } t.Append(Environment.NewLine); r.Message = t.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// 空白は、無いのと同じに扱う。 /// </summary> /// <param name="sKey"></param> /// <param name="sResult"></param> /// <param name="bRequired"></param> /// <param name="log_Reports"></param> /// <returns></returns> public bool TryGetValue( PmName pmName,//Pmオブジェクトにしたい。 out string sResult, bool bRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "TryGetValue",log_Reports); // bool bHit = this.dictionary_Attribute.TryGetValue(pmName.Name_Pm, out sResult); if (!bHit || "" == sResult) { if (bRequired) { goto gt_Error_NoHit; } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NoHit: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("Er:004;", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("name=\""); s.Append(pmName.Name_Attribute); s.Append("\" 属性か、または <arg name=\""); s.Append(pmName.Name_Pm); s.Append("\" ~> 要素のどちらかが必要でしたが、違う方を書いたか、記述されていないか、空文字列でした。"); s.Newline(); s.Newline(); if (null != this.owner) { //ヒント s.Append(r.Message_Configuration(this.owner)); } else { s.Append("どの要素かは不明。"); s.Newline(); } // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return bHit; }
//──────────────────────────────────────── public void ToMemory_ParentFcells( string sValue_Output, Expression_Node_String parent_Expr_Fcells,//子「Sf:Cell;」関数を持った親要素。 MemoryApplication moApplication, Log_Reports log_Reports ) { Log_Method pg_Method = new Log_MethodImpl(); pg_Method.BeginMethod(Info_Controls.Name_Library, this, "ToM_ParentFcells",log_Reports); // // // <data>の子要素のリスト。 parent_Expr_Fcells.List_Expression_Child.ForEach(delegate(Expression_Node_String child_Expr, ref bool bRemove, ref bool bBreak) { string sName_Fnc; child_Expr.TrySelectAttribute(out sName_Fnc, PmNames.S_NAME.Name_Pm, EnumHitcount.One, log_Reports); if (log_Reports.Successful) { if (NamesFnc.S_CELL == sName_Fnc) { // Sf:cell; this.ToMemory_DataTargetFcell( sValue_Output, child_Expr, moApplication, log_Reports ); } //else if (NamesNode.S_ARG3 == e_Child.Cur_Configurationtree.Name_Node) //{ // // スルー // d_InMethod.WarningWrite("[" + e_Child.Cur_Configurationtree.Name_Node + "]ノードを無視しました。"); //} else { if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー377!", pg_Method); Log_TextIndented t = new Log_TextIndentedImpl(); t.AppendI(0, "Sf:cell; 以外の要素が指定されていました。"); t.Newline(); t.AppendI(0, "「データターゲット」または「arg3 to」には、Sf:cell; 要素1つしか指定してはいけません。"); t.Newline(); t.Newline(); t.AppendI(0, "もしかして? 「『Sf:cell;』の親」 を渡すべきところに、「『arg3 to』の親」を渡していませんか?"); t.Newline(); // ヒント t.AppendI(1, r.Message_Configuration(child_Expr.Cur_Configuration)); r.Message = t.ToString(); log_Reports.EndCreateReport(); } } } }); goto gt_EndMethod; // // gt_EndMethod: pg_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// attr系要素の追加。 /// /// 既に追加されている要素は、追加できない。 /// </summary> public void Add( string sKey, string sValue, Configuration_Node conf_Value, bool bRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "Add",log_Reports); // // if (!this.dictionary_Attribute.ContainsKey(sKey)) { this.dictionary_Attribute.Add(sKey, sValue); } else { if (bRequired) { // エラー goto gt_Error_Duplicate; } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Duplicate: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー345!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("要素<"); s.Append(this.owner.Name); s.Append(">に、同じ名前の属性が重複していました。"); s.Newline(); s.Append("入れようとした要素の名前=["); s.Append(sKey); s.Append("]"); s.Newline(); // ヒント s.Append(r.Message_Configuration(conf_Value)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// TODO:「,」「"」に対応したい。 /// /// /// 縦と横が逆のテーブル。 /// /// CSVを読取り、テーブルにして返します。 /// /// /// SRS仕様の実装状況 /// ここでは、先頭行を[0]行目と数えるものとします。 /// (1)CSVの[0]行目は列名です。 /// (2)CSVの[1]行目は型名です。 /// (3)CSVの[2]行目はコメントです。 /// /// (4)データ・テーブル部で、0列目に「EOF」と入っていれば終了。大文字・小文字は区別せず。 /// それ以降に、コメントのようなデータが入力されていることがあるが、フィールドの型に一致しないことがあるので無視。 /// TODO EOF以降の行も、コメントとして残したい。 /// /// (5)列名にENDがある場合、その手前までの列が有効データです。 /// END以降の列は無視します。 /// TODO END以降の行も、コメントとして残したい。 /// /// (6)int型として指定されているフィールドのデータ・テーブル部に空欄があった場合、DBNull(データベース用のヌル)とします。 /// </summary> /// <param name="csvText"></param> /// <returns>列名情報も含むテーブル。列の型は文字列型とします。</returns> public Table_Humaninput Read( string string_Csv, Request_ReadsTable forTable_Request, Format_Table_Humaninput forTable_Format, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Table.Name_Library, this, "Read",log_Reports); // // // // CsvLineParserImpl csvParser = new CsvLineParserImpl(); Table_Humaninput xenonTable = new Table_HumaninputImpl( forTable_Request.Name_PutToTable, forTable_Request.Expression_Filepath, forTable_Request.Expression_Filepath.Cur_Configuration ); xenonTable.Tableunit = forTable_Request.Tableunit; xenonTable.Typedata = forTable_Request.Typedata; xenonTable.IsDatebackupActivated = forTable_Request.IsDatebackupActivated; xenonTable.Format_Table_Humaninput = forTable_Format; // // 一旦、テーブルを全て読み込みます。 // List<List<string>> lines = new List<List<string>>(); { // CSVテキストを読み込み、型とデータのバッファーを作成します。 System.IO.StringReader reader = new System.IO.StringReader(string_Csv); while (-1 < reader.Peek()) { string sLine = reader.ReadLine(); List<string> tokens = new List<string>(); string[] sFields; sFields = csvParser.UnescapeLineToFieldList(sLine, this.charSeparator).ToArray(); int nColumnIndex = 0; foreach (string sToken in sFields) { if (nColumnIndex == 0 && ToCsv_Table_Humaninput_RowColRegularImpl.S_END == sToken.Trim().ToUpper()) { // 1列目にENDがある場合、その手前までの列が有効データです。 // END以降の行は無視します。 goto row_end; } tokens.Add(sToken); nColumnIndex++; } lines.Add(tokens); } row_end: // ストリームを閉じます。 reader.Close(); } // // 型定義部 // // (※NO,ID,EXPL,NAME など、フィールドの定義を持つテーブル) // RecordFielddefinition recordFielddefinition = new RecordFielddefinitionImpl(); // // データ・テーブル部 // List<List<string>> rows = new List<List<string>>(); // // まず、0列目、1列目、2列目のデータを読み取ります。 // int nRowIndex=0; foreach (List<string> tokens in lines) { Fielddefinition fieldDefinition = null; int nColumnIndex = 0; foreach(string sToken in tokens) { if(0==nColumnIndex) { // // 0列目は、フィールド名です。 // string sFieldName = sToken;//.Trim().ToUpper(); // テーブルのフィールドを追加します。型の既定値は文字列型とします。 fieldDefinition = new FielddefinitionImpl(sFieldName, EnumTypeFielddefinition.String); recordFielddefinition.Add(fieldDefinition); } else if(1==nColumnIndex) { // // 1列目は、フィールドの型名です。 // nColumnIndex = 1; string sFieldTypeNameLower = sToken.Trim().ToLower(); // テーブルのフィールドを追加します。型の既定値は文字列型とします。 // TODO int型とboolean型にも対応したい。 if (FielddefinitionImpl.S_STRING.Equals(sFieldTypeNameLower)) { fieldDefinition.Type_Field = EnumTypeFielddefinition.String; } else if (FielddefinitionImpl.S_INT.Equals(sFieldTypeNameLower)) { fieldDefinition.Type_Field = EnumTypeFielddefinition.Int; } else if (FielddefinitionImpl.S_BOOL.Equals(sFieldTypeNameLower)) { fieldDefinition.Type_Field = EnumTypeFielddefinition.Bool; } else { // 型が未定義の列は、文字列型として読み取ります。 // TODO: 警告。(エラーではない) Log_TextIndented t = new Log_TextIndentedImpl(); t.Append("▲エラー45!(" + Info_Table.Name_Library + ")"); t.Newline(); t.Append("型の名前を記入してください。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("※縦と横がひっくり返っているテーブルと指定されています。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("1列目(先頭を0とする)に、型の名前は必須です。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("["); t.Append(fieldDefinition.Name_Humaninput); t.Append("]フィールド (["); t.Append(nRowIndex); t.Append("]行目)に、"); t.Append(Environment.NewLine); t.Append("型名が["); t.Append(sFieldTypeNameLower); t.Append("]と入っています。この名前には、未対応です。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("文字列型として続行します。"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); t.Append("テーブル名=["); t.Append(forTable_Request.Name_PutToTable); t.Append("]"); t.Append(Environment.NewLine); t.Append("ファイル・パス=["); t.Append(forTable_Request.Expression_Filepath.Humaninput); t.Append("]"); t.Append(Environment.NewLine); t.Append(Environment.NewLine); string sWarning = t.ToString(); MessageBox.Show(sWarning, "▲警告!(L02)"); fieldDefinition.Type_Field = EnumTypeFielddefinition.String; } } else if(2==nColumnIndex) { // // 2列目は、フィールドのコメントとします。 // nColumnIndex = 2; { fieldDefinition.Comment = sToken; } } else { // // 3列目から右側は、データ・テーブル部。 // if(0==nRowIndex) { // // 先頭行 // // // 「EOF」というトークンが出てくるまで。 // if(ToCsv_Table_Humaninput_RowColRegularImpl.S_EOF==sToken.Trim().ToUpper()) { goto column_end; } List<string> record = new List<string>(); // 1番目のフィールド_データを追加。 record.Add( sToken); rows.Add(record); } else { // // 2番目以降のフィールド_データを追加。 // // // 先頭の3つのレコード分、切り詰めます。 // int nDataIndex = nColumnIndex - 3; if (nDataIndex < rows.Count) { List<string> record = rows[nDataIndex]; record.Add(sToken); } else { // 無視 } } } nColumnIndex ++; }//c column_end: nRowIndex++; } //essageBox.Show("CSV読取終わり1 rows.Count=[" + rows.Count + "]", "TableCsvLibデバッグ"); // テーブル作成。テーブルのフィールド型定義と、データ本体をセットします。 xenonTable.CreateTable(recordFielddefinition, log_Reports); if (log_Reports.Successful) { xenonTable.AddRecordList(rows, recordFielddefinition, log_Reports); //essageBox.Show("CSV読取後のテーブル作成終わり", "TableCsvLibデバッグ"); } goto gt_EndMethod; // // gt_EndMethod: log_Method.EndMethod(log_Reports); return xenonTable; }
/// <summary> /// 空白は、無いのと同じに扱う。 /// </summary> /// <param name="name"></param> /// <param name="result"></param> /// <param name="isRequired"></param> /// <param name="log_Reports"></param> /// <returns></returns> public bool TryGetValue( PmName name,//Pmオブジェクトにしたい。 out string result, bool isRequired, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "TryGetValue", log_Reports); // bool bHit = this.map.TryGetValue(name.Pm, out result); if (!bHit || "" == result) { if (isRequired) { goto gt_Error_NoHit; } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NoHit: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("Er:004;", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("name=\""); s.Append(name.Plain); s.Append("\" 属性か、または <arg name=\""); s.Append(name.Pm); s.Append("\" ~> 要素のどちらかが必要でしたが、違う方を書いたか、記述されていないか、空文字列でした。"); s.Newline(); s.Newline(); if (null != this.owner) { //ヒント s.Append(r.Message_Conf(this.owner)); } else { s.Append("どの要素かは不明。"); s.Newline(); } // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); return(bHit); }
//──────────────────────────────────────── /// <summary> /// ノード名を指定して、直近の親ノードを取得したい。 /// </summary> /// <param name="name"></param> /// <param name="isRequired">偽を指定した時は、不一致の時ヌルを返す。</param> /// <param name="log_Reports"></param> /// <returns></returns> public virtual Conf_String GetParentByName( string name, bool isRequired, Log_Reports log_Reports) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_Syntax.Name_Library, this, "GetParentByNodename", log_Reports); // // Conf_String result; Conf_String err_cParent; if (log_Reports.Successful) { if (null != this.Parent) { // 親要素があるとき if (name == this.Parent.Name) { // ノード名が一致 result = this.Parent; } else { // ノード名が一致しないとき result = this.Parent.GetParentByName(name, isRequired, log_Reports); } } else { // 親要素がないとき result = null; err_cParent = null; goto gt_Error_NotFoundParent; } } else { // 既にエラーが出ているとき result = null; } if (!(result is Conf_String)) { //エラー goto gt_Error_AnotherClass; } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_NotFoundParent: if (log_Reports.CanCreateReport) { if (isRequired) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー501!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("親要素の取得に失敗しました。"); s.Newline(); s.Append("指定ノード名["); s.Append(name); s.Append("]"); s.Newline(); s.Append("親要素はヌルです。"); s.Newline(); if (null != err_cParent) { s.Append("親要素ノード名["); s.Append(err_cParent.Name); s.Append("]"); s.Newline(); } // ヒント s.Append(r.Message_Conf(this)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_AnotherClass: if (log_Reports.CanCreateReport) { if (isRequired) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー502!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("(内部プログラム・エラー)取得した親要素は、指定のクラスとは異なりました。"); s.Newline(); s.Append("取得した親要素のクラス名["); s.Append(result.GetType().Name); s.Append("]"); s.Newline(); // ヒント s.Append(r.Message_Conf(this)); r.Message = s.ToString(); log_Reports.EndCreateReport(); } } goto gt_EndMethod; //──────────────────────────────────────── #endregion // gt_EndMethod: log_Method.EndMethod(log_Reports); return(result); }