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

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

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

Re[5]: 再投稿 C#でクラスからフォームのテキストボックスを操作


(過去ログ 108 を表示中)

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

■64257 / inTopicNo.1)  再投稿 C#でクラスからフォームのテキストボックスを操作
  
□投稿者/ サスケ (4回)-(2012/11/18(Sun) 21:36:43)

分類:[C#] 

はじめまして、先ほども質問させていただきましたが、
質問の仕方が悪かったと思い、再度、質問させてください。

やりたいことは、ワーカースレッドからフォームのテキストボックスに値を入れることです。

namespace MultiTask2
{
    delegate void SetTextCallback(string text);
    public partial class Form1 : Form
    {
        private Class_A Class_A_Worker;
        private Thread Class_A_Thread;

        public Form1()
        {
            InitializeComponent();
        }

        public void SetText(string text)
        {
            if (this.textBox1.InvokeRequired)
            {
                SetTextCallback d = new SetTextCallback(SetText);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                this.textBox1.Text = text;
            }
            this.Refresh();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Class_A_Worker = new Class_A();
            Class_A_Thread = new Thread(Class_A_Worker.DoWork);
            Class_A_Thread.Start();
        }
    }

    public class Class_A
    {
        public void DoWork()
        {
            Form1 form1 = new Form1();
            form1.SetText("ABC");
        }
    }
}

上記コードですと、エラーも出ませんが、テキストボックスに何も表示されません。
根本的に、考え方が違うのか、それともどこが間違っているのか・・・

どうか、よろしくお願いします。

引用返信 編集キー/
■64258 / inTopicNo.2)  Re[1]: 再投稿 C#でクラスからフォームのテキストボックスを操作
□投稿者/ επιστημη (24回)-(2012/11/18(Sun) 21:52:57)
επιστημη さんの Web サイト
> 上記コードですと、エラーも出ませんが、テキストボックスに何も表示されません。
> 根本的に、考え方が違うのか、それともどこが間違っているのか・・・

お母ちゃんに小遣いねだるのに

 public void DoWork()
        {
            Form1 form1 = new Form1(); // ヨソのおばちゃん連れてきて
            form1.SetText("ABC"); // 小遣いねだっても意味ないよね
        }
...つーことで:

class Program {
  public static void Main() {
    int i = 5; // [*] コレを書き換えたい
    sub(); // i に 3 を足せ!
  }
  void sub() {
    int i;
    i = i + 3; // [*]を書き換えることができるかな? アナタこれと同じことやってますよ。
  }
}

引用返信 編集キー/
■64259 / inTopicNo.3)  Re[2]: 再投稿 C#でクラスからフォームのテキストボックスを操作
□投稿者/ επιστημη (25回)-(2012/11/18(Sun) 22:28:55)
επιστημη さんの Web サイト
ざっくりこんなカンジかしら。

using System.Windows.Forms;
using System.Threading;

namespace MultiTask2 {

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    public void setValue(long n) {
      textBox1.Text = n.ToString();
    }

    private void button1_Click(object sender, System.EventArgs e) {
      Class_A_Worker = new Class_A(this);
      Class_A_Thread = new Thread(Class_A_Worker.DoWork);
      Class_A_Thread.Start();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
      Class_A_Thread.Abort(); // 強制終了はオススメしないけども...
    }

    private Class_A Class_A_Worker;
    private Thread Class_A_Thread;

  }

  public class Class_A {
    private delegate void method();
    private long lng_No;
    public Class_A(Form1 frm) { frm_ = frm; }
    public void DoWork() {
      lng_No = 0;
      while (true) {
        System.Threading.Thread.Sleep(1000);
        lng_No = lng_No + 1;
        frm_.Invoke(new method(show));
      }
    }
    private Form1 frm_;
    private void show() {
      frm_.setValue(lng_No);
    }
  }
}



引用返信 編集キー/
■64260 / inTopicNo.4)  Re[3]: 再投稿 C#でクラスからフォームのテキストボックスを操作
□投稿者/ サスケ (5回)-(2012/11/19(Mon) 00:05:59)
No64259 (επιστημη さん) に返信
> ざっくりこんなカンジかしら。
>
> using System.Windows.Forms;
> using System.Threading;
>
> namespace MultiTask2 {
>
> public partial class Form1 : Form {
> public Form1() {
> InitializeComponent();
> }
>
> public void setValue(long n) {
> textBox1.Text = n.ToString();
> }
>
> private void button1_Click(object sender, System.EventArgs e) {
> Class_A_Worker = new Class_A(this);
> Class_A_Thread = new Thread(Class_A_Worker.DoWork);
> Class_A_Thread.Start();
> }
>
> private void Form1_FormClosing(object sender, FormClosingEventArgs e) {
> Class_A_Thread.Abort(); // 強制終了はオススメしないけども...
> }
>
> private Class_A Class_A_Worker;
> private Thread Class_A_Thread;
>
> }
>
> public class Class_A {
> private delegate void method();
> private long lng_No;
> public Class_A(Form1 frm) { frm_ = frm; }
> public void DoWork() {
> lng_No = 0;
> while (true) {
> System.Threading.Thread.Sleep(1000);
> lng_No = lng_No + 1;
> frm_.Invoke(new method(show));
> }
> }
> private Form1 frm_;
> private void show() {
> frm_.setValue(lng_No);
> }
> }
> }
>
>
>

ありがとうございます。涙・・・

おかあちゃんはスレッドの方なんですね。
これで、はっきりしました。
いろいろな記事を見ていましたが、
まだ、初心者なんで、混乱していました。

本当にありがとうございます。

解決済み
引用返信 編集キー/
■64262 / inTopicNo.5)  Re[4]: 再投稿 C#でクラスからフォームのテキストボックスを操作
□投稿者/ επιστημη (26回)-(2012/11/19(Mon) 04:28:16)
επιστημη さんの Web サイト
> おかあちゃんはスレッドの方なんですね。

...あなたが理解できたのか不安。

解決済み
引用返信 編集キー/
■64263 / inTopicNo.6)  Re[5]: 再投稿 C#でクラスからフォームのテキストボックスを操作
□投稿者/ howling (81回)-(2012/11/19(Mon) 10:30:05)
2012/11/19(Mon) 10:30:42 編集(投稿者)

No64262 (επιστημη さん) に返信
多分、Runメソッドで呼ばれている部分を説明しないと、
どこでForm1が作られているのかわかっていないような…。

不安ですね。
解決済み一回消しちゃったけど、一応つけておくか…。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -