フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: [QC#115309] TMemo.SelStart does not work well
DEKO
管理者
投稿数: 2691
[QC#115309] TMemo.SelStart does not work well
on: 2013/04/29 06:24 Mon

重複だと思うのですが、見つけ方が悪いのか探し出せなかったので。

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 が一致します。

DEKO
管理者
投稿数: 2691
Re: [QC#115309] TMemo.SelStart does not work well
on: 2013/04/29 17:26 Mon

古いプロジェクト添付してしまって "Need Feedback" 貰っちゃったので、正しいサンプルプロジェクトを添付しました。

ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.026 sec.