-1

インデックスが範囲外でした。負ではなく、コレクションのサイズよりも小さい必要があります。パラメータ名:インデックス

私はクラスWireObjectAnimationを持っています:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using DannyGeneral;

namespace AnimationEditor
{
    class WireObjectAnimation
    {
        private List<WireObjectCoordinates> wocl = new List<WireObjectCoordinates>();

        private WireObject wo1 = null;

        string name;
        int ndx;
        public WireObjectAnimation(string name,WireObject wo)
        {

            this.name = name;

            wo1 = wo;

            WireObjectCoordinates woc;
            woc = new WireObjectCoordinates(wo.woc);
            wocl.Add(woc);
            ndx = 0;

        }





        public void Save(string path , string fileName , PictureBox pb) 
        {
            int framesNumberX = 0;
            int framesNumberY = 0;
            string fn;
            string t = Path.GetFileNameWithoutExtension(this.name);
            if (File.Exists(path + "\\" + "DATABASE" + "\\" + fileName + "\\" + t + ".txt"))
            {
                try
                {
                    string f = Path.Combine(path + "\\" + "DATABASE" + "\\" + t + "\\" + fileName);
                    File.Delete(f);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error: Could not delete file from disk. Original error: " + ex.Message);
                }


                fn = path + "\\" + "DATABASE" + "\\" + t + "\\" + fileName;
            }
            else
            {
                fn = path + "\\" + "DATABASE" + "\\" + fileName + "\\" + this.name + ".txt";
            }
            OptionsFile setting_file = new OptionsFile(fn);
            setting_file.SetKey("File Name", fn);
            setting_file.SetKey("Object Name", fileName);
            setting_file.SetKey("Animation Name", this.name);
            setting_file.SetKey("picturebox.Width", pb.Width.ToString());
            setting_file.SetKey("picturebox.Height", pb.Height.ToString());

            string[] xFrames = new string[wocl.Count];
            string[] yFrames = new string[wocl.Count];

            string X="";
            string Y="";
            for (int i = 0; i < wocl.Count; i++)
            {
                X  = string.Format("Frame_X_{0} ", i + 1);
                Y  = string.Format("Frame_Y_{0} ", i + 1);
                framesNumberX ++;
                framesNumberY ++;
                for (int j = 0; j < wocl[i].Point_X.Count; j++)
                {
                    xFrames[i] += string.Format("{0},", wocl[i].Point_X[j]);
                    yFrames[i] += string.Format("{0},", wocl[i].Point_Y[j]);


                }

                string tt = xFrames[i].Trim(",".ToCharArray());
                string yy =  yFrames[i].Trim(",".ToCharArray());



                 setting_file.SetKey(X, tt);
                 setting_file.SetKey(Y, yy);

            }

            int resultX = framesNumberX / 2;
            int resultY = framesNumberY / 2;
            setting_file.SetKey("Number Of Frames X", resultX.ToString()); 
            setting_file.SetKey("Number Of Frames Y", resultY.ToString());







        }


        public void Load(string path,string fileName)
        {
            int numberofframesX = 0;
            int numberofframesY = 0;
            string framesX = "";
            string framesY = "";
            string X = "";
            string Y = "";
            string t = path + "\\" + fileName;
            OptionsFile setting_file = new OptionsFile(t);
            string XX = setting_file.GetKey("Number Of Frames X");
            string YY = setting_file.GetKey("Number Of Frames Y");
            numberofframesX = Convert.ToInt32(XX);
            numberofframesY = Convert.ToInt32(YY);


            for (int i = 1; i < numberofframesX ; i++)
            {
            X  = string.Format("Frame_X_{0} ", i);
            framesX = setting_file.GetKey(X);
            List<string> floatStrings = new List<string>(framesX.Split(new char[] { ',' }));
            List<float> test = floatStrings.Select(tempStr => (float)Convert.ToDouble(tempStr)).ToList(); 


                wo1.woc.Point_X = test;  

            }
            for (int i = 1; i < numberofframesY; i++)
            {
                Y = string.Format("Frame_Y_{0} ", i);
                framesY = setting_file.GetKey(Y);
                List<string> floatStrings = new List<string>(framesY.Split(new char[] { ',' }));
                List<float> test = floatStrings.Select(tempStr => (float)Convert.ToDouble(tempStr)).ToList();
                wo1.woc.Point_Y = test;
            }
        }


