半角文字しか入力できないようにしたいのですが。
全角文字を入力したらメッセージを出すようにするよりは
システムの入力モードを切り替えられないようにして
半角に固定することはできないでしょうか。
よろしくお願いします。
IMEModeをヘルプで調べてみてください。
# 「クリップボードからの貼り付け」だと入力できてしまいますが
onKeyPressでLengthを調べる(意味不明,適当,未確認
OnKeyPressイベントのKeyパラメータはChar型なので、
Lengthをとっても1にしかなりません。
ちょっとしたテストプログラムを書くか、
それ以前にヘルプで定義を見れば簡単に確認できることです。
クリップボードからの貼り付けに対しては、コンポーネントを継承して
WM_PASTEを自前で処理することで対処した覚えがあります。
ひょっとしたらもっとうまいやり方があるかもしれませんが……。
># 「クリップボードからの貼り付け」だと入力できてしまいますが
例えば、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;
クリップボードからの貼り付けに関しては、
入力コントロールのサブクラス化を行えば対応できます。
下記が例です。
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;
返事が遅くなりました。
クリップボードからの貼り付けまでは想定していなかったので
助かりました。いろいろな可能性を考えてソフトを作らないと
いけないなと改めて思いました。
皆さん、ありがとうございました。
ツイート | ![]() |