Загрузка...

Проблема с Message Box

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

  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 468 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. Посмотреть предыдущие комментарии (3)
    2. titwolf Автор темы
      vtlstolyarov, поправь если не так понял.
      При событии двойного клика, контролы не очищаются. Это способствует двойной отрисовке кнопки вопроса? Тем самым, приложение думает что я проживаю две кнопки и вызывает месседж два раза?
      Про postcreator я более менее понял. Перед фором очищение панели поставить, что бы не пихать везде это.
    3. titwolf Автор темы
      vtlstolyarov, И еще такой вопрос.
      Можно ли как-то заставить форму, при открытии диалогового окна, не уходить на задний план?
      Просто к примеру, если менять игровой день на другой посредством pic_endDay_Click, появляется диалоговое окно. При его появлении, вся форма уходит назад, и все открытые приложения, становятся поверх этой формы. Даже нижняя панель Windows.
    4. 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 и не помню таких деталей.
    5. Посмотреть следующие комментарии (1)
Загрузка...
Top