- - PR -
RichTextBoxの文字列のコピペについて
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-08 10:28
ダッチです。
VB2005で Windowsアプリケーションを作成しております。 <やりたいこと> メモ書きしたい文章を編集画面のRichTextBoxに入力します。 その文章の特定の文字列にリンク設定をしたいと思っております。 <やるための方法> 1.リンク設定をさせたい文字列を範囲選択します。 2.リンク先を別のTextBoxに入力します。 3.リンク追加ボタンよりそのリンク設定を確定します。 <リンク設定情報の内容> ・リンク開始位置 ・リンク文字数 ・リンク文字 ・リンク先 <動作> 編集画面で入力された文章が、 即、表示画面に表示されます。 その文章のリンク設定された文字列をクリックすると リンク先のファイルが開かれるという仕組みです。 <問題点> リンク設定された後に入力した文章をさらに編集されると リンク設定情報のリンク開始位置にずれが発生します。 そのためリンク設定されている文字列を検索して リンク開始位置を求めております。 リンク設定された文字と同じ文字が他にもあるかもしれないため、 リンク設定された文字列のForeColorを変更しSelectionProtectedをTrueに設定します。 しかし、リンク設定されている文字列をコピーし貼り付けをしたときに ForeColorとSelectionProtectedがリンク設定時の状態で 貼り付いてしまいます。 <改善したい部分> RichTextBoxの文字列をコピーして貼り付けしたときに RichTextBoxデフォルトのForeColorとSelectionProtectedで 貼り付けることは可能なのでしょうか? また他にいいリンク設定の方法がありましたら アドバイスをお願いします。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-01-08 12:56
場所に因りますよね? そのリンクの RTF に関与していない場所ならば問題ないはず。 関与している場所で "のみ" 再設定が必要です。
念のためですけど、全部検索はしていませんよね? 挿入位置 +- リンク設定したい文字数 - 1 の範囲ですよね。
これは、コピーした時に Text 情報だけでなく RTF の情報までコピーされるからですよね? ですので、貼り付ける際に RTF の情報を排除してあげるようにすれば解決するでしょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-01-08 14:21
早速の回答ありがとうございます。
問題があるのです。 たとえば "ABCDEFG"と 文字が入力されているとします。 その文字の"CD"にリンク設定をします。 この場合リンク情報の リンク開始位置には 2 が入ります。 その後で"1ABCDEFG"と編集した場合 "CD"のリンク開始位置は 3 にならなければなりません。 またRTFに関与している場所を編集できないように SelectionProtected を True に設定しております。
リンク設定は文章全体で複数設定できます。 リンク設定情報をリンク開始位置の小さい順に List に格納しております。 検索するリンク設定のひとつ前のリンク開始位置 + リンク文字数から リンク文字が見つかるまで検索し 検索した文字がリンク用の ForeColor であった場合 見つかったと判断しております。
貼り付ける時のタイミングを取ることは可能なのでしょうか。 また、どのようにして RTF 情報を排除するのでしょうか。 RichTextBoxのメンバ一覧を見てみてもそれらしいものが 見つからないのですが、 RichTextBox 以外のものを使ってやるのでしょうか。 <補足> リンク設定した文字列が Undo で削除されないように リンク追加した時に ClearUndo メソッドを実行しております。 よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2006-01-08 15:50
ん?意味がわからん。 HTML 風に書くと、 AB<a href="">CD</a>EFG となっているから、先頭に "12" を追加しても、開始位置が2とか3とか、関係ないんじゃないかなぁ? "CD" を選択してもらって、SelectedRtf プロパティを、RTF 形式で書き直す、、、って方法でやっているんだよね? ________________________________ □ Posted by Jitta on 2006/01/08 | ||||||||||||
|
投稿日時: 2006-01-08 20:32
回答ありがとうございます。
リンク設定した文字列の ForeColor や SelectionProtected などは 確かに一度設定するとそれ以外の文字を編集して位置がずれても 関係はありません。 しかし、何文字目からがリンク文字なのかという情報を RichTextBox に持っているのではなく、別のリンク設定用クラスに格納しております。 そのため、リンク設定された文字列の開始位置がずれるたびに リンク設定用クラスのリンク開始位置を設定し直さなくてはなりません。 リンク設定用クラスの内容は以下の4項目です。 ・リンク開始位置 ・リンク文字数 ・リンク文字 ・リンク先 編集画面の文章を表示画面に反映させるために リンク設定用クラスの情報が必要になってきます。 表示画面に表示させるコントロールは現在は LinkLabel を使用しておりますが、 リンク先のアイコンなども合わせて表示させたいため PictureBox の使用を検討しております。
残念ながら SelectedRtf プロパティ は使用しておりません。 SelectionColor プロパティと SelectionProtected プロパティを設定しているのみです。 もしかしたら、SelectedRtf プロパティにリンク先などを持つことが出来、 好きな時にどこからどこまでの文字列がどういう SelectedRtf を持っているかを 取得する方法があるということでしょうか。 | ||||||||||||
|
投稿日時: 2006-01-10 22:12
RichTextBox は RTF という特殊なコードを持っていて
それを元に各文字ごとに色を変えたりフォントを変えたり出来るということを ずっと調べていてやっとわかりました。 Rtf プロパティや SelectedRtf プロパティで 直接 RTF コードを取得、設定出来るのもわかりました。
言われたとおりのように処理を行いたいのですが、どうしても RichTextBox に貼り付けるタイミングと 貼り付けられるデータの情報を取ることが出来ません。 タイミングが取れないため、 RichTextBox のカーソル位置が変化すると思われるイベントより カーソル位置情報を保持しておき TextChanged イベントが発生したときに 保持しておいたカーソル位置からイベント発生後のカーソル位置の Color をデフォルトに戻すという方法を試みたのですが、 思い通りの動作をしてくれないようです。 ぜひ、RichTextBox に貼り付けるタイミングと 貼り付けられるデータの情報の取り方を 教えてはいただけないでしょうか。 よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2006-01-10 23:00
一人で舞い上がっていたようでした。
GotDotNet Japan の掲示板で似たような内容があり解決されているようです。 私も同じ用にしたら貼り付けた文字がただの文字で貼りついてくれました。 貼り付ける際とは Ctrl + V または Shift + Insert が押された時の KeyDown イベント で、 RTF 情報の排除とは DataFormats.Text で 貼り付けてやるということで間違いないんですよね? 他にもいろいろとご指摘いただきましたが ひとまず当初の問題を解決できました。 ありがとうございました。 これからは ググる だけでなく 他の掲示板でも似たような内容が既に無いかも 調べるようにしたいと思います。 | ||||||||||||
|
投稿日時: 2006-01-11 02:40
す、すいません... 失念していました。
RichTextBox も WM_PASTE が捕捉できれば確実なんですけどね... (^^;) ContextMenu がなければ、基本的には大丈夫でしょうけど...
はい、単純な Text 形式で貼れば良いと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |