Edit内の全角文字を不正と判断する方法を教えてください

解決


永遠のdelphi初心者  2006-11-20 01:50:00  No: 23980

たびたび質問だらけですみません。
Edit内に文字を入力して、OKボタンを押したら
それをStringGridに表示させる処理を書いているのですが
今の処理のままだと、半角文字も全角文字も表示されてしまいます。

ここを、もし半角文字だけの入力限定にするか、全角文字を入力
してOKボタンを押したら、「半角文字を入力してください」という
エラーメッセージを出したいのですが・・・
すみません長くなって、要はOKボタンを押した時に
全角文字を不正とする方法を教えてください。

よろしくお願い致します。


うんと  2006-11-20 06:21:12  No: 23981

これなんかは

procedure TForm1.Button1Click(Sender: TObject);
var
  ws: WideString;
begin
  ws := Edit1.Text;
  if (Length(Edit1.Text) <> Length(ws)) then
    ShowMessage('全角文字がふくまれています!');
end;


うんと  2006-11-20 06:22:39  No: 23982

それからハンドルに「初心者」とか付けるのは好感できない人が多いようです。


っていうか  2006-11-20 17:59:00  No: 23983

半角しか入れないのであればimeModeでimDisableにしておけばいいんじゃないですか?  うちはこの方法でやって、シロートのオペレータさんが間違えたケースはありません。全角で入れる部分はimOpenにしておけば、いたでも全角で入れてくれるし…


ダメじゃん  2006-11-20 18:35:23  No: 23984

>半角しか入れないのであればimeModeでimDisableにしておけばいいんじゃ...
それじゃぁ、コピペの全角入力は防げないよ。


っていうか  2006-11-20 18:55:18  No: 23985

うちは社内開発・社内稼働なんですが、運用上そういう技を使う人はいないのよ。


後悔先に立たず  2006-11-20 19:01:36  No: 23986

>...運用上そういう技を使う人はいないのよ。
そんな思い込み、独り善がりが大失敗の元。


Basser  2006-11-21 01:10:32  No: 23987

入力制限をかける例です。

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FEditDefProc: TWndMethod;
    procedure EditProc(var Message: TMessage);
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

uses
  Clipbrd;

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

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

procedure TForm1.EditProc(var Message: TMessage);
var
  wMsg: TMsg;
  S   : String;
  i   : Integer;
begin
  // 2バイト文字チェック
  case Message.Msg of
    WM_CHAR:
      if Chr(Message.WParam) in LeadBytes then
      begin
        // メッセージキューのTrailByteを削除
        if PeekMessage(wMsg, Edit1.Handle, WM_CHAR, WM_CHAR, PM_NOREMOVE) and
           (wMsg.message = WM_CHAR) and (wMsg.wParam in [$40..$FF]) then
          PeekMessage(wMsg, Edit1.Handle, WM_CHAR, WM_CHAR, PM_REMOVE);

        MessageBeep($FFFFFFFF);
        Exit;
      end;

    WM_PASTE:
      if Clipboard.HasFormat(CF_TEXT) then
      begin
        S:= Clipboard.AsText;
        for i:= 1 to Length(S) do
          if S[I] in LeadBytes then
          begin
            MessageBeep($FFFFFFFF);
            Exit;
          end;
      end;
  end;

  // Edit1デフォルト処理
  FEditDefProc(Message);
end;

end.


横槍質問  2006-12-02 09:59:27  No: 23988

TEditのimDisableってコピペできるんですか?
Delphi7ですが、CTRL+Vで張り付かなかったんですが、どういう状況でコピペ可能なんでしょうか?


うんと  2006-12-02 13:08:08  No: 23989

今やってみたら、普通に貼り付きますね。D6 ですが。フォーカス当たってますか?


横槍  2006-12-02 23:56:48  No: 23990

あー、右クリックでのポップアップ入力が生きてますね。
ショートカットキーはやっぱり殺されてます。


かみづ  2006-12-03 04:38:54  No: 23991

2006ですがCtrl+Vも効きます。


横槍  2006-12-03 06:02:11  No: 23992

じゃぁ、OSによるのかなぁ?
WIN2000使ってます。


かみづ  2006-12-03 06:51:30  No: 23993

もちろんWin2000でも効きますよ。
おそらくその環境ではimDisableでなくても効かないのでは?


横槍  2006-12-03 07:10:24  No: 23994

ウチのメインはimHiraとimDisableを使ってるんですが、imHiraのEdit内ではCtrl+V,Ctrl+X,Ctrl+Cは効きますが、imDisableでは効きませんね。
Atok17とIME2000で両方試しましたがウチでは現象変わりませんね。
よくわからん。
まぁ、問題がある以上対策は考えます。
とりあえず、横槍は解決ということで


永遠のdelphi初心者  2006-12-08 01:46:28  No: 23995

遅くなってすみません。色々お答えいただいてありがとうございました。
どうにか解決しました。

本当にありがとうございました。


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

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






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