- PR -

RichTextBoxオブジェクト代入時の再表示について

投稿者投稿内容
れいずん
会議室デビュー日: 2005/11/11
投稿数: 15
投稿日時: 2006-07-10 14:13
ぶさいくろう様、早速の返信ありがとうございます。

引用:
いやもうRtfをしれっと渡して適用せやええやん。なんで参照を入れ替える必要があるんかな?


Rtfでも全然問題ないのですが、2つのオブジェクトが1つのインスタンスを参照している場合、今の場合だと画面に反映され、同一の情報が表示されてもいいのではないかとおもうのですが、そうならない理由がわからず質問している次第です。参照の向け先を変えたということは、当然メンバ、プロパティも向け先を変えた方の設定をみるとおもうので、Refresh等で反映されてもいいのではないかと思うのですが。
認識が違ってたらすいません。
引用:
あんさんがその前に参照を入れ替えようとしていたことと何が違うのか理解できてるんかいな。


値渡しと参照渡しのことを言っているのでしょうか?であるなら理解しているつもりです。
引用:
それゆーたらTextを変えただけでもRefresh呼ばなあかんくなるやんかww


それはRefreshPropertiesが設定されているからかな?っと思ってます。

拙い文章ですいませんがよろしくお願いします。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-07-10 15:15
こんにちは。

れいずんさんの意図を読み違えている可能性はたぶんにあるとは思いますが。

引用:

囚人さんの書き込み (2006-07-09 02:02) より:

仮に richTextBox1 の代入前にrichTextBox2 がインスタンス化されていてインスタンスが2つあっても、代入で値がコピーされるわけではありません。参照が入れ替わっているだけです。


まずはここを理解されているのかどうかが怪しいと思いました。
理解されていれば、以下のような発言が出てくるとは思えなかったので。

引用:

Rtfでも全然問題ないのですが、2つのオブジェクトが1つのインスタンスを参照している場合、今の場合だと画面に反映され、同一の情報が表示されてもいいのではないかとおもうのですが、そうならない理由がわからず質問している次第です。



ひとつ面白い実験をしてみましょう。
フォームにラベル label1 を追加し、label1 の GenerateMember プロパティを切り替
えて、Form1.Designer.cs のソースファイルを見てみます。
(GenerateMember プロパティは VS2005 から増えたプロパティのようです)

まずは GenerateMember プロパティが True の場合。

コード:

    #region Windows フォーム デザイナで生成されたコード
(snip)
        this.label1 = new System.Windows.Forms.Label();
(snip)
        // 
        // label1
        // 
        this.label1.AutoSize = true;
        this.label1.Location = new System.Drawing.Point(0, 0);
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size(35, 12);
        this.label1.Text = "label1";

        // 
        // Form1
        // 
        this.Controls.Add(this.label1);
        this.Name = "Form1";
        this.ResumeLayout(false);
    }
    #endregion
(snip)
internal System.Windows.Forms.Label label1;


そして GenerateMember プロパティが False の場合。

コード:

    #region Windows フォーム デザイナで生成されたコード
(snip)
        System.Windows.Forms.Label label1;
(snip)
        // 
        // label1
        // 
        label1.AutoSize = true;
        label1.Location = new System.Drawing.Point(0, 0);
        label1.Name = "label1";
        label1.Size = new System.Drawing.Size(35, 12);
        label1.Text = "label1";

        // 
        // Form1
        // 
        this.Controls.Add(label1);
        this.Name = "Form1";
        this.ResumeLayout(false);
    }
    #endregion


見比べてみるとわかりますが、GenerateMember プロパティが True の場合の
this.label1 は this.Controls["label1"] の参照です。GenerateMember プロパティ
が False の場合は this.label1 すら作られません(そういうプロパティなので当然ですけ
ども)。
で、何が言いたいのかというと、れいずんさんが書いた

richTextBox2 = richTextBox1;

というコードは、フォーム上のコントロール richTextBox2 (たぶん)を参照している
richTextBox2 という変数の参照先をコントロール richTextBox1 に変更した だけ
のではないかと。
なので、このコードを実行したからといって、フォーム上のコントロール richTextBox1 の
内容がコントロール richTextBox2 にコピーされているわけではない、ということをみなさ
んは言っているわけです。そしてそれを無理やりにでも実行するとしたら
MemberwiseClone メソッドになるんじゃねーの?というのがじゃんぬねっとさんの回答
なのだと思うのですが、どうでしょうか。

うまく説明できていないような気がしますが、理解の手がかりにでもなれば幸いです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-10 15:58
引用:

れいずんさんの書き込み (2006-07-10 14:13) より:

Rtfでも全然問題ないのですが、2つのオブジェクトが1つのインスタンスを参照している場合、今の場合だと画面に反映され、同一の情報が表示されてもいいのではないかとおもうのですが、そうならない理由がわからず質問している次第です。参照の向け先を変えたということは、当然メンバ、プロパティも向け先を変えた方の設定をみるとおもうので、Refresh等で反映されてもいいのではないかと思うのですが。


であるならば、ぽぴ王子さんの投稿どおり、インスタンスについての理解が甘いのかもしれません。

引用:

値渡しと参照渡しのことを言っているのでしょうか?であるなら理解しているつもりです。


また、この発言もそれに裏づけされます。
値渡し (By Value) か、参照渡し (By Reference) かではなく、インスタンスのコピーかどうかだと思います。

引用:

それはRefreshPropertiesが設定されているからかな?っと思ってます。


これは、あくまで 「プロパティ ウィンドウ」 に関する設定です。
実行時の描画とは、関係がありません。

# Text プロパティは設定されれば、描画メッセージが飛ぶことになっています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れいずん
会議室デビュー日: 2005/11/11
投稿数: 15
投稿日時: 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の理解が深まりました。ありがとうございました


れいずん
会議室デビュー日: 2005/11/11
投稿数: 15
投稿日時: 2006-07-10 16:42
じゃんぬねっと様、返信を書いている間に回答されたため、返信がおくれてしまいました。


引用:
これは、あくまで 「プロパティ ウィンドウ」 に関する設定です。
実行時の描画とは、関係がありません。


もう少し詳しくおしえていただけないでしょうか?
もちろん参考URL等でもかまいません。

理解が追いつかずに申し訳ありませんが、よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-10 17:02
本題とは関係のないところですが...

# 本題の方は、説明がちょっと難しいですね。
# 囚人さんの Blog に、ヒントとなる記事があったような気がします。

引用:

れいずんさんの書き込み (2006-07-10 16:42) より:

もう少し詳しくおしえていただけないでしょうか?
もちろん参考URL等でもかまいません。


せっかくですから、リファレンスにしましょう。

引用:

MSDN2 ライブラリ - RefreshProperties 列挙体 より:

[プロパティ] ウィンドウの表示を更新するときの型を示す識別子を定義します。
RefreshProperties は、[プロパティ] ウィンドウの表示を更新するときの種類を示す識別子を定義します。


「プロパティ グリッド」を使う場合に多用する 「属性」 ですね。
他のプロパティに影響しないプロパティは、デフォルト値で良いです。

# よって、実行時の描画とは関係がないということです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
れいずん
会議室デビュー日: 2005/11/11
投稿数: 15
投稿日時: 2006-07-10 17:19
じゃんぬねっと様、回答ありがとうございます。

落ち着いてじっくり調べてみます。

大変勉強になりましたありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)