TMemoの文末の、繰り返された改行を消したい

解決


Rina  2013-01-19 03:28:51  No: 43638

こんばんは。

TMemoの最後の無駄な改行を消したいのですが、どうすれば良いですか?

TMemoに入力する際に、最後に複数回Enterしてしまって、
無駄な改行がいくつか入ることがあります。

内容をテキストファイルに保存するまえに、
自動的にこの無駄な改行を消してしまいたいのですが、
「文末だけにある繰り返された改行」を見つける方法がわかりません。

よろしくお願いします。


  2013-01-19 06:06:37  No: 43639

改行文字かどうかは、

(調べたい箇所の文字1文字を格納した変数) = #13
 OR
(調べたい箇所の文字1文字を格納した変数) = #10

の条件判定式で行けるでしょう。

これを文末から文頭に向かって順次条件判定していってやれば
よいかと。

#13#10の意味は検索すればすぐわかると思います。


Nov  2013-01-19 20:59:48  No: 43640

>無駄な改行
が、Linesプロパティが空の行のことを指しているのなら、
with Memo1 do for i:=Lines.Count-1 downto 0 do if Lines[i]='' then Lines.Delete(i);
で消せます。

Memoのサイズが小さければ、組込関数に任せる方法もありかも。
Memo1.Text := TrimRight(Memo1.Text);
(ただ、この方法では空白やタブも消してしまうので、改行コードのみを扱う場合はTrimRightの処理内容をアレンジする必要がありますが)


Nov  2013-01-19 21:05:34  No: 43641

誤記です。
>組込関数
組込ではないですね...
既存の関数とでも読み替えてください。


DEKO  2013-01-20 00:29:35  No: 43642

XE またはそれ以降なら、正規表現で消せます。
uses に RegularExpressions を追加して、

  Memo1.Lines.Text := TRegEx.Replace(Memo1.Lines.Text, '(\r\n)+$', '', [roMultiLine]);

最後に改行を一つ残すなら、

  Memo1.Lines.Text := TRegEx.Replace(Memo1.Lines.Text, '(\r\n)+$', #$0D#$0A, [roMultiLine]);

です。

Delphi 2005〜2010 であれば、SkRegExp / SkRegularExpressions が使えます。
http://skregexp.komish.com/

uses に SkRegularExpressions を追加して使います。
コードは先述のものと全く同じになります。


Quest  2013-01-20 21:55:35  No: 43643

Rinaさん、DEKOさん横からすみません。
後学のために1つ教えてください。

正規表現で処理すると途中の二重改行も1つになりませんか?
例えば
AAAAAAA

BBBBBBB

AAAAAAA
BBBBBBB
になってしまうとか?


  2013-01-20 22:04:25  No: 43644

横槍ですが、なりませんよ。
Memo1.Textを1つの文字列としてとらえて、文字列の末尾部分に
改行のパターンが連続してあったら空白に置き換えているだけですので。

一応手元のXE3でも試しましたが意図したとおりの動きですね。


Quest  2013-01-21 00:11:01  No: 43645

あさん、ありがとうございます。

パターン文字$で末尾を表すのでしたね。
で、roMultiLineの指定でテキスト全体の文字列を1行として捉えるわけですね。
勉強になりました。
っていうか、正規表現についてちゃんと勉強しないといけないなぁ。


Rina  2013-01-22 04:31:41  No: 43646

>あさん、Novさん、DEKOさん、Questさん
色々使えそうなので正規表現でやってみることにしました。

TMemoの中の文字列の後ろに付いた、
無駄な「半角空白、全角空白、改行」を消したかったので、
なんか、とってもスマートでない書き方かもしれませんが、

Memo1.Lines.Text := TRegEx.Replace(Memo1.Lines.Text, '(\r\n+$)|(\s+$)|(  +$)', '', [roMultiLine]);

としたところ、消すことができました。
ありがとうございました。


DEKO  2013-01-22 07:36:58  No: 43647

> 正規表現で処理すると途中の二重改行も1つになりませんか?
む。私 roMultiLine って書いてますね。元のコードの意味だと roSingleLine が正しいと思います。


Rina  2013-01-22 18:41:00  No: 43648

>DEKOさん
roMultiLineとroSingleLineの使い分けがわかりました。
ありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加