Не вызывается метод из другого класса

392
31 декабря 2016, 13:27

Не могу понять в чем ошибка. Есть форма UIForm и класс WGen в UIForm вызываю WGen(в конце метода TwiceUsedWord):

        private void TwiceUsedWord()
    {
        if (VocIsChoosen())
        {
            try
            {
                var reader = new StreamReader(
                    choosenVocFilePath,Encoding.UTF8);
                while (!reader.EndOfStream)
                {
                    string line = reader.ReadLine();
                    if (line.Contains(txtbox_input.Text+" "))
                    {
                        switch (ErrorAndPropositionMbox(1))
                        {
                            case 1:
                                break;
                            case 2:
                                AddNewDefinition();
                                break;
                        }
                        return;
                    }
                }
                reader.Close();
            }
            catch (Exception badCase)
            {
                MessageBox.Show(badCase.Message,"Ошибка",
                    MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
            }
        }
        if (rtxtbox_output.Text.Contains(txtbox_input.Text))
        {
            ErrorAndPropositionMbox(1);
            return;
        }
        WGen wg = new WGen();
        wg.Main();
    }

Но тело метода Main класса WGen не срабатывает:

using System;
using System.Windows.Forms;
namespace WordsGenerator
{
public class WGen
{
    UIForm uiform = new UIForm();
    Random rGen = new Random();
    string[] consChars = {
       "b", "r", "d", "g", "v", "dzj", "f", "sj", "t", "m", "z", "h", "s", "k", "l", "tsj", "z", "x", "n", "q", "rr", "zj", "j"};
    string[] vowChars =
    {
       "a", "o", "i", "e", "u"
    };
    string[] possibleUnits =
    {
        "br", "db", "dg", "dv", "dzjr", "fr", "fsj", "ft", "gm", "gz",          "hdzj", "hr", "hs", "kh", "kt", "lb", "lk", "ll", "lr",
        "ltsj", "lz", "lx", "mb", "md", "mdzj", "mk", "mt", "mx", "nd", "ndzj", "ng", "nh", "nm", "nsj", "nx", "qt", "rb",
        "rd", "rrd", "rdzj", "rf", "rg", "rh", "rk", "rn", "rg", "rv", "rz", "rrz", "sjb", "sk", "sjk", "sjm", "sjn", "sjq",
        "sr", "st", "sjt", "tb", "tm", "vh", "vn", "vr", "vx", "zb", "zk", "zm", "zjd", "xb", "xr", "xsj", "xt"
    };
    string[] possibleConsUnitEnds =
    {
        "st", "nd", "ft", "zd", "xt", "sjt", "md", "mx", "rd", "rrd", "rz", "rrz", "zb"
    };

    string SylStructRandom(bool cbb4thItemIsChecked)
    {
        string sylStructure = "";
        int i = rGen.Next(1,6);//условный номер структуры слога
        if (cbb4thItemIsChecked) return sylStructure = "cv";
        switch (i)
        {
            case 1:
                sylStructure = "cvc";
                break;
            case 2:
                sylStructure = "cvcc";
                break;
            case 3:
                sylStructure = "vcc";
                break;
            case 4:
                sylStructure = "vc";
                break;
            case 5:
                sylStructure = "cv";
                break;
        }
        return sylStructure;
    }
    string VowelRandom()
    {
        int rate = rGen.Next(0,100);
        string vowel = "";
        if (0 >= rate && rate <= 24) vowel = vowChars[0];
        else if (25 >= rate && rate <= 48) vowel = vowChars[1];
        else if (49 >= rate && rate <= 72) vowel = vowChars[2];
        else if (73 >= rate && rate <= 91) vowel = vowChars[3];
        else vowel = vowChars[4];
        return vowel;
    }
    string ConsRandom()
    {
        string cons = "";
        int p = rGen.Next(0,consChars.Length);
        cons = consChars[p];
        return cons;
    }
    string PossibleUnitsRandom()
    {
        string pu = "";
        int p = rGen.Next(0,possibleUnits.Length);
        pu = possibleUnits[p];
        return pu;
    }
    string PossibleConsUnitEndsRandom()
    {
        string pcue = "";
        int p = rGen.Next(0,possibleConsUnitEnds.Length);
        pcue = possibleConsUnitEnds[p];
        return pcue;
    }
    string DeleteThirdCons(string sylStructure)
    {
        int index;
        if ((index = sylStructure.IndexOf("ccc")) != -1)
        {
            string front = sylStructure.Substring(0,index + 1);
            string back = sylStructure.Substring(index + 2);
            sylStructure = front + back;
        }
        return sylStructure;
    }
    string ConvertSylStructToWordStr(string sylStructure)
    {
        string wordStr = "";
        string consUnitEnd = "";
        int sylLength = sylStructure.Length;
        int changedSylLength = 0;
        if (sylLength>2&&sylStructure.Substring(sylLength - 2).Equals("cc"))
        {
            consUnitEnd += PossibleConsUnitEndsRandom();
            changedSylLength = sylLength - 2;
        }
        else changedSylLength = sylLength;
        for (int i = 0; i < changedSylLength; i++)
        {
            if (i < changedSylLength - 1 && sylStructure.Substring(i,2).Equals("cc"))
            {
                wordStr += PossibleUnitsRandom();
                i++;
            }
            else
            {
                if (sylStructure.Substring(i,1).Equals("c"))
                    wordStr += ConsRandom();
                else if (sylStructure.Substring(i,1).Equals("v"))
                    wordStr += VowelRandom();
                else if (sylStructure.Substring(i,1).Equals("j"))
                    wordStr += "j";
            }
        }
        wordStr += consUnitEnd;
        return wordStr;
    }
    int DefineFullMeaningWordsSylAmount()
    {
        int rate = 0;
        int index = rGen.Next(1,101);
        if (1 >= index && index <= 90)
            rate = 1;
        else rate = 2;
        return rate;
    }
    public void Main()
    {
        string sylStructure = "";
        string wordStr = null;
        string wordType = null;
        if (uiform.cbb_grammarType.SelectedIndex == 3)
        {
            sylStructure = SylStructRandom(true);
        }
        else if (uiform.cbb_grammarType.SelectedIndex == 0 ||
            uiform.cbb_grammarType.SelectedIndex == 1 ||
            uiform.cbb_grammarType.SelectedIndex == 2)
        {
            sylStructure = SylStructRandom(false);
            if (sylStructure == "cv")
            {
                int p = rGen.Next(1,4);//шанс 1 из 3, что согласная будет j
                if (p == 1) sylStructure += "jv";
            }
            else
            {
                if (DefineFullMeaningWordsSylAmount() == 1) return;
                else sylStructure += SylStructRandom(false);
            }
        }
        sylStructure = DeleteThirdCons(sylStructure);
        wordStr = ConvertSylStructToWordStr(sylStructure);
        switch (uiform.cbb_grammarType.SelectedIndex)
        {
            case 0:
                wordType = "n";
                break;
            case 1:
                wordType = "v";
                break;
            case 2:
                wordType = "a";
                break;
            case 3:
                wordType = "p";
                break;
        }
        if (!string.IsNullOrEmpty(uiform.txtbox_comment.Text))
            uiform.txtbox_comment.Text = " (" + uiform.txtbox_comment.Text + ")";
        uiform.rtxtbox_output.Text += uiform.txtbox_input.Text + " " + wordStr + " " + wordType
            + uiform.txtbox_comment.Text + "\r\n";
        uiform.txtbox_input.Clear();
        uiform.txtbox_comment.Clear();
        uiform.txtbox_input.Focus();
        MessageBox.Show("Ok");
    }
}
}

MessageBox в конце срабатывает, значит метод вызывается. Код работал отлично когда был на форме UIForm. Решил перенести все, что касается генератора слов в отдельный класс и тут этот трабл. Что я пропустил?

Answer 1

Нужно передать генератору ссылку на форму, а не создавать новый пустой экземпляр формы внутри WGen:

public class WGen
{
  UIForm uiform;
  ...
  public WGen(UIForm aUIForm)
  {
    uiform = aUIForm;
  }
}
WGen wg = new WGen(this);
wg.Main();

Правильнее, конечно, было бы сделать тип (класс) содержащий нужные данные и подавать этот контейнер данных в WGen, чтобы последний ничего не знал о форме и не лазил в ее контролы. В этом классе также дожны быть свойства для передачи наружу результата генерации, который форма сама поместит куда надо.

Надеюсь, Вы так и сделаете на следующей стадии улучшении Вашего кода.

READ ALSO
Методы с одинаковыми сигнатурами в C#

Методы с одинаковыми сигнатурами в C#

Предположим, есть такой класс

418
NPOI некорректная запись символа

NPOI некорректная запись символа

Доброй ночи! Записываю в файл xls с помощью NPOI строку

383
Чтение бинарного файла с нужной позиции (C#)

Чтение бинарного файла с нужной позиции (C#)

Помогите, пожалуйста, разобраться, как в C# прочитать данные с нужной позиции? Есть код, написанный на С++ Builder с использованием WinAPI:

458
pjax переход по прямым ссылкам

pjax переход по прямым ссылкам

Есть сайт, на котором используется pjax (pushState + ajax)Страницы подгружаются через ajax и меняется адрес

421