2016-09-16 10 views
1

申し訳ありませんが、これは非常に簡単な修正ですが、ラベルの外部アクセスを許可するための一般的な方法を作成しようとしていますが、今はWindowsのドキュメントがこれを例に挙げています。C#外部のスレッドからラベルのテキストを変更するための一般的なメソッド。

delegate void SetTextCallback(string text); 
...some other code ... 
private void SetText(string text) 
    { 
     // InvokeRequired required compares the thread ID of the 
     // calling thread to the thread ID of the creating thread. 
     // If these threads are different, it returns true. 
     if (this.textLable.InvokeRequired) 
     { 
      SetTextCallback d = new SetTextCallback(SetText); 
      this.Invoke(d, new object[] { text }); 
     } 
     else 
     { 
      this.textLable.Text = text; 
     } 
    } 

しかし、私はオブジェクトにポインタの行に沿って何かを渡すことができる、より一般的なものを作成したいと思いますが、Windowsフォームのテキストラベルはこれを許可しません。理想的には、私はこれらの線に沿って何かをする何かをしたいと思い、この場合の

...code... 
private void SetText(string text, Label* lablePointer) 
{ 
    if (this.lablePointer.InvokeRequired) 
    { 
     SetTextCallback d = new SetTextCallback(SetText); 
     this.Invoke(d, new object[] { text }); 
    } 
    else 
    { 
     this.lablePointer.Text = text; 
    } 
} 

これを行うための方法があります(これは単なるexplainationalの目的のために、明らかな形で動作しませんか)?私は見てきましたが、どこにも答えられていないようです。

+0

なぜあなたはポインタを使用しますか? – NtFreX

+0

私は現在、もっと良いことが分かっていないので(これを行うより良い方法があれば)、問題の要点を理解するだけです。私は、複数のラベルにこれを使用して、他のスレッドがそれらにアクセスし、それぞれのラベルに対してこれらの方法を100万回書くことを救うことができるようにすることを望んでいます。 – Metric

答えて

3

あなたは、ポインタを必要としない - あなたはこの操作を行うことができます。TextプロパティはControlから継承された(LabelControlから派生し)ので

private void SetText(string text, Control control) 
{ 
    if (control.InvokeRequired) 
     control.Invoke(new Action(() => control.Text = text)); 
    else 
     control.Text = text; 
} 

あなたはControl代わりのLabel使用することができます。これは少し一般的な目的になります。

Label(及びControl)が参照型であるため、あなたがSetText()が通過と同様の効果を有する、呼び出されたときLabelオブジェクトへの参照のコピーがスタックにプッシュされることを意味し、ポインタを必要としませんC/C++のポインタ。

(私はあなたがC#2に切り替えているC/C++プログラマだ推測している。)

+0

チャームのように働いて、ありがとうございました。 (私はC/Javaプログラマーです) – Metric

0

あなたの呼び出しで複数のことを行う必要がある場合、あなたはすべてを行うために、全機能を呼び出すことができます1つは急降下しました:

private void SetText(Label l, string text){ 
     if(l.InvokeRequired) 
     { 
      MethodInvoker mI =() => { 
       l.Text = text; 
       //representing any other stuff you want to do in a func 
       //this is just random left-over stuff from when I used it, 
       //it's there to show you can do more than one thing since you are invoking a function 
       lbl_Bytes_Total.Text = io.total_KB.ToString("N0"); 
       lbl_Uncompressed_Bytes.Text = io.mem_Used.ToString("N0"); 
       pgb_Load_Progress.Value = (int)pct; 
      }; 
      BeginInvoke(mI); 
     } 
     else 
     { 
      l.Text = text; 
     } 
    } 
+0

一度に複数のことが必要な場合に備えて、関数を呼び出す例です。 –

関連する問題