DoboWiki
Top
> .NETプログラミング研究/45 をテンプレートにして作成
.NETプログラミング研究/45 をテンプレートにして作成
開始行:
#title(.NETプログラミング研究 第45号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第45号 [#z31e25ab]
**.NET Tips [#vaa1db20]
***進行状況ダイアログを表示する [#qf3d3efd]
#column(注意){{
この記事の最新版は「[[進行状況ダイアログを表示する>https:...
}}
前回は時間のかかる処理で進行状況を表示する方法と、さらに...
このような進行状況ダイアログを作成するには、前号で説明し...
DoEventsメソッドを使って進行状況ダイアログを表示する場合...
ここではこのようなDoEventsメソッドを使った方法ではなく、...
下に進行状況ダイアログを表示するためのクラス(ProgressDia...
なお.NETのマルチスレッドプログラミングについて、ここでは...
(VB.NETのコードは、C#のコードを「C# to VB.NET Translator...
-[[C# to VB.NET Translator>http://authors.aspalliance.com...
#code(vbnet){{
Public Class ProgressForm
Inherits System.Windows.Forms.Form
#Region " Windows フォーム デザイナで生成されたコード "
Public Sub New()
MyBase.New()
' この呼び出しは Windows フォーム デザイナで必要...
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追...
End Sub
' Form は、コンポーネント一覧に後処理を実行するために...
Protected Overloads Overrides Sub Dispose(ByVal dispo...
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer
' メモ : 以下のプロシージャは、Windows フォーム デザ...
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents ProgressBar1 As System.Windows.Form...
Friend WithEvents Button1 As System.Windows.Forms.But...
<System.Diagnostics.DebuggerStepThrough()> Private Su...
Me.Label1 = New System.Windows.Forms.Label
Me.ProgressBar1 = New System.Windows.Forms.Progre...
Me.Button1 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(8, 8)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(296, 48)
Me.Label1.TabIndex = 0
'
'ProgressBar1
'
Me.ProgressBar1.Location = New System.Drawing.Poi...
Me.ProgressBar1.Name = "ProgressBar1"
Me.ProgressBar1.Size = New System.Drawing.Size(21...
Me.ProgressBar1.TabIndex = 1
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(23...
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 2
Me.Button1.Text = "キャンセル"
'
'ProgressForm
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5,...
Me.ClientSize = New System.Drawing.Size(320, 85)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.ProgressBar1)
Me.Controls.Add(Me.Label1)
Me.FormBorderStyle = System.Windows.Forms.FormBor...
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "ProgressForm"
Me.Text = "ProgressForm"
Me.ResumeLayout(False)
End Sub
#End Region
End Class
''' <summary>
''' 進行状況ダイアログを表示するためのクラス
''' </summary>
Public Class ProgressDialog
Implements IDisposable
'キャンセルボタンがクリックされたか
Private _canceled As Boolean = False
'ダイアログフォーム
Private form As ProgressForm
'フォームが表示されるまで待機するための待機ハンドル
Private startEvent As System.Threading.ManualResetEvent
'フォームが一度表示されたか
Private showed As Boolean = False
'フォームをコードで閉じているか
Private closing As Boolean = False
'オーナーフォーム
Private ownerForm As form
'別処理をするためのスレッド
Private thread As System.Threading.Thread
'フォームのタイトル
Private _title As String = "進行状況"
'ProgressBarの最小、最大、現在の値
Private _minimum As Integer = 0
Private _maximum As Integer = 100
Private _value As Integer = 0
'表示するメッセージ
Private _message As String = ""
''' <summary>
''' ダイアログのタイトルバーに表示する文字列
''' </summary>
Public Property Title() As String
Get
Return _message
End Get
Set(ByVal Value As String)
_title = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker(AddressOf S...
End If
End Set
End Property
''' <summary>
''' プログレスバーの最小値
''' </summary>
Public Property Minimum() As Integer
Get
Return _minimum
End Get
Set(ByVal Value As Integer)
_minimum = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker( _
AddressOf SetProgressMinimum))
End If
End Set
End Property
''' <summary>
''' プログレスバーの最大値
''' </summary>
Public Property Maximum() As Integer
Get
Return _maximum
End Get
Set(ByVal Value As Integer)
_maximum = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker( _
AddressOf SetProgressMaximun))
End If
End Set
End Property
''' <summary>
''' プログレスバーの値
''' </summary>
Public Property Value() As Integer
Get
Return _value
End Get
Set(ByVal Value As Integer)
_value = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker( _
AddressOf SetProgressValue))
End If
End Set
End Property
''' <summary>
''' ダイアログに表示するメッセージ
''' </summary>
Public Property Message() As String
Get
Return _message
End Get
Set(ByVal Value As String)
_message = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker(AddressOf S...
End If
End Set
End Property
''' <summary>
''' キャンセルされたか
''' </summary>
Public ReadOnly Property Canceled() As Boolean
Get
Return _canceled
End Get
End Property
''' <summary>
''' ダイアログを表示する
''' </summary>
''' <param name="owner">
''' ownerの中央にダイアログが表示される
''' </param>
''' <remarks>
''' このメソッドは一回しか呼び出せません。
''' </remarks>
Public Overloads Sub Show(ByVal owner As form)
If showed Then
Throw New Exception("ダイアログは一度表示され...
End If
showed = True
_canceled = False
startEvent = New System.Threading.ManualResetEven...
ownerForm = owner
'スレッドを作成
thread = New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf Ru...
thread.IsBackground = True
Me.thread.ApartmentState = System.Threading.Apart...
thread.Start()
'フォームが表示されるまで待機する
startEvent.WaitOne()
End Sub
Public Overloads Sub Show()
Show(Nothing)
End Sub
'別スレッドで処理するメソッド
Private Sub Run()
'フォームの設定
form = New ProgressForm
form.Text = _title
AddHandler form.Button1.Click, AddressOf Button1_...
AddHandler form.Closing, AddressOf form_Closing
AddHandler form.Activated, AddressOf form_Activated
form.ProgressBar1.Minimum = _minimum
form.ProgressBar1.Maximum = _maximum
form.ProgressBar1.Value = _value
'フォームの表示位置をオーナーの中央へ
If Not (ownerForm Is Nothing) Then
form.StartPosition = FormStartPosition.Manual
form.Left = _
ownerForm.Left + (ownerForm.Width - form....
form.Top = _
ownerForm.Top + (ownerForm.Height - form....
End If
'フォームの表示
form.ShowDialog()
form.Dispose()
End Sub
''' <summary>
''' ダイアログを閉じる
''' </summary>
Public Sub Close()
closing = True
form.Invoke(New MethodInvoker(AddressOf form.Clos...
End Sub 'Close
Public Sub Dispose() Implements System.IDisposable.Di...
form.Invoke(New MethodInvoker(AddressOf form.Disp...
End Sub
Private Sub SetProgressValue()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.ProgressBar1.Value = _value
End If
End Sub
Private Sub SetMessage()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.Label1.Text = _message
End If
End Sub
Private Sub SetTitle()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.Text = _title
End If
End Sub
Private Sub SetProgressMaximun()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.ProgressBar1.Maximum = _maximum
End If
End Sub
Private Sub SetProgressMinimum()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.ProgressBar1.Minimum = _minimum
End If
End Sub
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As EventArgs)
_canceled = True
End Sub
Private Sub form_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs)
If Not closing Then
e.Cancel = True
_canceled = True
End If
End Sub
Private Sub form_Activated(ByVal sender As Object, _
ByVal e As EventArgs)
RemoveHandler form.Activated, AddressOf form_Acti...
startEvent.Set()
End Sub
End Class
}}
#code(csharp){{
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
/// <summary>
/// ProgressForm の概要の説明です。
/// </summary>
public class ProgressForm : System.Windows.Forms.Form
{
internal System.Windows.Forms.Label Label1;
internal System.Windows.Forms.ProgressBar ProgressBar1;
internal System.Windows.Forms.Button Button1;
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = ...
public ProgressForm()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();
//
// TODO: InitializeComponent 呼び出しの後に、コン...
//
}
/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows フォーム デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッ...
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.Label1 = new System.Windows.Forms.Label();
this.ProgressBar1 = new System.Windows.Forms.Prog...
this.Button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// Label1
//
this.Label1.Location = new System.Drawing.Point(1...
this.Label1.Name = "Label1";
this.Label1.Size = new System.Drawing.Size(288, 4...
this.Label1.TabIndex = 0;
//
// ProgressBar1
//
this.ProgressBar1.Location = new System.Drawing.P...
this.ProgressBar1.Name = "ProgressBar1";
this.ProgressBar1.Size = new System.Drawing.Size(...
this.ProgressBar1.TabIndex = 1;
//
// Button1
//
this.Button1.Location = new System.Drawing.Point(...
this.Button1.Name = "Button1";
this.Button1.TabIndex = 2;
this.Button1.Text = "キャンセル";
//
// ProgressForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(...
this.ClientSize = new System.Drawing.Size(320, 85);
this.Controls.Add(this.Button1);
this.Controls.Add(this.ProgressBar1);
this.Controls.Add(this.Label1);
this.FormBorderStyle = System.Windows.Forms.FormB...
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ProgressForm";
this.ShowInTaskbar = false;
this.Text = "ProgressForm";
this.ResumeLayout(false);
}
#endregion
}
/// <summary>
/// 進行状況ダイアログを表示するためのクラス
/// </summary>
public class ProgressDialog : IDisposable
{
//キャンセルボタンがクリックされたか
private volatile bool _canceled = false;
//ダイアログフォーム
private volatile ProgressForm form;
//フォームが表示されるまで待機するための待機ハンドル
private System.Threading.ManualResetEvent startEvent;
//フォームが一度表示されたか
private bool showed = false;
//フォームをコードで閉じているか
private volatile bool closing = false;
//オーナーフォーム
private Form ownerForm;
//別処理をするためのスレッド
private System.Threading.Thread thread;
//フォームのタイトル
private volatile string _title = "進行状況";
//ProgressBarの最小、最大、現在の値
private volatile int _minimum = 0;
private volatile int _maximum = 100;
private volatile int _value = 0;
//表示するメッセージ
private volatile string _message = "";
/// <summary>
/// ダイアログのタイトルバーに表示する文字列
/// </summary>
public string Title
{
set
{
_title = value;
if (form != null)
form.Invoke(new MethodInvoker(SetTitle));
}
get
{
return _message;
}
}
/// <summary>
/// プログレスバーの最小値
/// </summary>
public int Minimum
{
set
{
_minimum = value;
if (form != null)
form.Invoke(new MethodInvoker(SetProgress...
}
get
{
return _minimum;
}
}
/// <summary>
/// プログレスバーの最大値
/// </summary>
public int Maximum
{
set
{
_maximum = value;
if (form != null)
form.Invoke(new MethodInvoker(SetProgress...
}
get
{
return _maximum;
}
}
/// <summary>
/// プログレスバーの値
/// </summary>
public int Value
{
set
{
_value = value;
if (form != null)
form.Invoke(new MethodInvoker(SetProgress...
}
get
{
return _value;
}
}
/// <summary>
/// ダイアログに表示するメッセージ
/// </summary>
public string Message
{
set
{
_message = value;
if (form != null)
form.Invoke(new MethodInvoker(SetMessage));
}
get
{
return _message;
}
}
/// <summary>
/// キャンセルされたか
/// </summary>
public bool Canceled
{
get { return _canceled; }
}
/// <summary>
/// ダイアログを表示する
/// </summary>
/// <param name="owner">
/// ownerの中央にダイアログが表示される
/// </param>
/// <remarks>
/// このメソッドは一回しか呼び出せません。
/// </remarks>
public void Show(Form owner)
{
if (showed)
throw new Exception("ダイアログは一度表示され...
showed = true;
_canceled = false;
startEvent = new System.Threading.ManualResetEven...
ownerForm = owner;
//スレッドを作成
thread = new System.Threading.Thread(
new System.Threading.ThreadStart(Run));
thread.IsBackground = true;
this.thread.ApartmentState =
System.Threading.ApartmentState.STA;
thread.Start();
//フォームが表示されるまで待機する
startEvent.WaitOne();
}
public void Show()
{
Show(null);
}
//別スレッドで処理するメソッド
private void Run()
{
//フォームの設定
form = new ProgressForm();
form.Text = _title;
form.Button1.Click += new EventHandler(Button1_Cl...
form.Closing += new CancelEventHandler(form_Closi...
form.Activated += new EventHandler(form_Activated);
form.ProgressBar1.Minimum = _minimum;
form.ProgressBar1.Maximum = _maximum;
form.ProgressBar1.Value = _value;
//フォームの表示位置をオーナーの中央へ
if (ownerForm != null)
{
form.StartPosition = FormStartPosition.Manual;
form.Left =
ownerForm.Left + (ownerForm.Width - form....
form.Top =
ownerForm.Top + (ownerForm.Height - form....
}
//フォームの表示
form.ShowDialog();
form.Dispose();
}
/// <summary>
/// ダイアログを閉じる
/// </summary>
public void Close()
{
closing = true;
form.Invoke(new MethodInvoker(form.Close));
}
public void Dispose()
{
form.Invoke(new MethodInvoker(form.Dispose));
}
private void SetProgressValue()
{
if (form != null && !form.IsDisposed)
form.ProgressBar1.Value = _value;
}
private void SetMessage()
{
if (form != null && !form.IsDisposed)
form.Label1.Text = _message;
}
private void SetTitle()
{
if (form != null && !form.IsDisposed)
form.Text = _title;
}
private void SetProgressMaximun()
{
if (form != null && !form.IsDisposed)
form.ProgressBar1.Maximum = _maximum;
}
private void SetProgressMinimum()
{
if (form != null && !form.IsDisposed)
form.ProgressBar1.Minimum = _minimum;
}
private void Button1_Click(object sender, EventArgs e)
{
_canceled = true;
}
private void form_Closing(object sender, CancelEventA...
{
if (!closing)
{
e.Cancel = true;
_canceled = true;
}
}
private void form_Activated(object sender, EventArgs e)
{
form.Activated -= new EventHandler(form_Activated);
startEvent.Set();
}
}
}}
次にこのクラスの使用法を示します。このコードはメインフォ...
#code(vbnet){{
Dim pd As New ProgressDialog
'ダイアログのタイトルを設定
pd.Title = "カウントアップ"
'プログレスバーの最小値を設定
pd.Minimum = 0
'プログレスバーの最大値を設定
pd.Maximum = 10
'プログレスバーの初期値を設定
pd.Value = 0
'進行状況ダイアログを表示する
pd.Show(Me)
'処理を開始
Dim i As Integer
For i = 1 To 10
'プログレスバーの値を変更する
pd.Value = i
'メッセージを変更する
pd.Message = i.ToString() + "番目を処理中..."
'キャンセルされた時はループを抜ける
If pd.Canceled Then
Exit For
End If
'1秒間待機する(本来なら何らかの処理を行う)
System.Threading.Thread.Sleep(1000)
Next i
'ダイアログを閉じる
pd.Close()
}}
#code(csharp){{
ProgressDialog pd = new ProgressDialog();
//ダイアログのタイトルを設定
pd.Title = "カウントアップ";
//プログレスバーの最小値を設定
pd.Minimum = 0;
//プログレスバーの最大値を設定
pd.Maximum = 10;
//プログレスバーの初期値を設定
pd.Value = 0;
//進行状況ダイアログを表示する
pd.Show(this);
//処理を開始
for (int i = 1; i <= 10; i++)
{
//プログレスバーの値を変更する
pd.Value = i;
//メッセージを変更する
pd.Message = i.ToString() + "番目を処理中...";
//キャンセルされた時はループを抜ける
if (pd.Canceled)
break;
//1秒間待機する(本来なら何らかの処理を行う)
System.Threading.Thread.Sleep(1000);
}
//ダイアログを閉じる
pd.Close();
}}
ここで紹介した方法では、メインフォームと同じスレッドで時...
参考:
-[[Windows Forms FAQ | 14.1 How to display a status dialo...
-[[The Code Project - A .NET Progress Dialog>http://www.c...
**コメント [#nda38e15]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2004-11-09 (火) 06:00:00,DOB...
終了行:
#title(.NETプログラミング研究 第45号)
#navi(.NETプログラミング研究)
#contents
*.NETプログラミング研究 第45号 [#z31e25ab]
**.NET Tips [#vaa1db20]
***進行状況ダイアログを表示する [#qf3d3efd]
#column(注意){{
この記事の最新版は「[[進行状況ダイアログを表示する>https:...
}}
前回は時間のかかる処理で進行状況を表示する方法と、さらに...
このような進行状況ダイアログを作成するには、前号で説明し...
DoEventsメソッドを使って進行状況ダイアログを表示する場合...
ここではこのようなDoEventsメソッドを使った方法ではなく、...
下に進行状況ダイアログを表示するためのクラス(ProgressDia...
なお.NETのマルチスレッドプログラミングについて、ここでは...
(VB.NETのコードは、C#のコードを「C# to VB.NET Translator...
-[[C# to VB.NET Translator>http://authors.aspalliance.com...
#code(vbnet){{
Public Class ProgressForm
Inherits System.Windows.Forms.Form
#Region " Windows フォーム デザイナで生成されたコード "
Public Sub New()
MyBase.New()
' この呼び出しは Windows フォーム デザイナで必要...
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追...
End Sub
' Form は、コンポーネント一覧に後処理を実行するために...
Protected Overloads Overrides Sub Dispose(ByVal dispo...
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer
' メモ : 以下のプロシージャは、Windows フォーム デザ...
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents ProgressBar1 As System.Windows.Form...
Friend WithEvents Button1 As System.Windows.Forms.But...
<System.Diagnostics.DebuggerStepThrough()> Private Su...
Me.Label1 = New System.Windows.Forms.Label
Me.ProgressBar1 = New System.Windows.Forms.Progre...
Me.Button1 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Label1
'
Me.Label1.Location = New System.Drawing.Point(8, 8)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(296, 48)
Me.Label1.TabIndex = 0
'
'ProgressBar1
'
Me.ProgressBar1.Location = New System.Drawing.Poi...
Me.ProgressBar1.Name = "ProgressBar1"
Me.ProgressBar1.Size = New System.Drawing.Size(21...
Me.ProgressBar1.TabIndex = 1
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(23...
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 2
Me.Button1.Text = "キャンセル"
'
'ProgressForm
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5,...
Me.ClientSize = New System.Drawing.Size(320, 85)
Me.Controls.Add(Me.Button1)
Me.Controls.Add(Me.ProgressBar1)
Me.Controls.Add(Me.Label1)
Me.FormBorderStyle = System.Windows.Forms.FormBor...
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "ProgressForm"
Me.Text = "ProgressForm"
Me.ResumeLayout(False)
End Sub
#End Region
End Class
''' <summary>
''' 進行状況ダイアログを表示するためのクラス
''' </summary>
Public Class ProgressDialog
Implements IDisposable
'キャンセルボタンがクリックされたか
Private _canceled As Boolean = False
'ダイアログフォーム
Private form As ProgressForm
'フォームが表示されるまで待機するための待機ハンドル
Private startEvent As System.Threading.ManualResetEvent
'フォームが一度表示されたか
Private showed As Boolean = False
'フォームをコードで閉じているか
Private closing As Boolean = False
'オーナーフォーム
Private ownerForm As form
'別処理をするためのスレッド
Private thread As System.Threading.Thread
'フォームのタイトル
Private _title As String = "進行状況"
'ProgressBarの最小、最大、現在の値
Private _minimum As Integer = 0
Private _maximum As Integer = 100
Private _value As Integer = 0
'表示するメッセージ
Private _message As String = ""
''' <summary>
''' ダイアログのタイトルバーに表示する文字列
''' </summary>
Public Property Title() As String
Get
Return _message
End Get
Set(ByVal Value As String)
_title = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker(AddressOf S...
End If
End Set
End Property
''' <summary>
''' プログレスバーの最小値
''' </summary>
Public Property Minimum() As Integer
Get
Return _minimum
End Get
Set(ByVal Value As Integer)
_minimum = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker( _
AddressOf SetProgressMinimum))
End If
End Set
End Property
''' <summary>
''' プログレスバーの最大値
''' </summary>
Public Property Maximum() As Integer
Get
Return _maximum
End Get
Set(ByVal Value As Integer)
_maximum = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker( _
AddressOf SetProgressMaximun))
End If
End Set
End Property
''' <summary>
''' プログレスバーの値
''' </summary>
Public Property Value() As Integer
Get
Return _value
End Get
Set(ByVal Value As Integer)
_value = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker( _
AddressOf SetProgressValue))
End If
End Set
End Property
''' <summary>
''' ダイアログに表示するメッセージ
''' </summary>
Public Property Message() As String
Get
Return _message
End Get
Set(ByVal Value As String)
_message = Value
If Not (form Is Nothing) Then
form.Invoke(New MethodInvoker(AddressOf S...
End If
End Set
End Property
''' <summary>
''' キャンセルされたか
''' </summary>
Public ReadOnly Property Canceled() As Boolean
Get
Return _canceled
End Get
End Property
''' <summary>
''' ダイアログを表示する
''' </summary>
''' <param name="owner">
''' ownerの中央にダイアログが表示される
''' </param>
''' <remarks>
''' このメソッドは一回しか呼び出せません。
''' </remarks>
Public Overloads Sub Show(ByVal owner As form)
If showed Then
Throw New Exception("ダイアログは一度表示され...
End If
showed = True
_canceled = False
startEvent = New System.Threading.ManualResetEven...
ownerForm = owner
'スレッドを作成
thread = New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf Ru...
thread.IsBackground = True
Me.thread.ApartmentState = System.Threading.Apart...
thread.Start()
'フォームが表示されるまで待機する
startEvent.WaitOne()
End Sub
Public Overloads Sub Show()
Show(Nothing)
End Sub
'別スレッドで処理するメソッド
Private Sub Run()
'フォームの設定
form = New ProgressForm
form.Text = _title
AddHandler form.Button1.Click, AddressOf Button1_...
AddHandler form.Closing, AddressOf form_Closing
AddHandler form.Activated, AddressOf form_Activated
form.ProgressBar1.Minimum = _minimum
form.ProgressBar1.Maximum = _maximum
form.ProgressBar1.Value = _value
'フォームの表示位置をオーナーの中央へ
If Not (ownerForm Is Nothing) Then
form.StartPosition = FormStartPosition.Manual
form.Left = _
ownerForm.Left + (ownerForm.Width - form....
form.Top = _
ownerForm.Top + (ownerForm.Height - form....
End If
'フォームの表示
form.ShowDialog()
form.Dispose()
End Sub
''' <summary>
''' ダイアログを閉じる
''' </summary>
Public Sub Close()
closing = True
form.Invoke(New MethodInvoker(AddressOf form.Clos...
End Sub 'Close
Public Sub Dispose() Implements System.IDisposable.Di...
form.Invoke(New MethodInvoker(AddressOf form.Disp...
End Sub
Private Sub SetProgressValue()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.ProgressBar1.Value = _value
End If
End Sub
Private Sub SetMessage()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.Label1.Text = _message
End If
End Sub
Private Sub SetTitle()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.Text = _title
End If
End Sub
Private Sub SetProgressMaximun()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.ProgressBar1.Maximum = _maximum
End If
End Sub
Private Sub SetProgressMinimum()
If Not (form Is Nothing) And Not form.IsDisposed ...
form.ProgressBar1.Minimum = _minimum
End If
End Sub
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As EventArgs)
_canceled = True
End Sub
Private Sub form_Closing(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs)
If Not closing Then
e.Cancel = True
_canceled = True
End If
End Sub
Private Sub form_Activated(ByVal sender As Object, _
ByVal e As EventArgs)
RemoveHandler form.Activated, AddressOf form_Acti...
startEvent.Set()
End Sub
End Class
}}
#code(csharp){{
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
/// <summary>
/// ProgressForm の概要の説明です。
/// </summary>
public class ProgressForm : System.Windows.Forms.Form
{
internal System.Windows.Forms.Label Label1;
internal System.Windows.Forms.ProgressBar ProgressBar1;
internal System.Windows.Forms.Button Button1;
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = ...
public ProgressForm()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();
//
// TODO: InitializeComponent 呼び出しの後に、コン...
//
}
/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows フォーム デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッ...
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.Label1 = new System.Windows.Forms.Label();
this.ProgressBar1 = new System.Windows.Forms.Prog...
this.Button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// Label1
//
this.Label1.Location = new System.Drawing.Point(1...
this.Label1.Name = "Label1";
this.Label1.Size = new System.Drawing.Size(288, 4...
this.Label1.TabIndex = 0;
//
// ProgressBar1
//
this.ProgressBar1.Location = new System.Drawing.P...
this.ProgressBar1.Name = "ProgressBar1";
this.ProgressBar1.Size = new System.Drawing.Size(...
this.ProgressBar1.TabIndex = 1;
//
// Button1
//
this.Button1.Location = new System.Drawing.Point(...
this.Button1.Name = "Button1";
this.Button1.TabIndex = 2;
this.Button1.Text = "キャンセル";
//
// ProgressForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(...
this.ClientSize = new System.Drawing.Size(320, 85);
this.Controls.Add(this.Button1);
this.Controls.Add(this.ProgressBar1);
this.Controls.Add(this.Label1);
this.FormBorderStyle = System.Windows.Forms.FormB...
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ProgressForm";
this.ShowInTaskbar = false;
this.Text = "ProgressForm";
this.ResumeLayout(false);
}
#endregion
}
/// <summary>
/// 進行状況ダイアログを表示するためのクラス
/// </summary>
public class ProgressDialog : IDisposable
{
//キャンセルボタンがクリックされたか
private volatile bool _canceled = false;
//ダイアログフォーム
private volatile ProgressForm form;
//フォームが表示されるまで待機するための待機ハンドル
private System.Threading.ManualResetEvent startEvent;
//フォームが一度表示されたか
private bool showed = false;
//フォームをコードで閉じているか
private volatile bool closing = false;
//オーナーフォーム
private Form ownerForm;
//別処理をするためのスレッド
private System.Threading.Thread thread;
//フォームのタイトル
private volatile string _title = "進行状況";
//ProgressBarの最小、最大、現在の値
private volatile int _minimum = 0;
private volatile int _maximum = 100;
private volatile int _value = 0;
//表示するメッセージ
private volatile string _message = "";
/// <summary>
/// ダイアログのタイトルバーに表示する文字列
/// </summary>
public string Title
{
set
{
_title = value;
if (form != null)
form.Invoke(new MethodInvoker(SetTitle));
}
get
{
return _message;
}
}
/// <summary>
/// プログレスバーの最小値
/// </summary>
public int Minimum
{
set
{
_minimum = value;
if (form != null)
form.Invoke(new MethodInvoker(SetProgress...
}
get
{
return _minimum;
}
}
/// <summary>
/// プログレスバーの最大値
/// </summary>
public int Maximum
{
set
{
_maximum = value;
if (form != null)
form.Invoke(new MethodInvoker(SetProgress...
}
get
{
return _maximum;
}
}
/// <summary>
/// プログレスバーの値
/// </summary>
public int Value
{
set
{
_value = value;
if (form != null)
form.Invoke(new MethodInvoker(SetProgress...
}
get
{
return _value;
}
}
/// <summary>
/// ダイアログに表示するメッセージ
/// </summary>
public string Message
{
set
{
_message = value;
if (form != null)
form.Invoke(new MethodInvoker(SetMessage));
}
get
{
return _message;
}
}
/// <summary>
/// キャンセルされたか
/// </summary>
public bool Canceled
{
get { return _canceled; }
}
/// <summary>
/// ダイアログを表示する
/// </summary>
/// <param name="owner">
/// ownerの中央にダイアログが表示される
/// </param>
/// <remarks>
/// このメソッドは一回しか呼び出せません。
/// </remarks>
public void Show(Form owner)
{
if (showed)
throw new Exception("ダイアログは一度表示され...
showed = true;
_canceled = false;
startEvent = new System.Threading.ManualResetEven...
ownerForm = owner;
//スレッドを作成
thread = new System.Threading.Thread(
new System.Threading.ThreadStart(Run));
thread.IsBackground = true;
this.thread.ApartmentState =
System.Threading.ApartmentState.STA;
thread.Start();
//フォームが表示されるまで待機する
startEvent.WaitOne();
}
public void Show()
{
Show(null);
}
//別スレッドで処理するメソッド
private void Run()
{
//フォームの設定
form = new ProgressForm();
form.Text = _title;
form.Button1.Click += new EventHandler(Button1_Cl...
form.Closing += new CancelEventHandler(form_Closi...
form.Activated += new EventHandler(form_Activated);
form.ProgressBar1.Minimum = _minimum;
form.ProgressBar1.Maximum = _maximum;
form.ProgressBar1.Value = _value;
//フォームの表示位置をオーナーの中央へ
if (ownerForm != null)
{
form.StartPosition = FormStartPosition.Manual;
form.Left =
ownerForm.Left + (ownerForm.Width - form....
form.Top =
ownerForm.Top + (ownerForm.Height - form....
}
//フォームの表示
form.ShowDialog();
form.Dispose();
}
/// <summary>
/// ダイアログを閉じる
/// </summary>
public void Close()
{
closing = true;
form.Invoke(new MethodInvoker(form.Close));
}
public void Dispose()
{
form.Invoke(new MethodInvoker(form.Dispose));
}
private void SetProgressValue()
{
if (form != null && !form.IsDisposed)
form.ProgressBar1.Value = _value;
}
private void SetMessage()
{
if (form != null && !form.IsDisposed)
form.Label1.Text = _message;
}
private void SetTitle()
{
if (form != null && !form.IsDisposed)
form.Text = _title;
}
private void SetProgressMaximun()
{
if (form != null && !form.IsDisposed)
form.ProgressBar1.Maximum = _maximum;
}
private void SetProgressMinimum()
{
if (form != null && !form.IsDisposed)
form.ProgressBar1.Minimum = _minimum;
}
private void Button1_Click(object sender, EventArgs e)
{
_canceled = true;
}
private void form_Closing(object sender, CancelEventA...
{
if (!closing)
{
e.Cancel = true;
_canceled = true;
}
}
private void form_Activated(object sender, EventArgs e)
{
form.Activated -= new EventHandler(form_Activated);
startEvent.Set();
}
}
}}
次にこのクラスの使用法を示します。このコードはメインフォ...
#code(vbnet){{
Dim pd As New ProgressDialog
'ダイアログのタイトルを設定
pd.Title = "カウントアップ"
'プログレスバーの最小値を設定
pd.Minimum = 0
'プログレスバーの最大値を設定
pd.Maximum = 10
'プログレスバーの初期値を設定
pd.Value = 0
'進行状況ダイアログを表示する
pd.Show(Me)
'処理を開始
Dim i As Integer
For i = 1 To 10
'プログレスバーの値を変更する
pd.Value = i
'メッセージを変更する
pd.Message = i.ToString() + "番目を処理中..."
'キャンセルされた時はループを抜ける
If pd.Canceled Then
Exit For
End If
'1秒間待機する(本来なら何らかの処理を行う)
System.Threading.Thread.Sleep(1000)
Next i
'ダイアログを閉じる
pd.Close()
}}
#code(csharp){{
ProgressDialog pd = new ProgressDialog();
//ダイアログのタイトルを設定
pd.Title = "カウントアップ";
//プログレスバーの最小値を設定
pd.Minimum = 0;
//プログレスバーの最大値を設定
pd.Maximum = 10;
//プログレスバーの初期値を設定
pd.Value = 0;
//進行状況ダイアログを表示する
pd.Show(this);
//処理を開始
for (int i = 1; i <= 10; i++)
{
//プログレスバーの値を変更する
pd.Value = i;
//メッセージを変更する
pd.Message = i.ToString() + "番目を処理中...";
//キャンセルされた時はループを抜ける
if (pd.Canceled)
break;
//1秒間待機する(本来なら何らかの処理を行う)
System.Threading.Thread.Sleep(1000);
}
//ダイアログを閉じる
pd.Close();
}}
ここで紹介した方法では、メインフォームと同じスレッドで時...
参考:
-[[Windows Forms FAQ | 14.1 How to display a status dialo...
-[[The Code Project - A .NET Progress Dialog>http://www.c...
**コメント [#nda38e15]
#comment
//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2004-11-09 (火) 06:00:00,DOB...
ページ名:
▲
▼
[
トップ
] [
新規
|
子ページ作成
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]