二つほど質問があります。
・StringGridでエンターキー押下で一つ下のセルに移動したい。
・セルの入力を整数3桁に限定したい
以上教えて下さい。
>>・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桁を越える場合は入力不可にする
>・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も発生した。
# こんな仕様だっけ?
>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;
あえて突っ込むトコじゃないけど
> 長さチェックを二人ともなぜかスルーしてるので追加
コメント行で指示してみたんだが、書くならこれ
'0'..'9':begin
if Length(StringGrid1.Cells[列, 行]) >= 3 then begin
Key := #0;
end;
end;
入力制限についてはOnGetEditMaskでもいいんじゃないかと。
(空いた桁がスペースとかで埋められるのを気にしなければですが)
3桁以内の数値だと'990;0'とか返せばいいのかな。
なんとか実装に成功いたしました。
ありがとうございます。
ツイート | ![]() |