- - PR -
RichTextBoxオブジェクト代入時の再表示について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-10 14:13
ぶさいくろう様、早速の返信ありがとうございます。
Rtfでも全然問題ないのですが、2つのオブジェクトが1つのインスタンスを参照している場合、今の場合だと画面に反映され、同一の情報が表示されてもいいのではないかとおもうのですが、そうならない理由がわからず質問している次第です。参照の向け先を変えたということは、当然メンバ、プロパティも向け先を変えた方の設定をみるとおもうので、Refresh等で反映されてもいいのではないかと思うのですが。 認識が違ってたらすいません。
値渡しと参照渡しのことを言っているのでしょうか?であるなら理解しているつもりです。
それはRefreshPropertiesが設定されているからかな?っと思ってます。 拙い文章ですいませんがよろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2006-07-10 15:15
こんにちは。
れいずんさんの意図を読み違えている可能性はたぶんにあるとは思いますが。
まずはここを理解されているのかどうかが怪しいと思いました。 理解されていれば、以下のような発言が出てくるとは思えなかったので。
ひとつ面白い実験をしてみましょう。 フォームにラベル label1 を追加し、label1 の GenerateMember プロパティを切り替 えて、Form1.Designer.cs のソースファイルを見てみます。 (GenerateMember プロパティは VS2005 から増えたプロパティのようです) まずは GenerateMember プロパティが True の場合。
そして GenerateMember プロパティが False の場合。
見比べてみるとわかりますが、GenerateMember プロパティが True の場合の this.label1 は this.Controls["label1"] の参照です。GenerateMember プロパティ が False の場合は this.label1 すら作られません(そういうプロパティなので当然ですけ ども)。 で、何が言いたいのかというと、れいずんさんが書いた richTextBox2 = richTextBox1; というコードは、フォーム上のコントロール richTextBox2 (たぶん)を参照している richTextBox2 という変数の参照先をコントロール richTextBox1 に変更した だけ な のではないかと。 なので、このコードを実行したからといって、フォーム上のコントロール richTextBox1 の 内容がコントロール richTextBox2 にコピーされているわけではない、ということをみなさ んは言っているわけです。そしてそれを無理やりにでも実行するとしたら MemberwiseClone メソッドになるんじゃねーの?というのがじゃんぬねっとさんの回答 なのだと思うのですが、どうでしょうか。 うまく説明できていないような気がしますが、理解の手がかりにでもなれば幸いです。 | ||||||||||||||||
|
投稿日時: 2006-07-10 15:58
であるならば、ぽぴ王子さんの投稿どおり、インスタンスについての理解が甘いのかもしれません。
また、この発言もそれに裏づけされます。 値渡し (By Value) か、参照渡し (By Reference) かではなく、インスタンスのコピーかどうかだと思います。
これは、あくまで 「プロパティ ウィンドウ」 に関する設定です。 実行時の描画とは、関係がありません。 # Text プロパティは設定されれば、描画メッセージが飛ぶことになっています。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-07-10 16:33
ぽぴ王子様 わかりやすい回答ありがとうございました。
皆様が書かれていた意味は理解することができましたが、しかし下記のように記述すると変更されます。 namespace TestWindowsApplication { private void InitializeComponent ( ) { /** 編集 start *********************************** **/ System.Windows.Forms.Label label1; // label1 = new System.Windows.Forms.Label( ); this.SuspendLayout( ); System.Windows.Forms.Label testLabel = new System.Windows.Forms.Label( ); testLabel.Text = "テスト"; label1 = testLabel; /** 編集 end *********************************** **/ // // label1 // label1.AutoSize = true; label1.Location = new System.Drawing.Point( 30, 31 ); label1.Name = "label1"; label1.Size = new System.Drawing.Size( 35, 12 ); label1.TabIndex = 0; /** コメントアウトしました。 *********************************** **/ /** label1.Text = "label1"; **/ // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 12F ); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size( 292, 273 ); this.Controls.Add( label1 ); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout( false ); this.PerformLayout( ); } #endregion } } ということはどうなっているのだろと考えたところ、this.Controls.Add( label1 );のControlsで管理しているのではと思い、下記のサンプルコードを記述してみました。 private void button1_Click ( object sender, EventArgs e ) { Label labelInsert = new Label( ); labelInsert.Text = "新規に作成したLabel"; this.Controls.Remove( this.Controls["label1"] ); this.Controls.Add( labelInsert ); } 注)private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label1; を配置しています。Form1.Designer.csは変更していません。 すると、当然のことながらlabel1は消えlabelInsertが画面に表示されました。 であるならば、Controlsのメソッド(Add等のタイミング)を追ってみればわかるかと思ったのですが、ソースがなくメソッドの宣言のみです。ちょっとわかんなくなってきましたが、これ以上は本題からずれるため。調べるのはおわりにします。 自分の中の結論としては、Controlsへの追加、変更、削除で行うことはできるが、あってほしいコントロールの配置や大きさ等まで変更されてしまうので、自分の考えでは現実的にそんなことしする必要がなかったみたいです。 素直に、RichTextBoxのRTFやプロパティ、メンバの設定を個々に記述していきます。 ちょっとだけではありますが、Controlの理解が深まりました。ありがとうございました | ||||||||||||||||
|
投稿日時: 2006-07-10 16:42
じゃんぬねっと様、返信を書いている間に回答されたため、返信がおくれてしまいました。
もう少し詳しくおしえていただけないでしょうか? もちろん参考URL等でもかまいません。 理解が追いつかずに申し訳ありませんが、よろしくお願いします。 | ||||||||||||||||
|
投稿日時: 2006-07-10 17:02
本題とは関係のないところですが...
# 本題の方は、説明がちょっと難しいですね。 # 囚人さんの Blog に、ヒントとなる記事があったような気がします。
せっかくですから、リファレンスにしましょう。
「プロパティ グリッド」を使う場合に多用する 「属性」 ですね。 他のプロパティに影響しないプロパティは、デフォルト値で良いです。 # よって、実行時の描画とは関係がないということです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2006-07-10 17:19
じゃんぬねっと様、回答ありがとうございます。
落ち着いてじっくり調べてみます。 大変勉強になりましたありがとうございました。 |