StringGridのフォーカス移動・入力制限

解決


SEIKO  2008-09-17 09:35:14  No: 31945

二つほど質問があります。
・StringGridでエンターキー押下で一つ下のセルに移動したい。
・セルの入力を整数3桁に限定したい

以上教えて下さい。


Ru  2008-09-17 18:05:24  No: 31946

>>・StringGridでエンターキー押下で一つ下のセルに移動したい。
TStringGridのKeyPressイベントで制御すれば出来ると思います。
※注意 Rows より大きくなるとエラーが発生するので工夫してください。

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin

  if Key = #13 then
  begin
    TStringGrid(Sender).Row := TStringGrid(Sender).Row + 1;
  end;

end;

>>・セルの入力を整数3桁に限定したい
TStringGridのKeyPressイベントやOnKeyDownイベント,OnSetEditTextイベント等でで制御すれば出来ると思います。
  1.数値のみ入力できるように制御
  2.3桁を越える場合は入力不可にする


ofZ  2008-09-17 18:50:58  No: 31947

>・StringGridでエンターキー押下で一つ下のセルに移動したい。
Ruさんがすでに回答していますが、挙動的には、KeyPressで処理した方が好き

procedure TForm1.StringGrid1KeyDown(略);
begin
  if Key = VK_RETURN then begin
    if StringGrid1.Row < StringGrid1.RowCount -1 then
      StringGrid1.Row := StringGrid1.Row + 1;
  end;
end;

> ・セルの入力を整数3桁に限定したい
procedure TForm1.StringGrid1KeyPress(略);
begin
  case Key of
    #8:; //backspace
    '0'..'9':begin  //数字のみ
      //ここで長さチェックするなりしたらいい
    end;
  else  //数字以外
    Key := #0;
  end;
end;

# OnKeyDown で「Key := 0」としたら、OnKeyPressも発生しないと
# 思っていたけど、OnKeyPressも発生した。
# こんな仕様だっけ?


KHE00221  2008-09-17 19:37:30  No: 31948

>StringGridでエンターキー押下で一つ下のセルに移動したい。

長さチェックを二人ともなぜかスルーしてるので追加

エンターキーで入力常態になってしまうのでそれを制御しないと
一つ下のセルに移動してすぐ入力常態になってしまうので
エンターキーで入力常態にならないようにしてみた

procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
  var Value: string);
begin
    F1 := False;
    F2 := True;
end;

procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
    case Key of
      #13:
      begin
        if F2 = False then
        begin
          if TStringGrid(Sender).Row < TStringGrid(Sender).RowCount-1 then
          begin
            TStringGrid(Sender).Row := TStringGrid(Sender).Row + 1;
          end;
          Key := #0;
        end;
        F2 := False;
      end;
      #8:
      begin

      end;
      '0'..'9':
      begin
        if F1 = True then Key := Char(0);
      end;
      else
        Key := #0;
     end;
end;

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer;
  const Value: string);
begin
    if Length(Value) > 2 then F1 := True else F1 := False;
end;


ofZ  2008-09-17 23:38:25  No: 31949

あえて突っ込むトコじゃないけど

> 長さチェックを二人ともなぜかスルーしてるので追加

コメント行で指示してみたんだが、書くならこれ

    '0'..'9':begin
      if Length(StringGrid1.Cells[列, 行]) >= 3 then begin
        Key := #0;
      end;
    end;


ttt  2008-09-17 23:46:13  No: 31950

入力制限についてはOnGetEditMaskでもいいんじゃないかと。
(空いた桁がスペースとかで埋められるのを気にしなければですが)
3桁以内の数値だと'990;0'とか返せばいいのかな。


SEIKO  2008-09-18 21:27:39  No: 31951

なんとか実装に成功いたしました。
ありがとうございます。


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

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






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