Example #1
0
        private void btBalance_Click(object sender, System.EventArgs e)
        {
            Format format = new Format();

            string unbalancedReaction = tbReaction.Text;                                                                                // Неизравенетата реакция

            unbalancedReaction = unbalancedReaction.Replace('=', '');                                                                  // Знакът "равно" се заменя със стрелка за да може да се използват методите на класа "Balance"
            unbalancedReaction = format.RemoveMultipleSpaces(unbalancedReaction);                                                       // Премахват се интервалите, ако са повече от един на дадено място
            unbalancedReaction = format.AddSpacesAroundPlusAndArrowIfNoSuch(unbalancedReaction);                                        // Добавят се интервали около знаците плюс и стрелка, ако има нужда

            Validator validator = new Validator();
            string    valResult = validator.ValidateReaction(unbalancedReaction);                                                       // Реакцията се проверява за грешки при въвеждане

            if (valResult != string.Empty)
            {
                MessageBox.Show(valResult, "Грешка в реакцията", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                Balance balance = new Balance();

                List <string> molecules;                                                                                                // Списък на веществата участващи в реакцията
                int           moleculesCount = balance.SplitAndCountMolecules(unbalancedReaction, out molecules);                       // и техният брой

                List <string> elements;                                                                                                 // Списък на участващите химични елементи
                balance.SplitAndCountElements(unbalancedReaction, out elements);

                int leftPartMoleculesCount = balance.CountLeftPartMolecules(unbalancedReaction);                                        // Броят на веществата в лявата част на химичната реакция
                int[,] matrix = balance.CreateMatrix(elements, molecules, leftPartMoleculesCount);                                      // Матрицата на уравненията, чийто колони ще се използват за изчисляване на общата моларна маса на веществото

                Algebra algebra      = new Algebra();
                int[]   coefficients = algebra.CalcSolution(matrix);                                                                    // Изчислените коефициенти

                if (coefficients != null)
                {
                    string balancedReaction = balance.MergeCoefficientsAndMolecules(coefficients, molecules, leftPartMoleculesCount);   // Изравнената реакция

                    rtbReaction.Clear();                                                                                                // Предварително текстовата кутия се изичства
                    format.ShowBalancedReaction(balancedReaction, rtbReaction);                                                         // и в нея се показва форматиранта изравнена реакция

                    tlpStoichiometry.Controls.Clear();                                                                                  // Изчистват се всички контроли от таблицата под изравнената реакция
                    tlpStoichiometry.RowStyles.Clear();                                                                                 // също и добавените редове
                    tlpStoichiometry.RowCount = 1;                                                                                      // Установява се началната стойност за броя редове на таблицата
                    CreateHeaderRow();
                    lbInfo.Visible = false;
                    FillTableLayoutPanel(elements, molecules, matrix, coefficients);                                                    // Таблицата се попълва за новата реакция
                }
                else
                {
                    MessageBox.Show("Реакцията не може да бъде еднозначно изравнена!", "ХимЛаб", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
        }