半角文字しか入力を受け付けないようにするには

解決


COLT  2004-03-23 02:59:12  No: 7869

半角文字しか入力できないようにしたいのですが。
全角文字を入力したらメッセージを出すようにするよりは
システムの入力モードを切り替えられないようにして
半角に固定することはできないでしょうか。
よろしくお願いします。


にしの  2004-03-23 03:10:05  No: 7870

IMEModeをヘルプで調べてみてください。
# 「クリップボードからの貼り付け」だと入力できてしまいますが


るるとん@K  URL  2004-03-24 02:31:29  No: 7871

onKeyPressでLengthを調べる(意味不明,適当,未確認


ter  2004-03-24 07:58:04  No: 7872

OnKeyPressイベントのKeyパラメータはChar型なので、
Lengthをとっても1にしかなりません。
ちょっとしたテストプログラムを書くか、
それ以前にヘルプで定義を見れば簡単に確認できることです。

クリップボードからの貼り付けに対しては、コンポーネントを継承して
WM_PASTEを自前で処理することで対処した覚えがあります。
ひょっとしたらもっとうまいやり方があるかもしれませんが……。


まずい?  2004-03-24 18:23:41  No: 7873

># 「クリップボードからの貼り付け」だと入力できてしまいますが

例えば、OnClick, OnEnterイベントで以下のコード呼んで防ぐとか…(‾∇‾ゞ

procedure Zenkaku_Iyaan;
var
  p : PChar;
begin
  if Clipboard.HasFormat(CF_TEXT) then begin
    p := @((Clipboard.AsText)[1]);
    while p^ <> #0 do begin
      if (Byte(p^) and $80) <> 0 then begin
        Clipboard.Clear;
        break;
      end;
      inc(p);
    end;
  end;
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
  Zenkaku_Iyaan;
end;

procedure TForm1.Edit1Enter(Sender: TObject);
begin
  Zenkaku_Iyaan;
end;


Basser  2004-03-24 19:00:10  No: 7874

クリップボードからの貼り付けに関しては、
入力コントロールのサブクラス化を行えば対応できます。
下記が例です。

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FDefEditProc: TWndMethod;
    procedure EditProc(var Message: TMessage);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  Clipbrd;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  FDefEditProc:= Edit1.WindowProc;
  Edit1.WindowProc:= EditProc;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Edit1.WindowProc:= FDefEditProc;
end;

procedure TForm1.EditProc(var Message: TMessage);
var
  Buffer: String;
  Len   : Integer;
begin

  if (Message.Msg = WM_PASTE) then
  begin

    Buffer:= Clipboard.AsText;
    Len   := Length(Buffer);
    if (Len = 0) then Exit;
    if (ByteToCharLen(Buffer, Len) <> Len) then Exit;

  end;

  FDefEditProc(Message);

end;


COLT  2004-03-25 18:24:24  No: 7875

返事が遅くなりました。
クリップボードからの貼り付けまでは想定していなかったので
助かりました。いろいろな可能性を考えてソフトを作らないと
いけないなと改めて思いました。
皆さん、ありがとうございました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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