Загрузка...

Проблема с Message Box

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

  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. Посмотреть предыдущие комментарии (1)
    2. titwolf Автор темы
      vtlstolyarov,
    3. vtlstolyarov
      titwolf, внутри
      pic_mail_DoubleClick
      ты забыл вызвать
      view1.Controls.Clear();


      Во избежание таких ситуаций я бы тебе рекомендовал очищать контролы в том же методе где ты их заполняешь (в
      PostCreator
      , прямо перед циклом который добавляет кнопки), тогда их не придётся не забывать очищать в куче мест откуда ты вызываешь заполнение.
    4. titwolf Автор темы
      vtlstolyarov, поправь если не так понял.
      При событии двойного клика, контролы не очищаются. Это способствует двойной отрисовке кнопки вопроса? Тем самым, приложение думает что я проживаю две кнопки и вызывает месседж два раза?
      Про postcreator я более менее понял. Перед фором очищение панели поставить, что бы не пихать везде это.
    5. Посмотреть следующие комментарии (3)
Top
Загрузка...