喫茶XRAYトップページ

[▲前のスレッド]

[7999] memoの行の文字制限返信 削除
2014/9/22 (月) 14:23:20 andy
memoの文字制限、maxlength=100にすれば100バイトまでにできますが
1行に20文字、半角だけであればいいんですが、全角が混じってした場合。
うまいやりかたはないでしょうか。
画面で文字制限ができれば、印刷時にやりやすいので
つけたいのですが。


[8000] Re:memoの行の文字制限返信 削除
2014/9/22 (月) 14:39:52 Mr.XRAY
▼ andyさん

テーマを使用している場合、MaxLength の単位は、バイトではなく文字ですから,

> 1行に20文字、半角だけであればいいんですが、全角が混じってした場合。
> うまいやりかたはないでしょうか。


半角相当で,入力文字数を制限するということですね.
MaxLength := 100;
の時,半角だったら 100 文字,
全て全角だったら 50 文字ですね.


# おおっ! 8000 ゲッツ!!


[8001] Re2:memoの行の文字制限返信 削除
2014/9/22 (月) 15:17:14 Mr.XRAY
> MaxLength := 100;
> の時,半角だったら 100 文字,
> 全て全角だったら 50 文字ですね.


Delphi 2007 以前であれば,こんな感じですか.
Delphi 2009 以降では
       if ByteType(Text, MaxLen) = mbLeadByte then
の部分を変える必要がありますね.あるいは...

procedure TForm1.FormShow(Sender: TObject);
begin
  Memo1.Lines.Clear;
  Memo1.MaxLength := 10;
end;

procedure TForm1.Memo1Change(Sender: TObject);
var
  MaxLen: Integer;
begin
  MaxLen := SendMessage((Sender as TCustomEdit).Handle, EM_GETLIMITTEXT, 0, 0);
  if MaxLen <= 0 then
    Exit;
  with (Sender as TCustomEdit) do
    begin
      if Length(Text) <= MaxLen then
        Exit;
      if ByteType(Text, MaxLen) = mbLeadByte then
        Dec(MaxLen);
      Text := Copy(Text, 1, MaxLen);
      SelLength := 0;
      SelStart  := MaxLen;
    end;
end;

[MaxLength をどうにかする (Delphi 7 〜 Delphi 2007)]
http://ht-deko.minim.ne.jp/tech043.html


[8003] Re3:memoの行の文字制限返信 削除
2014/9/22 (月) 16:18:08 andy
MaxLength と書いたのがまずかったです。


各行に文字を入力するとき、10バイトにするようにします。
1234567890と10バイト目が半角の場合は改行せず
12345678901の時は、2行目に1が来ます。
123456789山にすると、改行して2行目に山が来るようにしたのです。

そして、
1行目に123456789
2行目に山となっているときに
1行目の3と4の間に可と入力すると
1行目に 123可4567の時は
2行目に  89山
以上のように勝手に改行が入るようできればいいですが。




[8004] Re4:memoの行の文字制限返信 削除
2014/9/22 (月) 16:49:36 Mr.XRAY
▼ andyさん
> MaxLength と書いたのがまずかったです。

これは失礼しました.
タイトルには「行」となっていますが,
某掲示板等では,タイトルと質問の内容が違うことは日常茶飯事なので(言い訳です)
では,今度は用心して,(^^;

本当に改行,つまり,改行コードを挿入するのか,
あるいは,折り返し表示するのか,で処理が違ってきますね.
(物理改行かソフト改行か)

また,入力中にその処理をするのか,
あるいは,全て入力したら([Enter]キーで入力終了と判定するとか)処理するのか,
によってもですね.

参考までに,行の長さ(文字列の長さ)の取得は,
EM_LINELENGTH メッセージです.
ソフト改行のオン・オフは EM_FMTLINES

いずれにしても,結構面倒なのではないかと思います.
では,頑張ってください.


[8005] Re5:memoの行の文字制限返信 削除
2014/9/22 (月) 17:29:54 Mr.XRAY
> また,入力中にその処理をするのか,

となるとかなり面倒ですね.
もし,ある行のテキストを編集して,指定文字数未満,あるいは超えた場合に
にはどうするか,という問題も発生します.
また,折り返し表示した場合,本当の改行(コード)の処理はどうするのかとか.
まず,動作仕様をよく考えることが肝要かと思います.


[8007] Re6:memoの行の文字制限返信 削除
2014/9/23 (火) 09:29:46 andy
いろいろありがとうございました。

とりあえず、以下のようにしてやってみました。

memo1のchangeに
with Memo1 do begin
   j:=Perform(EM_LINEFROMCHAR, -1, 0);
   aa:=Lines[j];
   z:=10;       /桁数
   case ByteType(aa, z) of
       mbLeadByte :begin
                     ja1:=copy(ab,1,z-1);ja2:=copy(ab,z,length(ab)-(z-1));
                    end;
        else begin
              ja1:=copy(ab,1,z);ja2:=copy(ab,z+1,length(ab)-(z));
             end;
            end;
    Lines[j]:=ja1+#13#10+ja2;
  end;

とりあえず、目的は達せるようです。



[8008] Re7:memoの行の文字制限返信 削除
2014/9/23 (火) 19:12:47 Mr.XRAY
▼ andyさん

> とりあえず、目的は達せるようです。

了解!!


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82