質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

10425閲覧

進捗ダイアログを表示して進捗状況を更新、表示したい

zanac

総合スコア25

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2016/11/03 11:36

編集2016/11/05 01:20

###前提・実現したいこと
ファイルコピーするアプリを作っており、コピー中の状況がわかるダイアログ(進捗ダイアログ)を
表示させたいと考えております。
そのダイアログのコーディングについてご教授願いたいです。
手も足も出ない状況です・・・

進捗ダイアログで実現したいこと、
・「コピーが完了したファイル数」と「コピーするファイルの総数」を表示させて、コピーが完了するたびに
「コピーが完了したファイル数」を更新して表示したい。
・そのコピー数の進捗を目で見て分かるように進捗バーを表示させて、
「コピーが完了したファイル数」を更新と合わせてバーも更新したい。
・キャンセルボタンを設けて、このボタンを押すと、コピー中のファイルはコピーをキャンセルして、
ダイアログそのものを閉じてコピー処理終了させたい。
・コピーするファイルが全て完了したら、進捗ダイアログ閉じたい。

例1) 4個のファイルをコピー中にキャンセルする
1.アプリに設けているコピー実行ボタンを押下してコピー開始。

2.コピー中を表す進捗ダイアログが表示される。
ダイアログ上の表示:
0 / 4 完了

3.1個目のファイルのコピーが完了。
ダイアログ上の表示:
1 / 4 完了

進捗バーもあわせて更新。バー全長の25%の位置にする

4.2個目のファイルコピーが完了。
ダイアログ上の表示:
2 / 4 完了

進捗バーもあわせて更新。バー全長の50%の位置にする

5.3個目のファイルコピー中にキャンセルボタンを押す。

6.3個目のファイルのコピーが取り消されて、進捗ダイアログを閉じる。

7.コピー処理が終了する。

例2) 2個のファイルをコピーし、全てコピー完了
1.アプリに設けているコピー実行ボタンを押下してコピー開始。

2.コピー中を表す進捗ダイアログが表示される。
ダイアログ上の表示:
0 / 2 完了

3.1個目のファイルのコピーが完了。
ダイアログ上の表示:
1 / 2 完了

進捗バーもあわせて更新。バー全長の50%の位置にする

4.2個目のファイルコピーが完了。
ダイアログ上の表示:2 / 2 完了

進捗バーもあわせて更新。バー全長の100%の位置にする

5.進捗ダイアログを閉じる。

6.コピー処理が終了する。

###補足情報(言語/FW/ツール等のバージョンなど)
開発環境は下記です。

開発環境:Visual Studio 2013
言語:C#(Visual C#)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

基本的な考え方は、
1、コピー対象のファイル一覧を配列に入れる。
2、foreachでコピーをする。1ループごとにProgressBarの値を変更する。

ProgressBarの使い方はリファレンスを読んでください。
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.progressbar(v=vs.110).aspx

ただこの方法だと、
ファイルの件数が多くなったり、ファイルのサイズが大きくなった時にUIが固まりますので、
async/await や BackgroundWorkerを使ってください。

async/await:
https://msdn.microsoft.com/ja-jp/library/hh191443(v=vs.120).aspx
http://www.atmarkit.co.jp/ait/articles/1512/02/news019.html

BackgroundWorker:
https://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker(v=vs.110).aspx
http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.html

投稿2016/11/04 07:00

lain

総合スコア161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ダイアログの作り方がわからないということなので簡単なソースを載せておきます。

C#

1 public partial class CopyForm :Form 2 { 3 string[] _files; 4 bool cancel; 5 public CopyForm() 6 { 7 InitializeComponent(); 8 } 9 10 public void CopyTo(string[] files) 11 { 12 _files = files; 13 button1.Text = "キャンセル"; 14 cancel = false; 15 button1.Click += (_, __) => 16 { 17 cancel = true; 18 }; 19 base.ShowDialog(); 20 } 21 22 private void CopyForm_Shown(object sender, EventArgs e) 23 { 24 progressBar1.Maximum = _files.Length; 25 progressBar1.Value = 0; 26 27 foreach(var file in _files) 28 { 29 if(cancel) 30 { 31 break; 32 } 33 //System.IO.File.Copy(file, dest); 34 System.Threading.Thread.Sleep(1000); 35 progressBar1.Value += 1; 36 label1.Text = $"{progressBar1.Value} / {_files.Length} 完了"; 37 Application.DoEvents(); 38 } 39 40 button1.Text = "閉じる"; 41 button1.Click += (_, __) => 42 { 43 Close(); 44 }; 45 } 46 }

呼び出し側

C#

1 private void button1_Click(object sender, EventArgs e) 2 { 3 var dialog = new CopyForm(); 4 string[] files = new string[5] { "a", "b", "c", "d", "e" }; 5 6 dialog.CopyTo(files); 7 }

この処理は同期処理なので、キャンセルを押した時点のCopyは完了し、そこでコピーが中断されます。

試していませんが、http://dalmore.blog7.fc2.com/blog-entry-46.html でもしかしたらお望みの処理が実現できるかも。

投稿2016/11/04 14:04

randr

総合スコア202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

質問の内容が曖昧で、zanacさんがどの程度のレベルの回答を求めているのか、うまく掴めません。

  • ダイアログを表示させたいと思ったけれど、そもそもどうすればダイアログを表示するコードを書けるのか分からない
  • コードの書き方は分かるけれど、どのようにしてプログラムを書き始めれば良いのかわからない
  • コードは書いてみたけれど、一部機能をうまく作れない
  • 一通り作ってみたけれど、一部機能が思った通りに動作してくれない
  • etc...

現在zanacさんが、端的にどのような課題を抱えているのかが分からないと、私もどのような回答をすれば良いのか分かりません。そして、仕様だけを並べても、zanacさんの現状は読み取れません。

また、「作りたいツールの仕様」だけを並べられると、一見して「こんなのが欲しいから代わりに誰か作って」という丸投げに見えてしまいます。

投稿2016/11/03 11:57

philomagi

総合スコア267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zanac

2016/11/03 12:14

topoさん あいまいな説明で申し訳ございません。 気分を害してしまったらすみません。決して、実装を丸投げを目的としている わけではありません。 自分の抱えている課題としては、 ・ダイアログの作り方が分からない。 ・コピーが完了するたびにコピー完了数の更新と進捗バーの更新を連動させる方法がわからない。 です。 アプリとしてコピーボタンを設け、そのボタンを押下すると、指定先へコピーされる、 まではコーディングできています・・・
philomagi

2016/11/03 12:35 編集

ご回答ありがとうございます。こちらこそ、必要以上に強い言葉を使ってしまい、申し訳ありません。 C#であれば、System.Windows.Forms.ProgressBarを使う方法が有るようです。 既に作ったアプリと同様の方法でウィンドウを作成し、そこにProgressBarを配置 -> 処理したファイル数に応じて、ProgressBarのプロパティを更新、という手順で実装できそうです。
zanac

2016/11/10 12:45

おっしゃる回答をもとに調べながらやりましたら何とか完成しました。これから評価も含めて確認していきます。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問