掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Memoに特定の文字を入力されたとき、その入力文字だけの文字色を変えるには? (ID:18390)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
不完全ですが、こんな感じでどうでしょう? type TForm1 = class(TForm) RichEdit1: TRichEdit; procedure RichEdit1KeyPress(Sender: TObject; var Key: Char); procedure RichEdit1Change(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private 宣言 } FCheckLineNo : Integer; public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin FCheckLineNo := -1; RichEdit1.Lines.Clear; end; procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char); var LineNo,CP : Integer; buf : String; begin // カーソルのある行番号とその行の先頭文字位置を取得 LineNo := SendMessage(RichEdit1.Handle,EM_LINEFROMCHAR,-1,0); CP := SendMessage(RichEdit1.Handle,EM_LINEINDEX,LineNo,0); // OnChangeでのスペルチェック行を設定 FCheckLineNo := LineNo; // カーソル行先頭からカーソル位置までの文字+今入力された文字を取得 buf := Copy(RichEdit1.Text,CP + 1,RichEdit1.SelStart - CP) + Key; // 後ろが'\begin'であれば... if AnsiEndsStr('\begin',buf) then begin // 今入力された文字と'{ }'行を挿入 RichEdit1.SelText := Key; RichEdit1.SelText := #13#10 + '{' + #13#10 + #13#10 + '}' + #13#10; // カーソル位置を '{}'の間に移動 RichEdit1.SelStart := CP + Length(buf) + 5; Key := #0; end; end; procedure TForm1.RichEdit1Change(Sender: TObject); var CP,P,SL : Integer; OldSelStart : Integer; buf : String; begin // スペルチェックする行が無効であれば、何もしない。 if (FCheckLineNo < 0) or (FCheckLineNo >= RichEdit1.Lines.Count) then exit; // チェックする行の文字列を取得 CP := SendMessage(RichEdit1.Handle,EM_LINEINDEX,FCheckLineNo,0); buf := RichEdit1.Lines[FCheckLineNo]; FCheckLineNo := -1; // 現在のカーソル位置を保存 OldSelStart := RichEdit1.SelStart; // 行の文字色を標準にする RichEdit1.SelStart := CP; RichEdit1.SelLength := Length(buf); RichEdit1.SelAttributes.Color := RichEdit1.Font.Color; // 最初の'\'で始まる文字位置を取得する P := PosEx('\',buf); while P > 0 do begin if not AnsiStartsStr('\begin',Copy(buf,P,Length(buf) - (P - 1))) then begin // '\begin'以外であればその部分の色を赤にする。 RichEdit1.SelStart := CP + (P - 1); // 赤にする範囲は、スペースまたは行の最後まで SL := PosEx(' ',buf,P) - P; if SL <= 0 then SL := Length(buf) - (P - 1); RichEdit1.SelLength := SL; RichEdit1.SelAttributes.Color := clRed; end; // 次の'$'文字位置を取得する P := PosEx('\',buf,P + 1); end; // カーソル位置を元に戻す RichEdit1.SelStart := OldSelStart; end; end.
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.