Не могу понять в чем ошибка. Есть форма 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
. Решил перенести все, что касается генератора слов в отдельный класс и тут этот трабл. Что я пропустил?
Нужно передать генератору ссылку на форму, а не создавать новый пустой экземпляр формы внутри WGen
:
public class WGen
{
UIForm uiform;
...
public WGen(UIForm aUIForm)
{
uiform = aUIForm;
}
}
WGen wg = new WGen(this);
wg.Main();
Правильнее, конечно, было бы сделать тип (класс) содержащий нужные данные и подавать этот контейнер данных в WGen
, чтобы последний ничего не знал о форме и не лазил в ее контролы. В этом классе также дожны быть свойства для передачи наружу результата генерации, который форма сама поместит куда надо.
Надеюсь, Вы так и сделаете на следующей стадии улучшении Вашего кода.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Помогите, пожалуйста, разобраться, как в C# прочитать данные с нужной позиции? Есть код, написанный на С++ Builder с использованием WinAPI:
Есть сайт, на котором используется pjax (pushState + ajax)Страницы подгружаются через ajax и меняется адрес