每当我的函数试图在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();
}
}
给你们!:)
好了,这就是我想出来的。我必须做一些假设,因为在阅读你的代码时,有些东西没有意义。我注意到了。
编辑:请记住,我实际上并没有测试这段代码,因为我没有创建Timer1
对象。如果有的话,你只需要做最小的修改。
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
函数接受您之前使用的相同整数,将其写入相同的文件,然后返回您可以在任何地方/无论如何都可以自由使用的Image
。ReadAchievements()
方法将为您提供文件中所有成就的完整列表。
我知道这有点过头了,但希望这对你有帮助。你知道吗?现在是午餐时间。