Загрузка...

Problem with Message Box

Thread in C# created by titwolf Feb 20, 2023. 257 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 (2)
    2. vtlstolyarov
      titwolf, внутри
      pic_mail_DoubleClick
      ты забыл вызвать
      view1.Controls.Clear();


      Во избежание таких ситуаций я бы тебе рекомендовал очищать контролы в том же методе где ты их заполняешь (в
      PostCreator
      , прямо перед циклом который добавляет кнопки), тогда их не придётся не забывать очищать в куче мест откуда ты вызываешь заполнение.
    3. titwolf Topic starter
      vtlstolyarov, поправь если не так понял.
      При событии двойного клика, контролы не очищаются. Это способствует двойной отрисовке кнопки вопроса? Тем самым, приложение думает что я проживаю две кнопки и вызывает месседж два раза?
      Про postcreator я более менее понял. Перед фором очищение панели поставить, что бы не пихать везде это.
    4. titwolf Topic starter
      vtlstolyarov, И еще такой вопрос.
      Можно ли как-то заставить форму, при открытии диалогового окна, не уходить на задний план?
      Просто к примеру, если менять игровой день на другой посредством pic_endDay_Click, появляется диалоговое окно. При его появлении, вся форма уходит назад, и все открытые приложения, становятся поверх этой формы. Даже нижняя панель Windows.
    5. View the next comments (2)
Top
Loading...