/// <summary>Удаление блока из формулы</summary>
        /// <param name="a_Block">Блок</param>
        private bool f_RemoveBlock(Cl_FormulaConditionBlock a_Block)
        {
            if (a_Block == null)
            {
                return(false);
            }
            if (ctrlRTBFormula.TextLength == 0)
            {
                return(false);
            }
            string text = a_Block.f_GetTextFromBlock();

            if (string.IsNullOrWhiteSpace(text))
            {
                return(false);
            }
            int start = 0;

            if (text.Length > ctrlRTBFormula.TextLength)
            {
                start = 0;
            }
            else
            {
                start = ctrlRTBFormula.TextLength - text.Length;
            }
            ctrlRTBFormula.ReadOnly        = false;
            ctrlRTBFormula.SelectionStart  = start;
            ctrlRTBFormula.SelectionLength = text.Length;
            ctrlRTBFormula.SelectedText    = "";
            ctrlRTBFormula.ReadOnly        = true;
            m_Blocks.RemoveAt(m_Blocks.LastIndexOf(a_Block));
            return(true);
        }
        /// <summary>Добавление блока в формулу</summary>
        /// <param name="a_Block">Блок</param>
        /// <returns></returns>
        private bool f_AppendBlock(Cl_FormulaConditionBlock a_Block)
        {
            if (a_Block == null)
            {
                return(false);
            }

            if (a_Block.p_Object is string)
            {
                string txt = a_Block.p_Object.ToString();
                if (m_Blocks.Count < 2)
                {
                    return(false);
                }
                Cl_Element el = m_Blocks[m_Blocks.Count - 2].p_Object as Cl_Element;
                if (el == null || el.p_IsNumber)
                {
                    return(false);
                }
                Cl_ElementParam prm = el.p_NormValues.FirstOrDefault(val => val.p_Value == txt);
                if (prm != null)
                {
                    a_Block.p_Object = prm;
                }
                else
                {
                    prm = el.p_PatValues.FirstOrDefault(val => val.p_Value == txt);
                    if (prm != null)
                    {
                        a_Block.p_Object = prm;
                    }
                    else
                    {
                        return(false);
                    }
                }
            }

            string text = a_Block.f_GetTextFromBlock();

            if (string.IsNullOrWhiteSpace(text))
            {
                return(false);
            }
            ctrlRTBFormula.SelectionStart  = ctrlRTBFormula.TextLength;
            ctrlRTBFormula.SelectionLength = 0;
            ctrlRTBFormula.SelectionColor  = a_Block.f_GetColorBlock();
            ctrlRTBFormula.AppendText(text);
            ctrlRTBFormula.SelectionColor = ctrlRTBFormula.ForeColor;
            m_Blocks.Add(a_Block);
            return(true);
        }
 /// <summary>Проверка корректности формулы отображения элемента</summary>
 public bool f_Valid(ICollection <Cl_FormulaConditionBlock> a_Blocks)
 {
     if (a_Blocks.Count == 1)
     {
         return(false);
     }
     else
     {
         Cl_FormulaConditionBlock block = a_Blocks.LastOrDefault();
         if (block != null)
         {
             return(!block.p_IsOperand);
         }
         else
         {
             return(true);
         }
     }
 }
        private void ctrlBDelLastAction_Click(object sender, EventArgs e)
        {
            if (m_Blocks.Count == 0)
            {
                return;
            }
            Cl_FormulaConditionBlock lastBlock = m_Blocks.LastOrDefault();

            f_RemoveBlock(lastBlock);
            m_NumberBlockOper--;
            if (m_Blocks.Count > 1 && m_NumberBlockOper == 3)
            {
                if (m_Blocks[m_Blocks.Count - 2].p_Object is Cl_Element)
                {
                    f_UpdateStandartValues((Cl_Element)m_Blocks[m_Blocks.Count - 2].p_Object);
                }
            }
            f_UpdateControls(m_NumberBlockOper);
        }
        /// <summary>Получение блоков формулы отображения элемента</summary>
        /// <param name="a_Elements">Список элементов</param>
        /// <param name="a_Formula">Формула</param>
        public Cl_FormulaConditionBlock[] f_GetConditionsBlocks(Cl_Element[] a_Elements, string a_Formula)
        {
            string formula = a_Formula;
            var    blocks  = new List <Cl_FormulaConditionBlock>();

            while (!string.IsNullOrWhiteSpace(formula))
            {
                Cl_FormulaConditionBlock block = f_GetFirstConditionBlockFromText(a_Elements, formula);
                if (block != null)
                {
                    if (block.p_Object is string)
                    {
                        string txt = block.p_Object.ToString();
                        if (blocks.Count < 2)
                        {
                            return(null);
                        }
                        Cl_Element el = blocks[blocks.Count - 2].p_Object as Cl_Element;
                        if (el == null || el.p_IsNumber)
                        {
                            return(null);
                        }
                        if (el.p_Tag == "gender")
                        {
                            Cl_User.E_Sex gender;
                            if (Enum.TryParse(block.p_Object.ToString(), true, out gender))
                            {
                                block.p_Object = gender;
                            }
                            else
                            {
                                return(null);
                            }
                        }
                        else
                        {
                            Cl_ElementParam prm = el.p_NormValues.FirstOrDefault(val => val.p_Value == txt);
                            if (prm != null)
                            {
                                block.p_Object = prm;
                            }
                            else
                            {
                                prm = el.p_PatValues.FirstOrDefault(val => val.p_Value == txt);
                                if (prm != null)
                                {
                                    block.p_Object = prm;
                                }
                                else
                                {
                                    return(null);
                                }
                            }
                        }
                    }
                    blocks.Add(block);
                    string txtBlock = block.f_GetTextFromBlock();
                    formula = formula.Substring(txtBlock.Length);
                }
                else
                {
                    return(null);
                }
            }
            return(blocks.ToArray());
        }