すらすらプログラマーへのお問い合わせ
すらすらのブログ
アクセス数  累計:000,604,222  昨日:000,000,253  本日:000,000,031
Loading
スレッド
.NET プログラミング
プロパティグリッド
印刷
リストボックス
スレッド
リストビュー
インストーラー
やってみよう!

できるVisual Studio 2015 Windows /Android/iOS アプリ対応

独習C# 第3版

VisualBasic2013パーフェクトマスター (Perfect Master SERIES)

プログラミング.NET Framework 第4版 (Microsoft Press)

VisualBasic2013逆引き大全555の極意

猫でもわかるWindowsプログラミング 第4版 (猫でもわかるプログラミング)

VisualC#2013逆引き大全555の極意

進捗ダイアログ 最終更新:2010/07/15
【Amazon ランキング:ゲーム - キッズ・ニンテンドー3DS】

進捗ダイアログ
時間がかかる処理などでよく見かける進捗ダイアログですが、この進捗ダイアログでスレッドを応用することで「キャンセル」処理を実装できす。ここではキャンセル処理を実装した進捗ダイアログのサンプルを紹介します。
進捗ダイアログ
ProgressDialog フォームを作成してコントロールを配置します。
Form:[ProgressDialog]
FontBorderStyle FixedToolWindow
StartPosition CenterParent

Label:[label_Message]
ProgressBAr:[progressBar1]
Button:[button_Cancel]
C#[ProgressDialog.cs]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ThreadCS
{
    
/// <summary>
    /// 進捗ダイアログ
    /// </summary>
    public partial class ProgressDialog : Form
    {

        
/// <summary>
        /// 進捗ダイアログ開始イベント用の引数クラスです。
        /// </summary>
        public class ProgressEventArgs : System.EventArgs
        {

            
/// <summary>プログレスバー</summary>
            private System.Windows.Forms.ProgressBar _progressBar;

            
/// <summary>メッセージラベル</summary>
            private System.Windows.Forms.Label _messageLabel;
            
            
/// <summary>
            /// コンストラクタ
            /// </summary>
            /// <param name="prg"></param>
            /// <param name="msg"></param>
            public ProgressEventArgs(
                System.Windows.Forms.
ProgressBar prg, System.Windows.Forms.Label msg)
            {
                _progressBar = prg;
                _messageLabel = msg;
            }

            
/// <summary>
            /// キャンセルされているかどうか
            /// </summary>
            public bool IsCancel { getset; }

            
/// <summary>
            /// プログレス値
            /// </summary>
            public int ProgressValue
            {
                
get { return _progressBar.Value; }
                
set
                {
                    
// プログレスバー設定
                    _progressBar.Invoke(new Action(delegate
                    {
                        
if (value <= _progressBar.Maximum)
                            _progressBar.Value = 
value;
                    }));
                }
            }

            
/// <summary>
            /// メッセージ
            /// </summary>
            public string Message
            {
                
get { return _messageLabel.Text; }
                
set
                {
                    
// プログレスバー設定
                    _progressBar.Invoke(new Action(delegate
                    {
                        _messageLabel.Text = 
value;
                    }));
                }
            }
        }

        
// イベントt定義
        public delegate void ProgressEvent_Handler(
            
object sender, ProgressEventArgs args);
        
public event ProgressEvent_Handler ProgressEvent;

        
/// <summary>イベント引数</summary>
        private ProgressEventArgs _eventArgs;

        
/// <summary>
        /// コンストラクタ
        /// </summary>
        public ProgressDialog()
        {
            InitializeComponent();

            
// プログレスバー設定
            this.progressBar1.Minimum = 0;
            
this.progressBar1.Maximum = 100;
            
this.progressBar1.Value = 0;

            
// 画面設定
            this.label_Message.Text = "";
        }

        
/// <summary>
        /// フォームロードイベントを処理します。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ProgressDialog_Load(object sender, EventArgs e)
        {
            
// イベント引数設定
            _eventArgs = new ProgressEventArgs(this.progressBar1, this.label_Message);

            
// タイマースレッド開始
            // スレッドタイマーをトリガーにすることによって開始
            // イベントのスレッドをメインから分離できる。
            System.Threading.Timer tm = 
                
new System.Threading.Timer(
                    
this.ProgressThreadProc, null,
                    1000, System.Threading.
Timeout.Infinite);
        }

        
/// <summary>
        /// プログレススレッド処理を行います。
        /// </summary>
        private void ProgressThreadProc(object state)
        {
            
// イベント発生
            this.ProgressEvent(this, _eventArgs);

            
// 画面を閉じる
            this.Invoke(new Action(delegate {
                
// 戻り値設定
                if (_eventArgs.IsCancel)
                    
this.DialogResult = DialogResult.Cancel;
                
else
                    this.DialogResult = DialogResult.OK;
                
this.Close();
            }));
        }

        
/// <summary>
        /// キャンセルボタンクリック時の処理を行います。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button_Cancel_Click(object sender, EventArgs e)
        {
            
// キャンセルされた事を引数に設定する。
            _eventArgs.IsCancel = true;
        }
    }
}
進捗ダイアログの呼び出し
Form6 フォームを作成してコントロールを配置します。

Button:[button1]
C#[ProgressDialog.cs]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ThreadCS
{
    
public partial class Form6 : Form
    {
        
public Form6()
        {
            InitializeComponent();
        }

        
private void button1_Click(object sender, EventArgs e)
        {
            
// プログレスバーダイアログで処理する。
            ProgressDialog dlog = new ProgressDialog();

            
// ダイアログ設定
            dlog.Text = "プログレスダイアログ";
            dlog.ProgressEvent += 
                
new ProgressDialog.ProgressEvent_Handler(dlog_ProgressEvent);

            
// ダイアログ表示
            DialogResult res = dlog.ShowDialog(this);

            
if (res == DialogResult.OK)
            {
                
MessageBox.Show("処理が完了しました。",
                    
"プログレス処理"MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            
else if (res == DialogResult.Cancel)
            {
                
MessageBox.Show("処理がキャンセルされました。",
                    
"プログレス処理"MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        
/// <summary>
        /// プログレス開始処理イベントを処理します。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        void dlog_ProgressEvent(object sender, ProgressDialog.ProgressEventArgs args)
        {
            
for (int i = 0; i <= 100; i+=10)
            {
                args.Message = 
string.Format("現在の値:{0:000}",i);
                args.ProgressValue = i;
                System.Threading.
Thread.Sleep(200);

                
// キャンセルされた場合、キャンセル処理を行います。
                if (args.IsCancel)
                    
break;
            }
        }
    }
}
※このページで紹介しているサンプルコードについて管理者は動作保障をいたしません※
※サンプルコードを使用する場合は、自己責任でお願いします※

【楽天 ランキング:スマートフォン】




このサイトはフリーソフトのMerge HTMLで作成されています。
このサイトはリンクフリーです。

ページの先頭に戻る Copyright© 2010-2015 Jun.Shiozaki All rights reserved.