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
相关产品推荐
相关产品推荐

