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

解決


Rina  2013-01-18 18:28:51  No: 43638  IP: 192.*.*.*

こんばんは。

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

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

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

よろしくお願いします。

編集 削除
 2013-01-18 21:06:37  No: 43639  IP: 192.*.*.*

改行文字かどうかは、

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

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

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

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

編集 削除
Nov  2013-01-19 11:59:48  No: 43640  IP: 192.*.*.*

>無駄な改行
が、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 12:05:34  No: 43641  IP: 192.*.*.*

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

編集 削除
DEKO  2013-01-19 15:29:35  No: 43642  IP: 192.*.*.*

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 12:55:35  No: 43643  IP: 192.*.*.*

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

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

BBBBBBB

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

編集 削除
 2013-01-20 13:04:25  No: 43644  IP: 192.*.*.*

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

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

編集 削除
Quest  2013-01-20 15:11:01  No: 43645  IP: 192.*.*.*

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

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

編集 削除
Rina  2013-01-21 19:31:41  No: 43646  IP: 192.*.*.*

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

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

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

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

編集 削除
DEKO  2013-01-21 22:36:58  No: 43647  IP: 192.*.*.*

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

編集 削除
Rina  2013-01-22 09:41:00  No: 43648  IP: 192.*.*.*

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

編集 削除