我正在尝试构建一个类似临时的应用程序来模拟基于块的编程方法。我希望用户将命令添加到命令池(队列)并在用户单击“运行”按钮时按顺序运行它们。
我在互联网上进行了研究,发现行动清单可以排队。
//Global Variables
List<Int32> NumberOfSteps = new List<Int32>();
List<Int32> NumberOfDegrees = new List<Int32>();
List<Int32> GlideXPos = new List<Int32>();
List<Int32> GlideYPos = new List<Int32>();
List<String> SayList = new List<String>();
List<String> SoundList = new List<String>();
List<Action> queue = new List<Action>();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBox7_TextChanged(object sender, EventArgs e)
{
}
private static Bitmap RotateImageByAngle(Image oldBitmap, float angle)
{
var newBitmap = new Bitmap(oldBitmap.Width, oldBitmap.Height);
var graphics = Graphics.FromImage(newBitmap);
graphics.TranslateTransform((float)oldBitmap.Width / 2, (float)oldBitmap.Height / 2);
graphics.RotateTransform(angle);
graphics.TranslateTransform(-(float)oldBitmap.Width / 2, -(float)oldBitmap.Height / 2);
graphics.DrawImage(oldBitmap, new Point(0, 0));
return newBitmap;
}
private void button3_Click(object sender, EventArgs e)
{
pictureBox1.Image = RotateImageByAngle(pictureBox1.Image, 30);
}
private void button1_Click(object sender, EventArgs e)
{
queue.Add(() => { HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text)); });
}
private void HAREKETETTIR(int miktar)
{
deneme2 += miktar;
Point deneme = new Point(deneme2, 455);
pictureBox1.Location = deneme;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
private void btnRotate_Click(object sender, EventArgs e)
{
queue.Add(() => { HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text)); });
}
private void RUN_Click(object sender, EventArgs e)
{
foreach (Action item in queue)
{
item();
}
}
}
当我单击“运行”时,代码会创建一个错误,因为“输入字符串的格式不正确。”
我如何在这里解决问题?
由于
答案 0 :(得分:2)
您的问题不包含信息,程序的哪一部分会产生错误,但可能是Convert.ToInt32(txtNumberOfSteps.Text)。
错误的第一个原因可能是txtNumberOfSteps.Text不包含可转换为整数的文本,因此请确保用户只能输入有效的整数或提供适当的错误处理(例如,在排队操作之前检查txtNumberOfSteps.Text并显示用户一些错误消息)。
第二个原因更难以发现。如果您将Action添加到此队列
queue.Add(() => { HAREKETETTIR(Convert.ToInt32(txtNumberOfSteps.Text)); });
然后方法 Convert.ToInt32()会尝试将txtNumberOfSteps.Text的值转换为您运行操作时的值,而不是排队操作时的值。因此,例如,如果用户在txtNumberOfSteps.Text包含&#34; 2&#34;然后他将txtNumberOfSteps.Text更改为空字符串并在队列中运行操作,您将收到错误,因为空字符串不是有效整数。这可以通过在排除动作的瞬间创建包含txtNumberOfSteps.Text中的值副本的临时变量来轻松修复。
private void button1_Click(object sender, EventArgs e)
{
var text = txtNumberOfSteps.Text;
queue.Add(() => { HAREKETETTIR(Convert.ToInt32(text)); });
}
(同样的问题出在 btnRotate_Click()方法中。)
您可以更详细地了解此问题here。
答案 1 :(得分:0)
在我看来,你的错误是因为txtNumberOfSteps.Text实际上是一个无效的数字。您正在将操作正确添加到队列中,并在我看到的情况下正确运行它们。