Загрузка...

Problem with Message Box

Thread in C# created by titwolf Feb 20, 2023. 250 views

  1. titwolf
    titwolf Topic starter Feb 20, 2023 Не надо, дядя... 52 Feb 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;

    }

    }
     
  2. vtlstolyarov
    покажи тело ans_Click
     
  3. Kloun228_inactive3478611
    через отладчик смотрел?[IMG]
     
    1. titwolf Topic starter
      Kloun228_inactive3478611, да, там нет ничего, все идет как нужно, по коду. Но месседж все равно показывает два раза.
  4. titwolf
    titwolf Topic starter Feb 21, 2023 Не надо, дядя... 52 Feb 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. View previous comments (4)
    2. titwolf Topic starter
      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 Topic starter
      vtlstolyarov, ладно, спасибо большое и за это. Я просто было уже хотел переносить проект на wpf, ибо думал что дело в формах.
      А так в планах, к диплому проект перенести в Юнити, и до ума доводить.
      В общем, спасибо большое тебе.
Loading...
Top