Memoの各行ごとに、MaxLengthを設定することはできないのでしょうか??
ご教授お願いします。
Memo全体のMaxLength設定は出来ますが各行毎の設定は出来ないと思いますので、
OnChange,OnKeyPressなどのイベントで制限をかけるしかないと思います
OnKeyPress
begin
if Length(memo1.lines[memo1.y])>50 then
begin
key:='';
end;
end;
momoの現在位置はyじゃなかったかな。。
読み込みをしないならこれでよし
読み込む場合は読み込み時に
var
i:integer;
begin
i:=0
while i<memo1.count do
begin
if Length(memo1.lines[i])>50 then
begin
memo1.lines[i]:=leftstr(memo1.lines[i],50);
end;
i:=i+1;
end;
end;
memo1.yは多分間違ってます
memo1.yのところでエラーがでます。
なにをなさりたいのか分かりませんが、TMemo で各行に MaxLength() を
設定するのは大変ですよ。キーボード入力、クリップボードからの貼り付け
切り取り、BackSpace や Del キーによる行数変化にに追随して、ソフト
改行を変更したり、あらゆることを考慮しなければなりません。現実的では
ないです。
行番号は、
var
line: integer;
begin
line := Memo1.Perform(EM_LINEFROMCHAR, Memo1.SelStart, 0);
としてやれば取得できます。
# ゼロベースです
書き忘れました。
上のように行番号を取得しても、その行がLinesに存在しない場合もありますので注意。
どのような使い方をするのでしょうか?
場合によってはTEditとTListBoxというのもありますが
(TEditにmaxlength)
試せばわかると思います。
試しましたか?
うーむ、るるとん@K さんのコメントは元質問者に対してのものでは?
にしのさんのコードは、キャレットがある行のインデックスを取得する
ものですね。まえにも書きましたが、複数行を貼り付けたり、切り取ったり
複数行を選択して削除したりすると、行ごとに字数を管理するのは、ものすごく
大変です。本来の改行とソフト改行を区別する論理だけでも簡単ではありません。
また、行ごとに異なった最大字数が設定されていたりすると、その設定をも保持
する必要があります。ですから、TMemo で、質問の内容を実現するのはできなく
はないでしょうが、現実的ではありません。
失礼しました。
名前欄をよく見ていませんでした。
申し訳ありません。
失礼ついでに。
jokさんへ。
TMemoで実現するのが困難、というよりも、すでにいろいろな機能が実装されていて、それらの機能が邪魔をするで、「各行のmaxlength」という機能が難しい、ということですよね。
私もそう思います。
実現するとしたら、現実的でないものも含めて
1.イベントでガリガリ制御する
2.TCustomControlから派生させて、全ての機能を実装させる
3.TCustomMemoから派生させて、LinesのSetTextでmaxlengthの制御をさせる
のどれかかと思います。
実用的に作るのであれば、3。
今後、機能の充実を図る予定があるのならば(3では難しいのであれば)、2。
勉強のため、単にコーディングしたいのであれば、1。
でしょう。
お薦めの3の方法ですが、これもやはり、DeleteやBSなどで改行を消されて、(行が長いので)LinesへのSetTextをキャンセルしたときに、元に戻さねばならないので、結構面倒かもしれません。
# 文字コードや、行位置を気にしなくていい分だけ、イベントで書くよりは楽かと思いますが
ツイート | ![]() |