重複だと思うのですが、見つけ方が悪いのか探し出せなかったので。
Report No: 115309 Status: Reported [FMX] TMemo.SelStart does not work well http://qc.embarcadero.com/wc/qcmain.aspx?d=115309 QCWIN:Defect_No=115309
FMX の TMemo は意図したとおりの SelStart を設定できないというものです。 FMX の TMemo は (Windows だと) 改行コードが CRLF (#$0D#$0A) なのに、SelStart は 改行コードを 1 文字でカウントしているようなのです。
[TRichEdit.SelStart (Embarcadero Discussion Forums)]
https://forums.embarcadero.com/thread.jspa?threadID=62303
と似たような問題なのですが、VCL の TRichEdit は仕方のない所もあります。RichEdit 2.0 以降では CR のみでの改行と CR+LF の改行の "2 種類の改行" が共存可能だからです (TStrings の仕様上どうしようもないかもしれません)。しかしながら、TMemo では改行は1種類しかないハズなのでちょっと困った事になります。
…ただ、計算で SelStart の位置を求めるのは厄介なのですが、正規表現等のヒット位置を SelStart に設定するのであれば回避策はあります。
var LB: string; dIndex, dLength: Integer; begin // 改行コードを退避 LB := Memo1.Lines.LineBreak; Memo1.Lines.LineBreak := #$0A; // コレを追加
{ 正規表現等で開始位置とヒット長を求める } { Memo1.Lines.Text から検索する } dIndex := ... dLength := ...
// 文字列を選択 Memo1.SelStart := dIndex; Memo1.SelLength := dLength;
// 改行コードを復元 Memo1.Lines.LineBreak := LB; end;
あらかじめ改行コードを 1 文字にしてから正規表現等に渡して、処理が済んだら改行コードを復元します。これなら正規表現等が返す位置情報と TMemo の SelStart が一致します。
|