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

Delphi7中如何通过代码获取单列StringGrid当前可视首行对应数据项

实现方法

Delphi 7 的 TStringGrid 控件自带TopRow属性,返回当前可见区域第一行的控件内行索引(从0开始计数),结合你的数据填充逻辑即可直接获取对应原始条目,分两种常见实现场景说明:

场景1:全量数据加载到StringGrid

如果你是把100条数据全部填充到控件中,仅界面可见行数为50行,直接通过以下代码获取:

var
  OriginalIndex: Integer;
  FirstItem: string;
begin
  OriginalIndex := StringGrid1.TopRow;
  // 如果设置了固定行(表头),索引需要减去FixedRows:
  // OriginalIndex := StringGrid1.TopRow - StringGrid1.FixedRows;
  
  // 直接取控件单元格内容
  FirstItem := StringGrid1.Cells[0, StringGrid1.TopRow];
  // 如果你有独立的原始数据容器,直接取 原始数据列表[OriginalIndex] 即可
end;

需要实时监听滚动变化的话,把上述逻辑放到TStringGrid的OnTopRowChanged事件中即可,只要第一可见行变动就会触发。

场景2:固定RowCount=50的虚拟滚动实现

符合你描述的「RowCount设为50、关联100条数据」的配置,属于虚拟滚动动态加载的实现,你需要提前维护两个类成员变量:

  • 存储全量100条数据的容器,比如FAllData: array[0..99] of string;或TStringList、自定义列表类
  • 滚动偏移量变量FCurrentOffset: Integer,初始值为0,代表StringGrid第0行对应原始数据的第FCurrentOffset条

你需要在控件的OnScroll滚动事件、导航按键OnKeyDown事件中更新FCurrentOffset的值,取值范围控制在0到50之间(总数据量 - 控件RowCount),每次偏移变动后刷新控件的50行内容。

此时获取第一行对应原始条目的代码如下:

var
  FirstOriginalItem: string;
begin
  FirstOriginalItem := FAllData[FCurrentOffset];
end;

内容的提问来源于stack exchange,提问作者user3450717

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:51:04