String ^% text = button->Text ;
text = "something" ;
ボタンのテキストを変更する必要がありますが、変更しません。
String ^% text = button->Text ;
text = "something" ;
ボタンのテキストを変更する必要がありますが、変更しません。
これは機能しません。コードはオブジェクトを更新するだけです。それ以上は到達せず、TextBox::Text プロパティも更新します。重複リンクで示唆されているように、これが文字列であるという理由だけでなく、単純な値型のプロパティでも機能しません。
これは、プロパティが値ではないためです。それらへの参照を作成することはできません。それらを使用すると、構文からの値のように見えます。しかし、それらを宣言するときは確かにそうではありません。get メソッドと set メソッドをどのように記述する必要があるかに注意してください。したがって、TextBox に表示されるテキストを更新するには、プロパティの set メソッドを呼び出す必要があります。これは単純な変数の代入ではなく、メソッド呼び出しです。おそらく直感的に明らかなように、Text プロパティの割り当てには多くの副作用があることに注意してください。画面で確認できます。
メソッドを間接的に呼び出すには、別の手段が必要です。デリゲートが必要です。C の関数ポインターにかなり似ています。.NET プログラミングに関する入門書で説明されています。独自のデリゲート型を宣言できますが、.NET フレームワークに組み込まれている汎用型を優先します。System.Core への参照を追加して、汎用の Action<> デリゲート型を使用できるようにします。まず、Text プロパティを割り当てるメソッドを作成する必要があります。
private:
void updateTextBox(String^ text) {
textBox1->Text = text;
}
これは、次のようなサンプル メソッドで更新されます。
void Test(Action<String^>^ updater) {
updater("foo");
}
また、このメソッドがテキスト ボックスをどのように更新できるかに注意してください。渡したデリゲート オブジェクトによって、どのテキスト ボックスが更新されるかが決まります。次のようなコードでデリゲート変数を作成します。
Test(gcnew Action<String^>(this, &Form1::updateTextBox));