DOBON.NET DOBON.NETプログラミング掲示板過去ログ

文字列の色を変更

環境/言語:[WinXP(Pro)  VB.NET2003]
分類:[.NET]

こんばんは、HTMLエディタとプログラミング用エディタを製作しているのですが
ある、文字が入力されたら文字列の色を変更されるようにしたいのですが
どうすればよいのか困りました。
いろいろなサイトを閲覧してみたところ
カラーテーブルの値を変更する・・・・とだけしか
ないので、さっぱりです。
まず、RichTextBoxにどのようなことをさせればよいのでしょうか?
■No8165に返信(シノアさんの記事)
> こんばんは、HTMLエディタとプログラミング用エディタを製作しているのですが
> ある、文字が入力されたら文字列の色を変更されるようにしたいのですが
> どうすればよいのか困りました。
> いろいろなサイトを閲覧してみたところ
> カラーテーブルの値を変更する・・・・とだけしか
> ないので、さっぱりです。
> まず、RichTextBoxにどのようなことをさせればよいのでしょうか?

http://www.geocities.jp/hatanero/richtext.html
上記サイトを御覧下さい。
結構詳しく書いてあります。
2004/12/23(Thu) 03:47:08 編集(投稿者)
2004/12/23(Thu) 03:41:50 編集(投稿者)
2004/12/23(Thu) 03:36:15 編集(投稿者)
2004/12/23(Thu) 03:36:01 編集(投稿者)

無事出来たかなと思いきや
文章が正常にかけないっ!?
実際に、例のサイトを参照させていただいたところ
エラーがたくさん出たので自力でどうにかしたところ
色は変わらない上に
文章が正常に書けなくなってしまいました
以下が正常ならなくなったソースコードです
===========
Private Sub RichTextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBox1.KeyDown
Dim s, ss As String
Dim t1, t2 As Integer
s = RichTextBox1.Rtf
t1 = InStr(s, "{\colortbl")
If t1 <> 0 Then
t2 = InStr(t1, s, "}")
ss = Mid(s, t1, t2 - t1 + 1)
s = Replace(s, ss, "")
End If
s = Replace(s, "\viewkind", "{\colortbl ;\red255\green0\blue0;}" & vbCrLf & "\viewkind")
s = Replace(s, "<", "<\cf1")
s = Replace(s, ">", "\cf0>")
RichTextBox1.Rtf = s
End Sub
==========
やっぱり、グチャグチャに無理に訂正しなかった方がよかったでしょうか?

また、このイベントをボタンをクリックした時のイベントにすると
正常に動作するのですが
自分はリアルタイムで変更が出来るようにしたいのですが
どのように対処すればよいでしょうか?

それと、正常でないというよりも
カーソルが常に一番前に来てしまうという現象です
こんにちは、じゃんぬねっと です。

■No8172に返信(シノアさんの記事)
> 自分はリアルタイムで変更が出来るようにしたいのですが
> どのように対処すればよいでしょうか?

貴方がおっしゃる「リアルタイム」という言葉の意味合いは、
TextChanged() イベント以前ということなのでしょうか? (^-^;)

> Private Sub RichTextBox1_KeyDown(中略) Handles RichTextBox1.KeyDown

「リアルタイム」にやりたいのでしたら、
KeyEventArgs 引数を加味する必要がありますよね?
なんせ、Text も Rtf も更新されていないのですから。(^-^;)

# 仮にそれでやるのでしたら KeyPress() イベントの方が良かったりしますが。
# しかしながら、TextChanged() イベントでもチラつきませんからこっちを使った方が...

> このイベントをボタンをクリックした時のイベントにすると正常に動作するのですが

まあ、TextChanged() イベントでとりあえずやってみては如何でしょうか?
再入しないように、工夫する必要はありますが、とりあえずってことで。

> それと、正常でないというよりも
> カーソルが常に一番前に来てしまうという現象です

貴方のアルゴリズムを"そのまま"に、作り直してみました。

# なるべく .NET Framework を使うようにしましょうね。
# なるべく 意味のある変数名にしましょうね。
# グチャグチャだと自覚しているなら、コメント書いちゃいましょうね。
# そうしないとレスが付き難くなってしまいますよ。
# タグ開始位置を削除した場合の処理が抜けてるなど、色々問題があるような気がします。

' 再入を防ぐ Bool 値
Private mIsNotReEnter As Boolean

Private Sub RichTextBox1_TextChanged(中略) Handles RichTextBox1.TextChanged
    If mIsNotReEnter = True Then Return

    Dim nRtf      As String
    Dim iColorTbl As Integer
    Dim iEndTbl   As Integer
    Dim iSelStart As Integer

    ' RTF を取得
    nRtf = RichTextBox1.Rtf

    ' ColorTbl 位置の取得 (InStrの変わりに String.IndexOf() メソッドを使うべき)
    iColorTbl = nRtf.IndexOf("{\colortbl")

    ' 見つかった場合
    If iColorTbl >= 0 Then
        iEndTbl = nRtf.IndexOf("}"c, iColorTbl)
        ' 削除 (文字を消す際は、妙な置換なんてやめて String.Remove() メソッドを使おうね)
        nRtf = nRtf.Remove(iColorTbl, iEndTbl - iColorTbl + 1)
    End If

    ' \viewkind 前に colortbl を付加 (本当は Insert() メソッドを使った方が良い)
    nRtf = nRtf.Replace("\viewkind", "{\colortbl ;\red255\green0\blue0;}" & vbCrLf & "\viewkind")
    nRtf = nRtf.Replace("<", "<\cf1")
    nRtf = nRtf.Replace(">", "\cf0>")

    ' カーソル(?) 位置を取得
    iSelStart = RichTextBox1.SelectionStart

    ' RTF を置き換え
    mIsNotReEnter = True
    RichTextBox1.Rtf = nRtf
    mIsNotReEnter = False

    ' カーソル(?) 位置を復元
    RichTextBox1.SelectionStart = iSelStart
End Sub
2004/12/25(Sat) 23:31:40 編集(投稿者)

> 貴方のアルゴリズムを"そのまま"に、作り直してみました。
正直言うと、実は、このアルゴリズムは自分で作成していません
vb6.0の講座サイトから少し(名前のみ)改良しただけの
全くコピーペースト作業でした

> # なるべく 意味のある変数名にしましょうね。
すいません、そのままコピーペーストだったので
変数名の説明などは省いてしまいました。
通常ならばbufferとかValなど使っていますが
このときは、そのままでやってしまいました

> # グチャグチャだと自覚しているなら、コメント書いちゃいましょうね。
これも、そうです。
自分なりの書き方だと
'ファイル保存してるかしていないかチェック
If filename = "" Then
省略
End If
'ファイル保存してるかしていないかチェック(終了)
と言う感じでまとめたりしています

わざわざ、サンプルまで投稿していただいて
ありがとうございます。
必ず、これが役に立つように頑張ります。
それと、返信遅れましたすみませんm(_ _)m
解決済み!
  • 題名: Re[5]: 文字列の色を変更
  • 著者: k
  • 日時: 2004/12/26 19:06:03
  • ID: 8215
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
参考

http://www.gdncom.jp/student/bbs/ShowPost.aspx?PostID=2003
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板