You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在FMX StringGrid中捕获Tab键?避免焦点跳出网格

解决FMX StringGrid右下角单元格忽略Tab键的实现方法

要实现当FMX StringGrid处于右下角单元格时忽略Tab键操作,核心思路是拦截Tab按键事件,判断当前单元格位置后取消默认的焦点跳转行为,具体实现有两种方式:

方式一:自定义StringGrid控件(推荐)

通过继承TStringGrid并重写KeyDown方法,将逻辑封装在控件内部,便于复用:

type
  TCustomStringGrid = class(TStringGrid)
  protected
    procedure KeyDown(var Key: Word; var KeyChar: Char; Shift: TShiftState); override;
  end;

procedure TCustomStringGrid.KeyDown(var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  inherited;
  // 检测是否处于最后一行最后一列且按下Tab键
  if (Key = vkTab) and (Row = RowCount - 1) and (Column = ColumnCount - 1) then
  begin
    Key := 0; // 取消Tab键的默认跳转行为
    SetFocus; // 确保焦点保持在当前单元格
  end;
end;

之后在窗体中使用这个自定义的TCustomStringGrid替代原生TStringGrid即可。

方式二:直接绑定StringGrid的OnKeyDown事件

如果不需要复用控件,也可以直接在窗体的事件处理中实现:

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
var
  TargetGrid: TStringGrid;
begin
  TargetGrid := Sender as TStringGrid;
  // 判断当前单元格位置与按键
  if (Key = vkTab) and (TargetGrid.Row = TargetGrid.RowCount - 1) and (TargetGrid.Column = TargetGrid.ColumnCount - 1) then
  begin
    Key := 0; // 阻止Tab键的默认行为
    TargetGrid.SetFocus;
  end;
end;

补充说明

如果需要同时处理Shift+Tab的反向跳转(比如在第一行第一列时忽略反向Tab),可以在判断中加入Shift状态的检测,例如:

if (Key = vkTab) then
begin
  if (Shift = [ssShift]) and (TargetGrid.Row = 0) and (TargetGrid.Column = 0) then
    Key := 0
  else if (Shift = []) and (TargetGrid.Row = TargetGrid.RowCount - 1) and (TargetGrid.Column = TargetGrid.ColumnCount - 1) then
    Key := 0;
end;

内容的提问来源于stack exchange,提问作者Michael Riley - AKA Gunny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:05:09