1

ProgressForm クラス:

public partial class ProgressForm : Form
    {
        public int prc = 0, sz;
        MainForm mf;

        public ProgressForm(MainForm MF)
        {
            InitializeComponent();
            mf = MF;
            sz = 0;
        }

        public ProgressForm(int mx)
        {
            InitializeComponent();
            sz = mx;
        }

        public void SetMax(int mx)
        {
            sz = mx;
        }

        public void StartProgress()
        {
            timer1.Enabled = true;
        }

        public void IncProgress(int prg)
        {
            prc += prg;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            double pos = (double)prc / (double)sz * 100;
            progressBar.Value = (int)pos;
        }

        private void ProgressForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            timer1.Enabled = false;
        }

        private void cancelBtn_Click(object sender, EventArgs e)
        {
            mf.isCanceled = true;
            this.Close();
        }

        private void ProgressForm_Shown(object sender, EventArgs e)
        {
            progressBar.Value = 0;
            StartProgress();
        }

    }

メインフォーム クラス:

void DeleteFiles()
            {
                int x = 0;
                int cnt = resultList.Count;
                isCanceled = false;

                DeleteThreadHandler("beginprogress");
                try
                {
                    DeleteThreadHandler("begindelete");
                    for (int j = 0; j < cnt; j++)
                    {
                        if (resultList[x].isChecked)
                        {
                            DeleteThreadHandler("progress");
                            DeleteFile(resultList[x].name, deleteForm.isDeletePermanently);
                            if (File.Exists(resultList[x].name))
                            {
                                DeleteErrorHandler(resultList[x].name);
                                isError = true;
                            }
                            else
                                resultList.RemoveAt(x);
                        }
                        else
                            ++x;

                        if (isCanceled)
                            break;
                    }
                }
                finally
                {
                    validity(true);
                    DeleteThreadHandler("enddelete");
                }
            }

            void DeleteErrorHandler(string val)
            {
                Action action = null;

                action = () =>
                {
                    errorReportForm.AddError(val);
                };

                this.BeginInvoke(action);
            }

            void DeleteThreadHandler(String title)
            {
                Action action = null;
                if (title == "beginprogress")
                {
                    action = () =>
                    {

                    };
                }
                else
                if (title == "begindelete")
                {
                    action = () =>
                    {
                        olvVirtual.BeginUpdate();
                    };
                }
                else
                    if (title == "enddelete")
                    {
                        action = () =>
                        {
                            olvVirtual.VirtualListSize = resultList.Count;
                            olvVirtual.EndUpdate();
                            RefreshStatus();
                            progressForm.Close();
                            if (isError)
                                errorReportForm.ShowDialog();
                        };
                    }
                if (title == "progress")
                {
                    action = () =>
                    {
                        progressForm.IncProgress(1);
                    };
                }

                this.BeginInvoke(action);
            }    


    private void DeleteBtn_Click(object sender, EventArgs e)
        {
            int checkedcount = GetCheckedCount();
            if (checkedcount == 0)
            {
                MessageBox.Show("Please mark at least a file first");
                return;
            }
            DialogResult dr = new DialogResult();
            if (deleteForm == null)
                deleteForm = new DeleteForm();
            dr = deleteForm.ShowDialog();
            if (dr == DialogResult.OK)
            {
                //if (progressForm == null)
                progressForm = new ProgressForm(this);
                progressForm.Text = "Deleting...";
                progressForm.SetMax(checkedcount);

                if (errorReportForm == null)
                    errorReportForm = new ErrorReportForm();
                errorReportForm.ClearMemo();
                isError = false;

                Thread t = new Thread(DeleteFiles);
                t.Start();
                progressForm.ShowDialog();
            }
        }

progressForm には、500 ミリ秒ごとに進行状況を更新するプログレス バーとタイマーがあります。問題は、まだメイン フォームにアクセスできることです。BeginInvoke も試しましたが、どちらも機能しません。

ありがとう

編集:この混乱の原因を見つけました。Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile を使用する DeleteFile です。アンマネージ コードに置き換えた後、正常に動作します。

4

2 に答える 2

1

試す

 progressForm.ShowDialog(this);  // assuming this is the main form
于 2011-05-25T04:47:53.070 に答える
0

これの原因を正確に言うのは難しいですが、少しデバッグすることで原因を発見する可能性が高くなります。

私は次のことを試みます。

  • DeleteFormでShowDialogを実行すると、これはDeleteFormのモーダルダイアログとして動作しますか、それともDeleteFormが表示されているときに基になるフォームをクリックできますか?そうでない場合は、ShowDialog(this)を実行したときに実行されますか?

  • progressForm.ShowDialog(this)を呼び出し、(1)DeleteFilesの先頭に、(2)行progressForm.IncProgress(1)にいくつかのブレークポイントを設定します。ブレークポイントに到達したら、イミディエイトウィンドウを使用してprogressForm.OwnerとprogressForm.Modalを確認します

また、現在のオブジェクトへの参照を何のために進行状況フォームに渡しますか?ProgressFormのコンストラクターに、これらの問題を引き起こす可能性のあるものはありますか?

MSDNのモーダルダイアログで注意すべきもう1つの点は、[閉じる]ボタンの使用です。以下はから来ています。 http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx

フォームがモーダルダイアログボックスとして表示されている場合、[閉じる]ボタン(フォームの右上隅にあるXの付いたボタン)をクリックすると、フォームが非表示になり、DialogResultプロパティがDialogResult.Cancelに設定されます。モードレスフォームとは異なり、ユーザーがダイアログボックスのフォームを閉じるボタンをクリックするか、DialogResultプロパティの値を設定するときに、.NETFrameworkによってCloseメソッドが呼び出されることはありません。代わりに、フォームは非表示になり、ダイアログボックスの新しいインスタンスを作成せずに再度表示できます。ダイアログボックスとして表示されるフォームは閉じられるのではなく非表示になるため、アプリケーションでフォームが不要になったときに、フォームのDisposeメソッドを呼び出す必要があります。

于 2011-05-25T06:47:47.243 に答える