        public void SetFrame(int frameNumber, WireObjectCoordinates woc)
        {
            wocl[frameNumber].Set(woc);
        }

        public WireObjectCoordinates GetFrame(int frameNumber)
        {
            if (frameNumber > wocl.Count)
            {
                throw new Exception("not allowed!");
            }

            if (frameNumber == wocl.Count)
            {
                WireObjectCoordinates woc;
                woc = new WireObjectCoordinates(wocl[wocl.Count - 1]); 

                wocl.Add(woc);
                return woc;
            }
            else
            {

                return wocl[frameNumber];
            }


        }
    }
}

ロード関数のロードを実行しているときに、ロードが適切であることがわかります。しかし、trackBarバーを右にスクロールしようとすると、例外が発生します。これで、thisl ine:wo1.woc.Point_X = test; wocには4つのインデックスがあり、各インデックスでPoint_XとPoint_Yは各インデックスの数字で埋められます。

このクラスには、関数SetFrameとGetFrameがあり、trackBarのForm1スクロールイベントでGetFrameを使用しています。

private void trackBar1_Scroll(object sender, EventArgs e)
        {

            currentFrameIndex = trackBar1.Value;
            textBox1.Text = "Frame Number : " + trackBar1.Value;
            wireObject1.woc.Set(wireObjectAnimation1.GetFrame(currentFrameIndex)); 
            LoadPictureAt(trackBar1.Value, sender);

            button1.Enabled = false;
            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            button8.Enabled = false;
            SaveFormPicutreBoxToBitMapIncludingDrawings();

            return;









        }

これで、trackBarを右に一度移動すると、WireObjectCoordinatesクラスに移動して例外をスローする代わりに、Point_XとPoint_Yから次の数値のセットをペイントする必要があります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AnimationEditor
{
    class WireObjectCoordinates
    {
        public List<float> Point_X = new List<float>();
        public List<float> Point_Y = new List<float>();

        public WireObjectCoordinates()
        {
        }

        public WireObjectCoordinates(WireObjectCoordinates w)
        {
            Point_X.AddRange(w.Point_X);
            Point_Y.AddRange(w.Point_Y);
        }

        public void Set(WireObjectCoordinates w)
        {
            for (int i = 0; i < Point_X.Count; i++)
            {
                Point_X[i] = w.Point_X[i];
                Point_Y[i] = w.Point_Y[i];
            }
        }
    }
}

例外は次の行にあります:Point_X [i] = w.Point_X [i]; Point_X [i]には[0]から[3]までの4つのインデックスが含まれ、各インデックスには332.0 333.0 334.0335.0のような番号が含まれます。w.Point_X[i]には1つのインデックス[0]のみが含まれ、このインデックスの番号は332.0になります。

なぜ例外がこの行にあるのか理解できません。

アイデアは、trackBarを右に移動すると、wo1.woc.Point_Yとwo1.woc.Point_Xから次の座標を描画する必要があるということですが、Load関数で何か間違ったことをしたと思いますか?なぜ例外がスローされるのか、trackBarを一度右に移動したときにのみ発生するのかわかりません。

4

2 に答える 2

0

試してみると、技術的には問題は解決しませんが、クラッシュすることはなく、エラーを読み直すだけです。

于 2012-07-19T21:16:12.277 に答える
0

forループがどのように機能すると思いますか?ループ変数iは、からこのインスタンスのリストの0カウントになります。Point_Xただし、他のインスタンスwPoint_X少ないカウントのリストがある場合、またはのPoint_YリストthisまたはPoint_Yリストにある場合、w失敗します。

それがであり、のみであることに気付いたPoint_X.Count場合4w.Point_X.Count1超えるi0、式w.Point_X[i]は存在しないリストの要素を読み取ろうとします。それは「インデックスが範囲外でした」という例外を投げます。

しかし、多分あなたはそれを理解していますか?

于 2012-07-19T21:28:54.580 に答える