0

Just found a weirdness with D5 and/or Zeos. I have a TDBgrid and DataSet.

I have a "Delete" function to delete selected Rows of the DBGrid.

If I Ctlr-Left-click to select Row (or Rows) it all works fine, but...

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 do not click the top line, (it already looks selected) then click "Delete" it crashes. Stepping through the code, at the first line SelectedRows.Count displays "1" but then at the Bookmark line I get a "Bookmark not found error" If I first click on the already selected Row after using the slider, then this does not crash.

for i:=0 to dbgridAddr.SelectedRows.Count-1 do
begin
  dbgridAddr.DataSource.DataSet.GotoBookmark(pointer(dbgridAddr.SelectedRows.Items[i]));

How can I fix this ?

Thanks

4

2 回答 2

1

我想回答有点晚了,但也许其他人会发现它很有用。问题是当您在 DbGrid 的边界内单击时,即使不是 .

将此添加到 DBGrid 的 OnDrawColumnCell 事件处理程序中:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; 
                     DataCol: Integer; Column: TColumn; State: TGridDrawState); 
begin  
    // Only highlight the row if it is actually selected
    if TDBGrid(Sender).SelectedRows.CurrentRowSelected  then
    begin
      TDBGrid(Sender).Canvas.Brush.Color := clHighlight;
      TDBGrid(Sender).Canvas.Font.Style := Font.Style + [fsBold];
      TDBGrid(Sender).Canvas.Font.Color := clHighlightText;
    end
    else
    begin
      TDBGrid(Sender).Canvas.Brush.Color := clBtnFace;
      TDBGrid(Sender).Canvas.Font.Style := Font.Style - [fsBold];
      TDBGrid(Sender).Canvas.Font.Color := clWindowText;
    end;  
    // Commit drawing
    TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

如果您希望在使用箭头键时能够在网格中看到光标位置,请添加这样的块

    else if (gdSelected in State) then
    begin
      TDBGrid(Sender).Canvas.Brush.Color := clBtnFace;
      TDBGrid(Sender).Canvas.Font.Style := Font.Style + [fsBold];
      TDBGrid(Sender).Canvas.Font.Color := clWindowText;
    end
于 2021-01-26T09:24:36.990 回答
0

德尔福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 = 1do 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;

在此处输入图像描述

于 2013-04-06T15:06:10.323 回答