每当我的函数试图在Form构造函数中执行时,它就循环到前面的语句

本文关键字:循环 语句 前面 执行 函数 我的 构造函数 Form | 更新日期: 2023-09-27 17:50:51

我是c#的新手,我正在开发一个表单应用程序…这有点像游戏。每当构造函数执行该函数时,它只会导致构造函数再次运行!下面是构造函数:

 public Form1()
    {
        InitializeComponent();
        MessageBox.Show("You get 1 cookie for logging in!");
        setScore();
        score = Convert.ToInt32(setScr) + 1;
        label2.Text = score.ToString();
        setProgressBar(CheckMP());
        timer1.Interval = 1500;
        timer1.Start();
        readAndSetAchievements(); // THIS IS THE FUNCTION THAT 
                                  //CAUSES THE CONSTRUCTOR TO LOOP!!!
    }

函数如下:

        public void readAndSetAchievements()
    {
        Achievements ach1 = new Achievements(); // ACHIEVEMENTS IS ANOTHER FORM THAT I       
                                                // AM CREATING AN INSTANCE OF BECAUSE I
                                                // WANT TO USE VARIABLES AND FUNCTIONS 
                                                // FROM IT 
        using (StreamReader ar = new StreamReader("achievements.txt"))
        {
            achCheckStr[0] = ar.ReadLine();
            achCheckStr[1] = ar.ReadLine();
            if (achCheckStr[0] == ach1.ach1_StillBurning)
            {
                ach1.setAchievements(1);
            }
            else if (achCheckStr[1] == ach1.ach2_Faster)
            {
                ach1.setAchievements(2);
            }
        }
    }

请帮帮我…告诉我我错在哪里(我认为这是我试图使用成就形式类的方式,但我不知道如何做到这一点)…提前感谢!:)

这是整个成就表单类:

public partial class Achievements : Form
{
    Form1 cha = new Form1();
    public string ach1_StillBurning = "ach1_StillBurning.jpg";
    public string ach2_Faster = "ach2_Faster.jpg";
    public Achievements()
    {
        InitializeComponent();
    }
    public void setAchievements(int a)
    {
        using (StreamWriter aw = new StreamWriter("achievements.txt"))
        {
            switch (a)
            { 
                case 1:
                    aw.WriteLine(ach1_StillBurning);
                    pictureBox1.Image = Image.FromFile(ach1_StillBurning);
                    break;
                case 2:
                    aw.WriteLine(ach2_Faster);
                    pictureBox1.Image = Image.FromFile(ach2_Faster);
                    break;
            }
        }
    } 
    private void Achievements_Load(object sender, EventArgs e)
    {
        cha.readAndSetAchievements();
    }
}

给你们!:)

每当我的函数试图在Form构造函数中执行时,它就循环到前面的语句

好了,这就是我想出来的。我必须做一些假设,因为在阅读你的代码时,有些东西没有意义。我注意到了。

编辑:请记住,我实际上并没有测试这段代码,因为我没有创建Timer1对象。如果有的话,你只需要做最小的修改。

下面是Form1的代码:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        MessageBox.Show("You get 1 cookie for logging in!");
        setScore();
        score = Convert.ToInt32(setScr) + 1;
        label2.Text = score.ToString();
        setProgressBar(CheckMP());
        timer1.Interval = 1500;
        timer1.Start();
        //Assuming this is the first use of the Achievements object.
        Achievements.AchievementsFile = "achievements.txt";
    }

}

在一个单独的文件中,这是成就表单。

    private partial class AchievementsForm : Form
    {
        public AchievementsForm()
        {
            InitializeComponent();
        }
        private void Achievements_Load(object sender, EventArgs e)
        {
            IEnumerable<string> allAchievements = Achievements.ReadAchievements();
            //Do stuff with the achievements
        }
    }

在另一个单独的文件中,这是新的成就类。这就是我所说的将功能从表单中分离出来的意思。

public static class Achievements
    {
        private static string _stillBurning = "ach1_StillBurning.jpg";
        private static string _faster = "ach2_Faster.jpg";
        public static string AchievementsFile { get; set; }
        public static Image SetAchievementFromAchievementCode(int a)
        {
            Image answer;
            using (StreamWriter aw = new StreamWriter(Achievements.AchievementsFile))
            {
                switch (a)
                {
                    case 1:
                        aw.WriteLine(_stillBurning);
                        answer = Image.FromFile(ach1_StillBurning);
                        break;
                    case 2:
                        aw.WriteLine(_faster);
                        answer = Image.FromFile(ach2_Faster);
                        break;
                }
            }
            return answer;
        }
        public static IEnumerable<string> ReadAchievements()
        {
            List<string> answer = new List<string>();
            using (StreamReader ar = new StreamReader(Achievements.AchievementsFile))
            {
                while (!ar.EndOfStream)
                    answer.Add(ar.ReadLine());                    
            }
            return answer;
        }
    }

我注意到当阅读你的代码时,你基本上有这个逻辑(或类似的)

调用函数读取和设置成就,其中调用函数读取成就,然后循环调用相同的函数一次。

我已经分成了Read和Set。SetAchievementFromAchievementCode函数接受您之前使用的相同整数,将其写入相同的文件,然后返回您可以在任何地方/无论如何都可以自由使用的ImageReadAchievements()方法将为您提供文件中所有成就的完整列表。

我知道这有点过头了,但希望这对你有帮助。你知道吗?现在是午餐时间。