- PR -

RichTextBoxの文字列のコピペについて

投稿者投稿内容
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-01-08 10:28
ダッチです。

VB2005で
Windowsアプリケーションを作成しております。

<やりたいこと>
メモ書きしたい文章を編集画面のRichTextBoxに入力します。
その文章の特定の文字列にリンク設定をしたいと思っております。

<やるための方法>
1.リンク設定をさせたい文字列を範囲選択します。
2.リンク先を別のTextBoxに入力します。
3.リンク追加ボタンよりそのリンク設定を確定します。

<リンク設定情報の内容>
・リンク開始位置
・リンク文字数
・リンク文字
・リンク先

<動作>
編集画面で入力された文章が、
即、表示画面に表示されます。
その文章のリンク設定された文字列をクリックすると
リンク先のファイルが開かれるという仕組みです。

<問題点>
リンク設定された後に入力した文章をさらに編集されると
リンク設定情報のリンク開始位置にずれが発生します。

そのためリンク設定されている文字列を検索して
リンク開始位置を求めております。
リンク設定された文字と同じ文字が他にもあるかもしれないため、
リンク設定された文字列のForeColorを変更しSelectionProtectedをTrueに設定します。
しかし、リンク設定されている文字列をコピーし貼り付けをしたときに
ForeColorとSelectionProtectedがリンク設定時の状態で
貼り付いてしまいます。

<改善したい部分>
RichTextBoxの文字列をコピーして貼り付けしたときに
RichTextBoxデフォルトのForeColorとSelectionProtectedで
貼り付けることは可能なのでしょうか?

また他にいいリンク設定の方法がありましたら
アドバイスをお願いします。

よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-08 12:56
引用:

ダッチさんの書き込み (2006-01-08 10:28) より:

リンク設定された後に入力した文章をさらに編集されると
リンク設定情報のリンク開始位置にずれが発生します。


場所に因りますよね?
そのリンクの RTF に関与していない場所ならば問題ないはず。
関与している場所で "のみ" 再設定が必要です。

引用:

そのためリンク設定されている文字列を検索して
リンク開始位置を求めております。


念のためですけど、全部検索はしていませんよね?
挿入位置 +- リンク設定したい文字数 - 1 の範囲ですよね。

引用:

RichTextBoxの文字列をコピーして貼り付けしたときに
RichTextBoxデフォルトのForeColorとSelectionProtectedで
貼り付けることは可能なのでしょうか?


これは、コピーした時に Text 情報だけでなく RTF の情報までコピーされるからですよね?
ですので、貼り付ける際に RTF の情報を排除してあげるようにすれば解決するでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-01-08 14:21
早速の回答ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2006-01-08 12:56) より:
そのリンクの RTF に関与していない場所ならば問題ないはず。


問題があるのです。
たとえば
"ABCDEFG"と
文字が入力されているとします。
その文字の"CD"にリンク設定をします。
この場合リンク情報の
リンク開始位置には 2 が入ります。
その後で"1ABCDEFG"と編集した場合
"CD"のリンク開始位置は 3 にならなければなりません。

またRTFに関与している場所を編集できないように
SelectionProtected を True に設定しております。

引用:

念のためですけど、全部検索はしていませんよね?
挿入位置 +- リンク設定したい文字数 - 1 の範囲ですよね。


リンク設定は文章全体で複数設定できます。
リンク設定情報をリンク開始位置の小さい順に
List に格納しております。
検索するリンク設定のひとつ前のリンク開始位置 + リンク文字数から
リンク文字が見つかるまで検索し
検索した文字がリンク用の ForeColor であった場合
見つかったと判断しております。

引用:

これは、コピーした時に Text 情報だけでなく RTF の情報までコピーされるからですよね?
ですので、貼り付ける際に RTF の情報を排除してあげるようにすれば解決するでしょう。


貼り付ける時のタイミングを取ることは可能なのでしょうか。
また、どのようにして RTF 情報を排除するのでしょうか。

RichTextBoxのメンバ一覧を見てみてもそれらしいものが
見つからないのですが、
RichTextBox 以外のものを使ってやるのでしょうか。

<補足>
リンク設定した文字列が Undo で削除されないように
リンク追加した時に ClearUndo メソッドを実行しております。

よろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-08 15:50
引用:

たとえば
"ABCDEFG"と
文字が入力されているとします。
その文字の"CD"にリンク設定をします。
この場合リンク情報の
リンク開始位置には 2 が入ります。
その後で"1ABCDEFG"と編集した場合
"CD"のリンク開始位置は 3 にならなければなりません。


