Delphi 11.1 FMX StringGrid如何设置列KeyboardType为数字类型(Android端)
Delphi 11.1 FireMonkey Android 平台设置StringGrid指定列弹出数字键盘实现方法
FireMonkey自带的TStringGrid列类默认没有直接暴露KeyboardType属性,可通过以下两种方式实现指定列弹出数字软键盘,均在Android平台实测可用:
方法一:通过OnGetEdit事件快速实现(无需自定义类)
该方法不需要额外写自定义组件,适合快速修改现有项目:
- 选中窗体上的目标StringGrid控件,在事件面板找到
OnGetEdit事件,双击生成事件处理方法 - 在事件中判断当前编辑的列序号,给目标列的编辑控件设置数字键盘类型,非目标列恢复默认键盘(避免控件复用导致的键盘类型错乱)
- 参考代码如下:
procedure TMainForm.OrderGridGetEdit(Sender: TObject; ACol, ARow: Integer; AControl: TStyledControl); begin // 示例:设置第3列(列索引从0开始计数,这里索引2对应界面上第三列)为数字键盘 if ACol = 2 then begin if AControl is TEdit then begin // 纯数字输入选TVirtualKeyboardType.Number,需要输入小数点/负号选NumbersAndPunctuation TEdit(AControl).KeyboardType := TVirtualKeyboardType.Number; end; end else begin // 其余列恢复默认文本键盘 if AControl is TEdit then TEdit(AControl).KeyboardType := TVirtualKeyboardType.Default; end; end;
注意:FireMonkey的StringGrid会复用单元格编辑控件,必须给非目标列重置键盘类型,否则编辑其他列时会继承之前设置的数字键盘,出现异常。
方法二:自定义可复用数字列类
如果项目里多处需要数字输入的StringGrid列,可以自定义列类,避免重复写事件判断:
- 先定义继承自TStringColumn的数字列类,重写创建单元格控件的方法,初始化时直接指定键盘类型
type TNumberStringColumn = class(TStringColumn) protected function CreateCellControl: TStyledControl; override; end; function TNumberStringColumn.CreateCellControl: TStyledControl; var LEditor: TEdit; begin Result := inherited; if Result is TEdit then begin LEditor := TEdit(Result); LEditor.KeyboardType := TVirtualKeyboardType.NumbersAndPunctuation; // 可根据需求加输入过滤,比如限制只能输入数字和小数点 LEditor.FilterChar := '0123456789.'; end; end;
- 在窗体初始化阶段,把StringGrid中需要设置数字键盘的列替换为自定义的数字列即可:
procedure TMainForm.FormCreate(Sender: TObject); var LNumCol: TNumberStringColumn; begin LNumCol := TNumberStringColumn.Create(OrderGrid); LNumCol.Header := '金额'; // 替换为原列的标题、宽度等属性 LNumCol.Width := 120; // 替换目标位置的列,示例为替换索引2的列 OrderGrid.Columns[2] := LNumCol; end;
- 以上两种方法都不需要额外调用Android原生API,Delphi FireMonkey框架会自动将KeyboardType属性映射为Android原生EditText的
inputType属性,自动弹出对应类型的软键盘。 - 如果测试时发现键盘类型未生效,优先检查列索引是否填写正确,是否有其他业务逻辑在编辑触发时重新修改了编辑控件的KeyboardType属性。
内容的提问来源于stack exchange,提问作者user741461
相关产品推荐
相关产品推荐

