//──────────────────────────────────────── /// <summary> /// 妥当性判定のグローバル設定ファイルの読取り。 /// </summary> /// <param name="sFpatha">絶対ファイルパス</param> /// <param name="log_Reports"></param> public void LoadFile( string sFpatha, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "LoadFile",log_Reports); // // this.xToConfigurationtree_V.XmlToConfigurationtree( sFpatha, owner_MemoryApplication, log_Reports ); Log_TextIndented_ConfigurationtreeToExpressionImpl pg_ParsingLog = new Log_TextIndented_ConfigurationtreeToExpressionImpl(); pg_ParsingLog.BEnabled = false; this.givechapterandverseToExpression_V.Translate( owner_MemoryApplication, pg_ParsingLog, log_Reports ); if (log_Method.CanInfo() && pg_ParsingLog.BEnabled) { log_Method.WriteInfo_ToConsole(" d_ParsingLog=" + Environment.NewLine + pg_ParsingLog.ToString()); } // // log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// ファイルパス型変数を登録します。 /// /// todo:文字列、ファイルパスの区別なく登録したい。 /// </summary> /// <param name="sVariableName"></param> /// <param name="e_InitialValue"></param> /// <param name="bDuplicatedIsError">既に追加されているものを、更に追加しようとしたときにエラーにするなら真。</param> /// <param name="log_Reports"></param> public void PutFilepath( string sName_Variable, Expression_Node_Filepath ec_InitialValue, bool bDuplicatedIsError, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "PutFilepath",log_Reports); // // if (this.dictionaryExpression_Item.ContainsKey(sName_Variable)) { if (bDuplicatedIsError) { goto gt_Error_Duplicated; } else { // 上書き string sOldValue = ""; if (log_Method.CanInfo()) { sOldValue = this.dictionaryExpression_Item[sName_Variable].Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports); } this.dictionaryExpression_Item[sName_Variable] = ec_InitialValue; if (log_Method.CanInfo()) { log_Method.WriteInfo_ToConsole("変数[" + sName_Variable + "]は既に[" + sOldValue + "]と定義されていましたが、[" + ec_InitialValue.Execute4_OnExpressionString(EnumHitcount.Unconstraint, log_Reports) + "]で上書きしました。"); } } } else { this.dictionaryExpression_Item.Add(sName_Variable, ec_InitialValue); } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Duplicated: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー922!", log_Method); r.Message = "変数[" + sName_Variable + "]は既に定義されていますが、さらに定義されました。"; log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── #endregion // // gt_EndMethod: log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// デバッグ出力。 /// </summary> public void WriteDebug_ToConsole() { Log_Method log_Method = new Log_MethodImpl(0); Log_Reports d_Logging_Dammy = new Log_ReportsImpl(log_Method); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "WriteDebug_ToConsole",d_Logging_Dammy); // // if (log_Method.CanInfo()) { log_Method.WriteInfo_ToConsole("要素数=[" + this.dictionaryExpression_Item.Count + "]"); // 項目(キーと値)の列挙 foreach (KeyValuePair<string, Expression_Node_String> kvp in this.dictionaryExpression_Item) { if (null == kvp.Value) { log_Method.WriteInfo_ToConsole(" [" + kvp.Key + "]=空っぽ"); } else { if (kvp.Value is Expression_Node_Filepath) { // ファイルパス型。 // bug: 絶対パスでない場合、空白になるので、SHumanInput で取得することになるはず。 log_Method.WriteInfo_ToConsole(" [" + kvp.Key + "]=P型[" + kvp.Value.Execute4_OnExpressionString(EnumHitcount.Unconstraint, d_Logging_Dammy) + "] / SHumanInput=[" + ((Expression_Node_Filepath)kvp.Value).Humaninput + "]"); } else { log_Method.WriteInfo_ToConsole(" [" + kvp.Key + "]=[" + kvp.Value.Execute4_OnExpressionString(EnumHitcount.Unconstraint, d_Logging_Dammy) + "]"); } } } } // // log_Method.EndMethod(d_Logging_Dammy); d_Logging_Dammy.EndLogging(log_Method); if (!d_Logging_Dammy.Successful) { log_Method.WriteDebug_ToConsole(d_Logging_Dammy.ToText()); } }
/// <summary> /// 『レイアウト設定ファイル』をもとに、コントロールを作成し、 /// フォームと、アプリケーション・モデルにコントロールを動的に追加します。 /// </summary> /// <param name="fo_Config"></param> /// <param name="form"></param> protected void CreateForm( TableUserformconfig fo_Config, Form form, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0, Log_ReportsImpl.BDebugmode_Static); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "CreateForm",log_Reports); // // //this.form_noren = form; // レイアウトするロジックを一時停止。(メインフォーム) form.SuspendLayout(); // フォームにステータスバーを付けます。(デバッグモードでのみ) TODO:1回限りであること。 if (null == statusStrip1 && Log_ReportsImpl.BDebugmode_Static) { statusStrip1 = new System.Windows.Forms.StatusStrip(); // // statusStrip1 // statusStrip1.Location = new System.Drawing.Point(0, 244); statusStrip1.Name = "statusStrip1"; statusStrip1.Size = new System.Drawing.Size(292, 22); statusStrip1.TabIndex = 0; statusStrip1.Text = "statusStrip1"; this.statusStripLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); this.statusStripLabel2.Name = "toolStripStatusLabel1"; this.statusStripLabel2.Size = new System.Drawing.Size(114, 17); this.statusStripLabel2.Text = "toolStripStatusLabel1"; this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.statusStripLabel2}); form.Controls.Add(statusStrip1); // #情報 if (log_Method.CanInfo()) { log_Method.WriteInfo_ToConsole("ステータスバーをフォームに追加した。(デバッグモードでのみ)TODO:1回限りであること。"); } } //// フォームに「マルチロール_テキストボックス」を付けます。 TODO:1回限りであること。 //if (null == this.multiroleTextBox) //{ // this.multiroleTextBox = new System.Windows.Forms.TextBox(); // this.multiroleTextBox.Multiline = true; // form.Controls.Add(this.multiroleTextBox); // // #デバッグ // ystem.Console.WriteLine(Info_NorenImpl.LibraryName + ":MoNorenImpl#CreateForm:マルチロール_テキストボックスをフォームに追加した。TODO:1回限りであること。"); //} // 1つ前のコントロールが入っている仕組み。 List<Usercontrol> list_StackFc = new List<Usercontrol>(); List<int> nList_StackTree = new List<int>(); // // レコードの並び順は、記述されている順番とします。 // foreach (RecordUserformconfig fo_Record in fo_Config.List_RecordUserformconfig) { int nCurTree; fo_Record.TryGetInt(out nCurTree, NamesFld.S_TREE, true, -1, this.Owner_MemoryApplication, log_Reports); // // // ここで、コントロール(UserControl)を作成。 // 作成できなかった、または作成しなかった場合はヌル。 // // Usercontrol uct = ucontrolCreator1.Create( fo_Record, true, this.Owner_MemoryApplication, log_Reports ); //.WriteLine(this.GetType().Name + "#CreateForm: (10) この要素=[" + fcUc.ControlCommon.Name + "] curTree=[" + curTree + "]"); if (log_Reports.Successful) { if (null != uct) { string sName_Control; fo_Record.TryGetString(out sName_Control, NamesFld.S_NAME, true, "", this.Owner_MemoryApplication, log_Reports); Expression_Node_StringImpl ec_Str = new Expression_Node_StringImpl(null, fo_Record.Parent_TableUserformconfig.Cur_Configurationtree); ec_Str.AppendTextNode( sName_Control, fo_Record.Parent_TableUserformconfig.Cur_Configurationtree, log_Reports ); // // // コントロール名の登録。 // // this.Owner_MemoryApplication.MemoryForms.PutUsercontrol( ec_Str, uct, log_Reports ); if (uct is UsercontrolWindow) { // // 「ウィンドウ」(別窓)を開けたい場合。 // UsercontrolWindow uctWnd = (UsercontrolWindow)uct; //ucWindow.SetupStatusStrip(); uctWnd.CustomcontrolWindow1.Show(); //.WriteLine(this.GetType().Name + "#CreateForm: (20) 【ウィンドウ追加】トップに、この要素=[" + fcUc.ControlCommon.Name + "]を追加。"); } else { if (0 == nList_StackTree.Count) { // // ★追加: メインフォームのトップに、この要素を追加 // form.Controls.Add((Control)uct); // 普通、メインウィンドウもここになる。 } else { int nPrevTree = nList_StackTree.Last(); if (nPrevTree == nCurTree) { // 1つ前の要素と ツリー値が同じなら、 // 1つ前の要素をスタックから削除し、 list_StackFc.RemoveAt(list_StackFc.Count - 1); nList_StackTree.RemoveAt(nList_StackTree.Count - 1); if (0 != nList_StackTree.Count) { nPrevTree = nList_StackTree.Last(); // // ★追加: 前の要素(スタックの最後の要素)に、この要素を追加。 // Usercontrol prevUc = list_StackFc.Last(); prevUc.AppendChild( uct, log_Reports ); //.WriteLine(this.GetType().Name + "#CreateForm: (40) 【前の要素に、この要素を追加】 前の要素=[" + prevUc.ControlCommon.Name + "]に、この要素=[" + fcUc.ControlCommon.Name + "]を追加。"); } else { nPrevTree = 0; // // ★追加: メインフォームのトップに、この要素を追加 // form.Controls.Add((Control)uct); //.WriteLine(this.GetType().Name + "#CreateForm: (50) 【メインフォームのトップ要素として追加2】 メインフォームのトップに、この要素=[" + fcUc.ControlCommon.Name + "]を追加。"); } } else if (nPrevTree < nCurTree) { // 1つ前の要素より、大きなtree値を持つなら、 // // ★追加: 1つ前の要素に、この要素を追加。 // Usercontrol prevUc = list_StackFc.Last(); prevUc.AppendChild( uct, log_Reports ); //.WriteLine(this.GetType().Name + "#CreateForm: (60) 【前の要素に、この要素を追加】 前の要素=[" + prevUc.ControlCommon.Name + "]に、この要素=[" + fcUc.ControlCommon.Name + "]を追加。"); } else { // 1つ前の要素より、小さなtree値を持つなら、 // // ★削除: // 自分より小さなtree値を持つ要素が出てくるまで、 // 前の要素を消す。 // list_StackFc.RemoveAt(list_StackFc.Count - 1); nList_StackTree.RemoveAt(nList_StackTree.Count - 1); //.WriteLine(this.GetType().Name + "#CreateForm: (70) 【前要素削除】 この要素=[" + fcUc.ControlCommon.Name + "]"); // // foreachループの中で、リストの要素数が変わると、 // foreachループは失敗する。 // // whileループを使うことにする。 // while (0 < nList_StackTree.Count) { Usercontrol prevUc = list_StackFc.Last(); nPrevTree = nList_StackTree.Last(); if (nCurTree <= nPrevTree) { list_StackFc.RemoveAt(list_StackFc.Count - 1); nList_StackTree.RemoveAt(nList_StackTree.Count - 1); //.WriteLine(this.GetType().Name + "#CreateForm: (80) 【前要素削除】 この要素=[" + fcUc.ControlCommon.Name + "] 前の要素=[" + prevUc.ControlCommon.Name + "]"); } else { break; } } if (0 == nList_StackTree.Count) { // 空っぽになったらループを止める。 // エラー? nPrevTree = -1; } else { nPrevTree = nList_StackTree.Last(); } if (0 == nList_StackTree.Count) { // // ★追加: メインフォームのトップに、この要素を追加 // form.Controls.Add((Control)uct); //.WriteLine(this.GetType().Name + "#CreateForm: (90) 【メインフォームのトップ要素として追加3】 メインフォームのトップに、この要素=[" + fcUc.ControlCommon.Name + "]を追加。"); } else { // // ★追加: 1つ前の要素に、この要素を追加。 // Usercontrol prevUc = list_StackFc.Last(); prevUc.AppendChild( uct, log_Reports ); //.WriteLine(this.GetType().Name + "#CreateForm: (100) 【前の要素に、この要素を追加】 前の要素=[" + prevUc.ControlCommon.Name + "]に、この要素=[" + fcUc.ControlCommon.Name + "]を追加。"); } } } } } } list_StackFc.Add(uct); nList_StackTree.Add(nCurTree); } // レイアウトの一時停止を解除。レイアウト実行の強制はしない。(メインフォーム) form.ResumeLayout(false); // // // // log_Method.EndMethod(log_Reports); }
//──────────────────────────────────────── /// <summary> /// デバッグ出力。 /// </summary> public void WriteDebug_ToConsole() { Log_Method log_Method = new Log_MethodImpl(0); Log_Reports log_Reports_ThisMethod = new Log_ReportsImpl(log_Method); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "DebugWrite", log_Reports_ThisMethod); // // if (log_Method.CanInfo()) { log_Method.WriteInfo_ToConsole(" ──────────登録関数名一覧"); foreach (string sKey in this.dictionary_Item.Keys) { log_Method.WriteInfo_ToConsole(" key=[" + sKey + "]"); } log_Method.WriteInfo_ToConsole(" ──────────"); } log_Method.EndMethod(log_Reports_ThisMethod); }
//──────────────────────────────────────── /// <summary> /// 『ユーザー定義関数設定ファイル(Fnc)』を読み取ります。 /// </summary> public void LoadFile( Expression_Node_Filepath filepath_Userfunctionconfig_Expr, Log_Reports log_Reports ) { Log_Method log_Method = new Log_MethodImpl(0); log_Method.BeginMethod(Info_MiddleImpl.Name_Library, this, "LoadFile", log_Reports); // // if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole(" ユーザー定義関数設定ファイルの読み取り。"); } Configurationtree_Node parent_Conf = new Configurationtree_NodeImpl(NamesNode.S_CODEFILE_FUNCTIONS, filepath_Userfunctionconfig_Expr.Cur_Configuration);//Info_OpyopyoImpl.LibraryName + ":" + this.GetType().Name + ".LoadFile_Fnc" Expression_Node_String userfunctionconfig_Expr = new Expression_Node_StringImpl(null, parent_Conf); string filepathabsolute = filepath_Userfunctionconfig_Expr.Execute4_OnExpressionString( EnumHitcount.Unconstraint, log_Reports); if (!log_Reports.Successful) { goto gt_Error_Fpath; } if (!System.IO.File.Exists(filepathabsolute)) { goto gt_Error_File; } XmlDocument xDoc = new XmlDocument(); Exception err_Excp = null; try { xDoc.Load(filepathabsolute); } catch (System.IO.IOException ex) { // // エラー。 err_Excp = ex; goto gt_Error_Doc; } catch (ArgumentException ex) { // // エラー。 err_Excp = ex; goto gt_Error_Doc; } catch (Exception ex) { // // エラー。 err_Excp = ex; goto gt_Error_Doc; } XmlElement xRoot = null; if (log_Reports.Successful) { // ルート要素を取得 xRoot = xDoc.DocumentElement; // スクリプトファイルのバージョンチェック。(関数登録ファイル) ValuesAttr.Test_Codefileversion( xRoot.GetAttribute(PmNames.S_CODEFILE_VERSION.Name_Attribute), log_Reports, new Configurationtree_NodeImpl(filepathabsolute, null), NamesNode.S_CODEFILE_FUNCTIONS ); } string sErrorElementName = ""; if (log_Reports.Successful) { XmlNodeList xTopNL = xRoot.ChildNodes; foreach (XmlNode xTopNode in xTopNL) { if (XmlNodeType.Element == xTopNode.NodeType) { if (NamesNode.S_COMMON_FUNCTION == xTopNode.Name) { XmlElement x_Cur = (XmlElement)xTopNode; string sNameValue = x_Cur.GetAttribute(PmNames.S_NAME.Name_Attribute); if (log_Method.CanDebug(1)) { log_Method.WriteDebug_ToConsole(" ユーザー定義関数の追加を開始:" + sNameValue); } // XToCf XmlToConfigurationtree_C15_Elm xToCf = XmlToConfigurationtree_Collection.GetTranslatorByNodeName(NamesNode.S_COMMON_FUNCTION, log_Reports); xToCf.XmlToConfigurationtree( x_Cur, parent_Conf, this.Owner_MemoryApplication, log_Reports ); Configurationtree_Node s_Cur = null; parent_Conf.List_Child.ForEach(delegate(Configurationtree_Node s_Child, ref bool bBreak) { s_Cur = s_Child; bBreak = true; }); // SToE Expression_Node_FunctionImpl ec_CommonFunction = new Expression_Node_FunctionImpl(userfunctionconfig_Expr, s_Cur, new List<string>()); Log_TextIndented_ConfigurationtreeToExpressionImpl pg_ParsingLog = new Log_TextIndented_ConfigurationtreeToExpressionImpl(); pg_ParsingLog.BEnabled = false; ConfigurationtreeToExpression_AbstractImpl.ParseChild_InAnotherLibrary( s_Cur, ec_CommonFunction, this.Owner_MemoryApplication, pg_ParsingLog, log_Reports ); if (log_Method.CanInfo() && pg_ParsingLog.BEnabled) { log_Method.WriteInfo_ToConsole(" d_ParsingLog=" + Environment.NewLine + pg_ParsingLog.ToString()); } this.Owner_MemoryApplication.MemoryFunctions.AddFunction(sNameValue, ec_CommonFunction, log_Reports); } else { // // エラー。 sErrorElementName = xTopNode.Name; goto gt_Error_UndefinedChild; } } } } goto gt_EndMethod; // // #region 異常系 //──────────────────────────────────────── gt_Error_Fpath: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー101!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("ユーザー定義関数設定ファイルへのパスにエラーがありました。"); s.Newline(); s.Newline(); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_File: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー102!", log_Method); Log_TextIndented s = new Log_TextIndentedImpl(); s.Append("ユーザー定義関数設定ファイルがありません。"); s.Newline(); s.Append("file=["); s.Append(filepathabsolute); s.Append("]"); s.Newline(); s.Newline(); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_Doc: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー103!", log_Method); StringBuilder s = new StringBuilder(); s.Append("エラー:" + err_Excp.Message); s.Append(Environment.NewLine); s.Append(Environment.NewLine); s.Append(Log_RecordReportsImpl.ToText_Configuration(filepath_Userfunctionconfig_Expr.Cur_Configuration)); // ヒント r.Message = s.ToString(); log_Reports.EndCreateReport(); } goto gt_EndMethod; //──────────────────────────────────────── gt_Error_UndefinedChild: if (log_Reports.CanCreateReport) { Log_RecordReports r = log_Reports.BeginCreateReport(EnumReport.Error); r.SetTitle("▲エラー104!", log_Method); StringBuilder s = new StringBuilder(); s.Append("未定義の要素:" + sErrorElementName); 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); }