德尔福5:
你写了:
if I use the Vertical Scrollbar slider to move to the top of the DataSet then it shows the first Row in the select color.
即使看起来那样。这并不意味着它也被评估为标记。
您可以使用以下方法对其进行测试:
if dbgridAddr.SelectedRows.CurrentRowSelected then
ShowMessage('selected') else
ShowMessage('NOT selected');
描述
从数据集中删除记录时,位置标记不会自动从列表中删除。
因此,某些位置标记可能无效。
dbgridAddr.SelectedRows.Refresh;
刷新以确保列表仅包含有效条目。
刷新尝试查找数据集中所有在 Items 属性数组中显示为位置标记的记录。
所有数据量不相等的位置标记都将被删除。
如果位置标记无效,则 Refresh 返回一个值True
并使 DBGrid 对象无效,从而触发重绘,在这种情况下,所有无效记录都将被删除。
如果列表中的所有位置标记都应该有效,则 Refresh 返回 值False
。
永远不要从具有这种结构的列表中删除项目。
for i:=0 to whatEver.Count-1 do
whatEver.delete(i);
例如,考虑一个包含 10 个项目的列表。
随便=0 .. 9
如果我们现在在“for循环”中使用i = 1
do whatEver.delete(i);
,
有了这个,我们删除了第二项。
现在whatEver
只是0 .. 8
。
循环被初始化以运行0 to 9
。现在您可以理解如果i = 9
尝试whatEver.delete(i);
访问whatEver
外部0 .. 8
这会导致错误。
另一个例子。
您删除了不正确的记录。
我们将假设。
在lopp 之前,您已经确定了以下项目(数据记录)- 要删除的编号。
#3 , #6 , #8
for i:=0 to whatEver.Count-1 do
if (i=3) OR (i=6) OR (i=8) then whatEver.delete(i);
如果i=3
然后执行以下whatEver.delete(3);
然后
第 4 行现在是第 3
行 第 5 行现在是第 4
行 第 6 行现在是第 5 行
,依此类推
现在有了
if... OR (i=6) then whatEver.delete(6);
你删除了错误的项目,上一行 7 !
书签指针也指向#6,没有刷新。
请不要现在发帖it is better to compare the content
。
for i:=0 to whatEver.Count-1 do
if (whatEver[i] = 'blue') OR (whatEver[i] = 'green') OR (whatEver[i] = 'red')
then whatEver.delete(i);
I know that, it's just an example to show what happens when you delete items from the sequence out.
这样做更好:
for i:= whatEver.Count-1 downto 0 do
whatEver.delete(i);
这样它就从删除的末尾开始。较低的项目保持其有效性。
编辑:
我不知道您使用的是什么 DBGrid 事件?
要测试没有选择,只有滚动。
关闭您的应用程序并重新启动,只滚动 DBGrid。
不要点击进入 DBGrid !
然后按下你的测试按钮。
procedure TForm1.Button2Click(Sender: TObject);
begin
if DBGrid1.SelectedRows.CurrentRowSelected then
begin
ShowMessage('selected');
end else begin
if DBGrid1.SelectedRows.Count>0 then
ShowMessage(' CurrentRow NOT selected'+#13#10+
'A part in your code must have select another row.')
else
ShowMessage('NOT selected');
end;
end;