C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

別クラスの関数の引数にメインフォームのコントロールを渡す

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■85413 / inTopicNo.1)  別クラスの関数の引数にメインフォームのコントロールを渡す
  
□投稿者/ ぽぽる (1回)-(2017/10/19(Thu) 15:25:14)

分類:[.NET 全般] 

C#の初心者です。
以下のように処理の状況を表示するプログラムを作成しました。
基本的には動作しているのですが、タイミングによりエラーが出ることはありますか?
またこのような書き方をしてもいいものでしょうか?

メインフォームにはLabelとボタンが貼ってあります。
ボタンのクリックイベントで、以下のように別クラスを生成しラベルコントロールを引数で渡し、
別クラスの関数内で進捗更新を行ってます。


public partial class frmMain : Form
{
private void button1_Click(object sender, EventArgs e)
{
TestClass tc = new TestClass();
tc.Test(this.label1);
}
}


public class TestClass
{
public void Test(Label lbl){
for(int i=0; i<100; i++){
// 進捗表示
lbl.Text = (i+1).ToString() + " / 100";
Application.DoEvents();

// 処理
}
}
}


引用返信 編集キー/
■85426 / inTopicNo.2)  Re[1]: 別クラスの関数の引数にメインフォームのコントロールを渡す
□投稿者/ ぶなっぷ (132回)-(2017/10/19(Thu) 18:11:21)
この手のやり方の問題は、
Application.DoEvents();
を呼んだ際に、他のどんなイベントでも走ってしまうこと。

例えば、ウィンドウ右上の×ボタンが押されたら、
処理中であっても、アプリケーションごと終了してしまいます。

これを本質的に避けるために、私が知っている方法は2つ。

 1) モーダルダイアログを使う
    [// 処理]を行う前にモーダルダイアログを表示して、
    モーダルダイアログから[// 処理]を呼ぶ。
    これで、おかしなイベントが飛ぶ危険をモーダルダイアログ
    という仕組みで防ぐことができます。
    といっても完全ではありません、あしからず。

 2) マルチスレッド化する
    [// 処理]の部分をマルチスレッド化する。
    マルチスレッド側から、GUI(lbl.Textなど)にアクセスする
    ときはInvoke()を忘れずに。
    少々、面倒ですが、こちらの方が完全です。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