SkRegExp コンポーネントを使うに当たって
Mr.XRAY さんの
954_文字列の操作と正規表現「08_逐次検索 - SkRegularExpressions 使用」
http://mrxray.on.coocan.jp/Delphi/plSamples/954_SearchStr_Halbow.htm#08
を参考にさせていただいていますが
「制御文字等を含む位置なのでキャレット位置を再検索」と
最終的に RichEdit1.FindText を使われているようです
「\n」や「\t」など制御文字等自体をヒットさせるには
リッチエディットの SelStart との食い違いを調整しなければいけないと思うのですがよい方法はないでしょうか?
以上、よろしくお願いいたしますm(_ _)m
こんにちは,Mr.XRAYです.
あら!? もしかして,Terryさん?
懐かしいようなお名前があったのでレスしてしまいました.
「難解」な記事を読んで頂き,恐縮です.
>リッチエディットの SelStart との食い違いを調整しなければいけないと思うのですが
ですよね.私もいい方法があったら知りたいです.
サンプルでは,姑息な手段で逃げてしまっているものですから.
スミマセン.解決策でなくて.
ゴミレス? でした.
ご無沙汰してます
最近は某掲示板で NanaTree 派生版作ってます
師匠ならなんか力業とか必殺技とか隠されてるんじゃないかと思ってましたが
やっぱり難しいですね
ありがとうございました
Delphi1Delphi2
Delphi3Delphi4
「^Delphi」で検索しますと
二回目の「Delphi3」ヒットで FindText では「Delphi2」を選択して
終わってしまうようです
やはり何かしら考えないといけないようです〜
あら !?
う〜む.そうなると.
Terry さんの成果に期待するしかないですね.
よろしくお願いしま〜す.(^^;
冗談はともかく.う〜ん.
これは要約すると、
正規表現だと改行を含めた位置を返すため、そのままRichEditの位置を選択すると改行分選択したい位置がずれてしまうということでよいですか?
integerの配列に、どの位置に改行があるかを保持して、
Matchが返してきた位置の前にいくつ改行があったかを調べ、
その分RichEditで選択する位置を左にずらすという方法はどうでしょうか?
質問の理解が間違っていたらごめんなさい。
Atchoum さん、ありがとうございます
そうですね「\n」自体はヒットしませんが一応上記の「^Delphi」は
正常に動作するようです
function GetLineBreak(S:string):integer;
var
Collection:TMatchCollection;
begin
Collection:=TRegEx.Matches(S,'\n',[roMultiLine]);
Result:=Collection.Count;
end;
var
GetLineBreakCount:integer;
for Match in TRegEx.Matches(RichEdit1.Text, Edit1.Text, [roIgnoreCase,roMultiLine]) do begin
AStr := Match.Value;
ALen := Match.Length;
if (ALen > 0) {and (Trim(AStr) <> '')} then begin
if Match.Index>0 then
begin
GetLineBreakCount:=GetLineBreak(Copy(RichEdit1.Text,
0,
Match.Index-1));
// Memo1.Lines.Add(IntToStr(GetLineBreakCount));
CurPos :=Match.Index-1-GetLineBreakCount;
end;
……(ry
とりあえず解決とさせていただきます
ありがとうございました
ツイート | ![]() |