テンキー入力の-と点の処理


LUKU  2010-01-09 19:03:59  No: 36868  IP: 192.*.*.*

テンキー入力に関して、ETeditのkeypressに以下のようなコードを書きました(計算機プログラムです)。

var 
  ival  : double;
begin
 if space1.Tet <> '' then
     ival := StrToFloat(space1.Text);
       if ival = 0 then
          space1.Text := '';
          space1.Maxlength := 8;
       if not (Key in ['0'..'9', Char(VK_BACK)]) then
          begin
            key  := #0:
            space1.Maxlength  := 8;
           end;
end;

このようにしたら、桁数を八ケタ・space1への入力は数字とバックスペースのみと、そして頭に0があり、そのあとにそれ以外の数字が入力されたら、0を消してから入力されるという、制御をすることができました。その後、小数点と-の制御をしようとしているのですが、詰まっています。小数点は、スペースに1回のみで、先頭に入力できないようにしようとしています。そして、マイナスも1回のみの入力で、先頭のみにしか入力できないようにしています。pos関数を使って、制御しようとしています。まだ、プログラム文の書き方に問題があるせいか、制御できません。お分かりになる方いらっしゃいますか?

編集 削除
ん?  2010-01-09 19:12:18  No: 36869  IP: 192.*.*.*

MaskEditでいいのでは?

編集 削除
LUKU  2010-01-10 09:13:19  No: 36870  IP: 192.*.*.*

できれば、TEditでの書き方を教えていもらえないでしょうか?

編集 削除
igy  2010-01-10 09:20:54  No: 36871  IP: 192.*.*.*

> if space1.Tet <> '' then

でコンパイルエラーになりません?

あと、if文でbegin endがあるものと、ないものがありますが。

編集 削除
LUKU  2010-01-10 09:39:19  No: 36872  IP: 192.*.*.*

打ち間違えです。すいません。以下の表記で、マイナスと小数点を除いた制御はできています。
var 
  ival  : double;
begin
 if space1.Text <> '' then
     ival := StrToFloat(space1.Text);
       if ival = 0 then
         begin
          space1.Text := '';
          space1.Maxlength := 8;
         end;
       if not (Key in ['0'..'9', Char(VK_BACK)]) then
          begin
            key  := #0:
            space1.Maxlength  := 8;
           end;
end;

編集 削除
igy  2010-01-10 10:51:31  No: 36873  IP: 192.*.*.*

> if space1.Text <> '' then

にbegin end は?

編集 削除
igy  2010-01-10 11:00:23  No: 36874  IP: 192.*.*.*

あと、

>pos関数を使って、制御しようとしています。

の部分のコードは?

編集 削除
りな  2010-01-10 11:32:17  No: 36875  IP: 192.*.*.*

pos関数を使って、制御しようとすると、ほかのところに不具合が出てしまうので、お伺いしました。

var 
  ival  : double;
begin
 if space1.Text <> '' then
     begin
     ival := StrToFloat(space1.Text);
       if ival = 0 then
         begin
          space1.Text := '';
          space1.Maxlength := 8;
         end;
       if not (Key in ['0'..'9','.','-', Char(VK_BACK)]) then
          begin
            key  := #0:
            space1.Maxlength  := 8;
             if (space1.text = '') and pos('-', space1.text) <= 1)
             then この命令文がちょっとわからないです。
             if (space1.text <> '') and pos('.', space1.text) <= 1)
              then ここの部分も小数点をうったら、表示されるという命令文を書きたいのですが、どうかけばいいのか詰まっています。  
           end;
    end


beginやendやコロンなどの書き忘れは、実際にプログラムをコンパイル・実行するときに、調整することができると思います。

編集 削除
LUKU  2010-01-10 11:42:11  No: 36876  IP: 192.*.*.*

りなさん、すみません。先ほど、りなさんの書き込みを見ていたせいか、そのままりなさんのペンネームを使ってしまいました。本当に、すみませんでした。

編集 削除
igy  2010-01-10 14:10:23  No: 36877  IP: 192.*.*.*

>beginやendやコロンなどの書き忘れは、実際にプログラムをコンパイル・実行するときに、調整することができると思います。

bigin endのある・なしで動作が変わりますので、
少なくとも、ここで質問されるときは、bigin end のある・なし
は、きちんと区別(確認)して書いたほうがよいかと思います。

編集 削除
これでイケル?  2010-01-10 14:35:44  No: 36878  IP: 192.*.*.*

Space1(TEdit)のOnKeyPressイベント

var
 isDot: Boolean;
 sst, Minus: Integer;
 ss: string;
begin
  ss := Space1.Text;
  sst := Space1.SelStart;
  isDot := (Pos('.', ss) > 0);
  Minus := Integer(Pos('-', ss) > 0);
  Space1.Maxlength := 8 + Minus;
  case Key of
   Char(VK_BACK): exit;
   '1'..'9':
        if (ss[Minus+1] = '0')and(ss[Minus+2] <> '.') then
        begin
         Delete(ss, Minus+1, 1);
         Space1.Text := ss;
         Space1.SelStart := sst-1;
        end;
   '0': if (sst = Minus+1)and(ss[Minus+1] = '0') then Key := #0;
   '-': if (sst > 0) then Key := #0;
   '.': if (isDot)or(sst = Minus) then Key := #0;
   else
    Key := #0;
  end;
end;

編集 削除
LUKU  2010-01-11 10:49:28  No: 36879  IP: 192.*.*.*

ほかはわかったんですけれども、マイナス(VK_SUBTRACT?)と小数点のキーコードがどれかわかりません。知っている方いらっしゃいますか?

編集 削除
けど  2010-01-11 11:07:22  No: 36880  IP: 192.*.*.*

よく読んでないけど
http://www.comrade.co.jp/ftp/km2/manual/Properties/VKeyCode.htm

編集 削除