Столкнулся с циклом в if!
Программирую обычный кликер на WinForms. Проблема обширная!
Хотел сделать два режима Advanced/Default и сохранять их. Создал и сохранял в параметрах переменные.
В "Mode" я мог бы присвоить тип bool, если у меня только два режима, но это сути дела не меняет! (поменяю потом)
У меня метод, который вызывает новую форму, так называемую "FormAdvanced" и скрывает прошлую форму.
void formAdvancedOpen()
{
if (Properties.Settings.Default.Mode == "Advanced")
{
FormAdvanced formAdvanced = new FormAdvanced();
if (formAdvanced != null)
{
timer.Stop();
Hide();
formAdvanced.Show();
}
}
}
Проблема такая, что после проверки условия if (Properties.Settings.Default.Mode == "Advanced") компилятор переходит на другую строчку, где создаётся форма и она возвращается снова к проверке условия, как будто, тут цикл For или While.
Тут тяжело понять, тут надо видеть!
Как видно дальше этого места код никуда не идёт.
Если с заходом дебажить, то сперва обращается к private System.ComponentModel.IContainer components = null; в FormAdvanced.Designer.cs

Потом переходит в код формы FormAdvanced
До инициализации не доходит. И на повторный круг.
Из-за этого цикла, он создаёт кучу экземпляров формы, которых не видно! Я это понял благодаря трею (notifyicons). Вот скрин:
Часть кода:
Главная форма | Default
namespace Clicker
{
public partial class MainForm : Form
{
[DllImport("user32.dll")]
static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);
public MainForm()
{
TopMost = true;
InitializeComponent();
formAdvancedOpen();
... ... ... ... ... ...
Форма Advanced
namespace Clicker
{
public partial class FormAdvanced : Clicker.MainForm
{
[DllImport("user32.dll", SetLastError = true)]
public static extern bool SetCursorPos(int X, int Y);
private IKeyboardMouseEvents m_Events;
public FormAdvanced()
{
InitializeComponent();
}
... ... ... ... ... ...
Как видно ничего криминального! Не знаю, что делать! Возможно ли мне тут помочь?!
Если убрать вызов метода в начале главный формы, то всё почти отлично! Могу вызвать его без этого бреда выше, только внутри чего-то.
advancedToolStripMenuItem.Click += (s, a) => {
Properties.Settings.Default.Mode = "Advanced";
Properties.Settings.Default.Save();
formAdvancedOpen();
};
Тут работает всё адекватно!
Могу выложить в GitHub и указать ссылку, если кому интересно! Хотелось бы решить проблему конечно!
Заранее всем спасибо за помощь!
Ответы (1 шт):
Моя ошибка. Я унаследовал одну форму к другой class FormAdvanced : Clicker.MainForm Вот и получается для создания FormAdvanced инициализируется MainForm, которая в своем конструкторе создает новый FormAdvanced, а тот опять MainForm, и так по кругу!
Большое спасибо, EvgeniyZ!