ん?意味がわからん。
HTML 風に書くと、

AB<a href="">CD</a>EFG

となっているから、先頭に "12" を追加しても、開始位置が2とか3とか、関係ないんじゃないかなぁ?

 "CD" を選択してもらって、SelectedRtf プロパティを、RTF 形式で書き直す、、、って方法でやっているんだよね?
________________________________
□ Posted by Jitta on 2006/01/08
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-01-08 20:32
回答ありがとうございます。

引用:

Jittaさんの書き込み (2006-01-08 15:50) より:

ん?意味がわからん。
HTML 風に書くと、

AB<a href="">CD</a>EFG

となっているから、先頭に "12" を追加しても、開始位置が2とか3とか、関係ないんじゃないかなぁ?


リンク設定した文字列の ForeColor や SelectionProtected などは
確かに一度設定するとそれ以外の文字を編集して位置がずれても
関係はありません。

しかし、何文字目からがリンク文字なのかという情報を RichTextBox に持っているのではなく、別のリンク設定用クラスに格納しております。
そのため、リンク設定された文字列の開始位置がずれるたびに
リンク設定用クラスのリンク開始位置を設定し直さなくてはなりません。

リンク設定用クラスの内容は以下の4項目です。
・リンク開始位置
・リンク文字数
・リンク文字
・リンク先

編集画面の文章を表示画面に反映させるために
リンク設定用クラスの情報が必要になってきます。
表示画面に表示させるコントロールは現在は LinkLabel を使用しておりますが、
リンク先のアイコンなども合わせて表示させたいため
PictureBox の使用を検討しております。

引用:

"CD" を選択してもらって、SelectedRtf プロパティを、RTF 形式で書き直す、、、って方法でやっているんだよね?



残念ながら SelectedRtf プロパティ は使用しておりません。
SelectionColor プロパティと
SelectionProtected プロパティを設定しているのみです。

もしかしたら、SelectedRtf プロパティにリンク先などを持つことが出来、
好きな時にどこからどこまでの文字列がどういう SelectedRtf を持っているかを
取得する方法があるということでしょうか。

ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-01-10 22:12
RichTextBox は RTF という特殊なコードを持っていて
それを元に各文字ごとに色を変えたりフォントを変えたり出来るということを
ずっと調べていてやっとわかりました。

Rtf プロパティや
SelectedRtf プロパティで
直接 RTF コードを取得、設定出来るのもわかりました。

引用:

じゃんぬねっとさんの書き込み (2006-01-08 12:56) より:

これは、コピーした時に Text 情報だけでなく RTF の情報までコピーされるからですよね?
ですので、貼り付ける際に RTF の情報を排除してあげるようにすれば解決するでしょう。



言われたとおりのように処理を行いたいのですが、どうしても
RichTextBox に貼り付けるタイミングと
貼り付けられるデータの情報を取ることが出来ません。

タイミングが取れないため、
RichTextBox のカーソル位置が変化すると思われるイベントより
カーソル位置情報を保持しておき
TextChanged イベントが発生したときに
保持しておいたカーソル位置からイベント発生後のカーソル位置の
Color をデフォルトに戻すという方法を試みたのですが、
思い通りの動作をしてくれないようです。

ぜひ、RichTextBox に貼り付けるタイミングと
貼り付けられるデータの情報の取り方を
教えてはいただけないでしょうか。

よろしくお願いいたします。
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-01-10 23:00
一人で舞い上がっていたようでした。

GotDotNet Japan の掲示板で似たような内容があり解決されているようです。
私も同じ用にしたら貼り付けた文字がただの文字で貼りついてくれました。

貼り付ける際とは Ctrl + V または Shift + Insert
が押された時の KeyDown イベント で、
RTF 情報の排除とは DataFormats.Text で
貼り付けてやるということで間違いないんですよね?

他にもいろいろとご指摘いただきましたが
ひとまず当初の問題を解決できました。
ありがとうございました。

これからは ググる だけでなく
他の掲示板でも似たような内容が既に無いかも
調べるようにしたいと思います。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-11 02:40
す、すいません... 失念していました。

引用:

ダッチさんの書き込み (2006-01-10 23:00) より:

貼り付ける際とは Ctrl + V または Shift + Insert
が押された時の KeyDown イベント で、


RichTextBox も WM_PASTE が捕捉できれば確実なんですけどね... (^^;)
ContextMenu がなければ、基本的には大丈夫でしょうけど...

引用:

RTF 情報の排除とは DataFormats.Text で
貼り付けてやるということで間違いないんですよね?


はい、単純な Text 形式で貼れば良いと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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