Загрузка...

Проблема с Message Box

Тема в разделе C# создана пользователем titwolf 20 фев 2023. 232 просмотра

Загрузка...
  1. titwolf
    titwolf Автор темы 20 фев 2023 Не надо, дядя... 52 6 фев 2021
    Всем привет, пишу курсач.
    Тема - компьютерная игра в жанре текстовый квест.
    За основу взял старый проект, который писал когда-то в начале учебы. Он на windows forms написан.
    Суть игры - текстовый аналог игры Pc building simulator.
    В игре есть игровые дни, в каждый из дней, и списка подгружаются и динамически создаются кнопки с заданием. При клике на кнопку вызывается месседж бокс, где описано задание, плата и так далее.

    Суть проблемы в том, что при нажатии на кнопку задания именно в первый день, случается баг.
    Месседж бокс, показывается два раза, следовательно если два раза его принять, статы прибавятся в два раза.

    Во все остальные игровые дни, бага такого нет. Месседж бокс появляется два раза, только в первый день.

    CSHARP
    private void LoadAnswers(List<string[]> mes, List<string[]> ans, int num)

    {



    cost = Convert.ToInt32(mes[num][3]);

    DialogResult result = MessageBox.Show(mes[num][1] + "\n О работе:" + "\n Плата: " + mes[num][3]+ "\n Требуется времени: " + mes[num][4] + "\n Принять задание?",

    mes[num][2],

    MessageBoxButtons.YesNo,

    MessageBoxIcon.Information);



    if (result == DialogResult.Yes)

    {

    if(Convert.ToInt32(mes[num][4]) > timeElapse) //Если не достаточно времени, то задание будет не возможно взять.

    {

    MessageBox.Show("Недостаточно времени...");

    yv_endDay.Image = PcBuild.Properties.Resources.pic_yved;

    yv_mail.Image = null;

    return;

    }

    this.view1.Controls["v1b" + numButton].Enabled = false;

    timeElapse -= Convert.ToInt32(mes[numButton][4]);

    lab_time.Text = timeElapse.ToString();

    x = 2; y = 2;

    for (int i = 0; i < ans.Count; i++)

    {

    this.view2.Controls.Add(new Button { Name = "v2b" + i, Location = new Point(x, y), Size = new Size(700, 51), Text = ans[0], BackColor = Color.White, FlatStyle = FlatStyle.Flat, Font = new Font("Arial", 8)});

    y += 70;

    this.view2.Controls["v2b" + i].Click += new EventHandler(this.ans_Click);

    }

    }

    }


    CSHARP
    private void task_Click(object sender, EventArgs e)

    {

    actB = (sender as Button);

    //this.Focus();

    //actB.Dispose();

    switch ((sender as Button).Name.ToString())

    {

    case "v1b0":

    numButton = 0;

    CheckRightAnswer(ans0);

    LoadAnswers(mes, ans0, numButton);

    break;

    case "v1b1":

    numButton = 1;

    CheckRightAnswer(ans1);

    LoadAnswers(mes, ans1, numButton);

    break;

    case "v1b2":

    numButton = 2;

    CheckRightAnswer(ans2);

    LoadAnswers(mes, ans2, numButton);

    break;

    case "v1b3":

    numButton = 3;

    CheckRightAnswer(ans3);

    LoadAnswers(mes, ans3, numButton);

    break;

    }

    }
     
    20 фев 2023 Изменено
  2. vtlstolyarov
    vtlstolyarov 20 фев 2023 474 8 янв 2022
    покажи тело ans_Click
     
  3. Kloun228_inactive3478611
    через отладчик смотрел?[IMG]
     
    1. titwolf Автор темы
      Kloun228_inactive3478611, да, там нет ничего, все идет как нужно, по коду. Но месседж все равно показывает два раза.
  4. titwolf
    titwolf Автор темы 21 фев 2023 Не надо, дядя... 52 6 фев 2021
    vtlstolyarov,
    CSHARP
    private void ans_Click(object sender, EventArgs e)
    {
    string otv = (sender as Button).Name.ToString();
    otv = otv.Substring(3, otv.Length - 3);
    int numOtv = Convert.ToInt32(otv);
    if(numOtv == rightAns)
    {
    cash += cost; lab_money.Text = cash.ToString();
    reputation += 10; lab_rep.Text = reputation.ToString();
    SoundPlayer sp = new SoundPlayer(Application.StartupPath + @"\sounds\pravilno.wav");
    sp.Play();
    pic_vyp.Image = PcBuild.Properties.Resources.galochka;
    lab_vyp.Visible = true; //djsdgffsjfhdghsgfhjasdgfhjdghfjsahasfjgjhffgsadjfhsdjfgsdhjfgf
    lab_vyp.Text = "Выполнено!";
    view2.Controls.Clear();
    timer1.Start();
    }
    else
    {
    reputation -= 10; lab_rep.Text = reputation.ToString();
    SoundPlayer sp = new SoundPlayer(Application.StartupPath + @"\sounds\oshibka.wav");
    sp.Play();
    pic_vyp.Image = PcBuild.Properties.Resources.error;
    lab_vyp.Visible = true;
    lab_vyp.Text = "Ошибка!";
    view2.Controls.Clear();
    timer1.Start();
    }
    MeessageExist();

    }
     
    1. Посмотреть предыдущие комментарии (4)
    2. titwolf Автор темы
      vtlstolyarov, И еще такой вопрос.
      Можно ли как-то заставить форму, при открытии диалогового окна, не уходить на задний план?
      Просто к примеру, если менять игровой день на другой посредством pic_endDay_Click, появляется диалоговое окно. При его появлении, вся форма уходит назад, и все открытые приложения, становятся поверх этой формы. Даже нижняя панель Windows.
    3. vtlstolyarov
      titwolf, Да - отрисовываются 2 конпки, но, нет - приложение не думает что ты наживаешь 2 кнопки, просто когда ты таким образом подвешиваешь событие на кнопку, вместо новой кнопки событие снова добавляется к той что там уже была (потому что у них одинаковое имя и берётся первая из этих двух)
      CSHARP
      this.view1.Controls.Add(new Button { Name = "v1b" + i, Location = new Point(x, y), Size = new Size(210, 44), Text = mes[i][0], BackColor = Color.White, FlatStyle = FlatStyle.Flat });
      this.view1.Controls["v1b" + i].Click += new EventHandler(this.task_Click);
      если ты не будешь использовать поиск контрола по имени то оно тоже будет работать как ожидается (даже без очистки контролов):
      CSHARP
      var button = new Button { Name = "v1b" + i, Location = new Point(x, y), Size = new Size(210, 44), Text = mes[i][0], BackColor = Color.White, FlatStyle = FlatStyle.Flat };
      button.Click += new EventHandler(this.task_Click);
      this.view1.Controls.Add(button);
      Про диалоговое окно и задний план не в курсе - я сто лет уже как не работал с WinForms и не помню таких деталей.
    4. titwolf Автор темы
      vtlstolyarov, ладно, спасибо большое и за это. Я просто было уже хотел переносить проект на wpf, ибо думал что дело в формах.
      А так в планах, к диплому проект перенести в Юнити, и до ума доводить.
      В общем, спасибо большое тебе.
Top