MEMOで連続改行を規制したいんです。と他

解決


すみませんです  2002-03-22 22:11:13  No: 693  IP: [192.*.*.*]

2つ質問させてください。delphi暦極僅かです。
delphi6  personalです。

1.メモで、連続改行を指定回数以上できないようにしたいので、
    その方法を教えてください。

2.同じくメモで、すべての行末に指定した同じ文字列を追加したい
    場合の凡例を教えて頂きたいのですが。    
    
以上、初心者ですがよろしくお願いします。

編集 削除
どういたしまして  2002-03-23 00:32:13  No: 694  IP: [192.*.*.*]

1.の場合

var
  crCnt : Integer;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then begin
    if crCnt >= 5 then begin  // 5回まで
      Key := #0;
    end else begin
      inc(crCnt);
    end;
  end else begin
    crCnt := 0;
  end;
end;
-------------------------------

2.の場合
すべてのLineに aStrを追加

for i:=0 to Memo1.Lines.Count-1 do begin
  Memo1.Lines[i] := Memo1.Lines[i] + aStr;
end;

編集 削除
どういたしまして  2002-03-23 00:37:54  No: 695  IP: [192.*.*.*]

1.の場合の追加。
Form1の KeyPreviewを True にしてね。

編集 削除
にしの  2002-03-23 01:17:32  No: 696  IP: [192.*.*.*]

1の場合は、
「連続改行をn回数以上できない」=「空行が(n-1)行以上できない」ではないんですか?
abc[改行][改行]では、2回の連続改行。
abc[改行]def[改行]では、1回の改行。
とするのであれば、

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
var
  i: integer;
  strCrLf: string;
begin
  strCrLf := '';
  for i := 0 to StrToIntDef(Edit1.Text, 1) - 1 do
  begin
    strCrLf := strCrLf + #13#10;
  end;

  if Ord(Key) = 13 then
  begin
    if Copy(Memo1.Lines.Text, 1 + Memo1.SelStart - Length(strCrLf), Length(strCrLf)) = strCrLf then
    begin
      Key := #0;
    end;
  end;
end;

とすれば、Edit1.Textで指定された回数だけの連続改行に制限できます。
このときのForm1.KeyPreviewは、Trueです。

編集 削除
すみませんです  2002-03-23 08:54:36  No: 697  IP: [192.*.*.*]

ありがとうございます。1,2共、解決できました。

あと、もしよろしければ、↓もお願いします。
1の改行の件で、
ファイルを開いたときや、コピーされたときにも、
空行をn行以下になるよう削除したいので、
ボタン押したら空行を検索して削除する方法をお願いします。

素人連続質問でもうしわけございませんが、よろしくお願いします。

編集 削除
にしの  2002-03-23 13:06:11  No: 698  IP: [192.*.*.*]

上の1、2を理解できれば、あとはできるはずです。
上の2では、
上から順に、各行の末尾へ文字列を追加する。
です。
各行をループで調べられる(かつ、上から順に調べられるので、空行の連続が簡単に調べられる)ことがわかります。

これを踏まえて、次のように処理できますね。
順に調べて、空行でなければ空行カウントを0にする。
空行ならば、空行カウントを1進めて、
もし空行カウントがn以上であれば、現在の行を削除し、空行カウントを1戻す。

です。
ただし、削除するとLines.Countも変わるので、できればLines.Count-1から初めて、for i:=Memo1.Lines.Count-1 downto 0 とした方が楽です。
つまり、下から順に調べる、ということです。


少し違う方向から見るならば、(n+2)行以上の改行を、(n+1)行の改行に置き換える、とも言い換えられます。
# 先頭行のみ違います

たとえば、n=2だとして、2行までの空行を許すとすると、
abc[改行][改行][改行]def[改行]
は許されます。
abc[改行][改行][改行][改行]def[改行]
は、abcの後の改行が1回多いです。
abc[改行][改行][改行][改行][改行]def[改行]
は、abcの後の改行が2回多いです。

4回改行でも、5回改行でも、必ず3回までにするのなら、4回改行を3回改行に置き換えられるだけ置き換えればよいのです。
abc[改行][改行][改行][改行][改行]def[改行]
の、[改行][改行][改行][改行]を、[改行][改行][改行]に置き換えれば、
abc[改行][改行][改行][改行]def[改行]
になります。
さらに置き換えれば、
abc[改行][改行][改行]def[改行]
となります。
これ以上は、4回の改行が見つからないので終了です。

こちらの場合は、Whileループで、Pos関数の戻り値が0以上なら繰り返すようにして、Pos関数で改行が繰り返されている箇所を探し、その部分をSelLengthで指定してSelTextで置き換えてしまえばOkのはず。
# 未確認です。アイデアだけですみません。

これで解らなければ、わからない箇所について聞いてください。

編集 削除