Fix issue #664 delete record shows wrong record after delete

This commit is contained in:
Ansgar Becker
2008-08-10 10:46:44 +00:00
parent fe73090f51
commit 5852993d02

View File

@ -5946,10 +5946,10 @@ end;
function TMDIChild.GridPostDelete(Sender: TBaseVirtualTree): Boolean; function TMDIChild.GridPostDelete(Sender: TBaseVirtualTree): Boolean;
var var
Node: PVirtualNode; Node: PVirtualNode;
Nodes: TNodeArray;
sql: WideString; sql: WideString;
Affected: Int64; Affected: Int64;
Selected: Integer; Selected, i, j: Integer;
Offset: Cardinal;
msg: String; msg: String;
begin begin
Node := Sender.GetFirstSelected; Node := Sender.GetFirstSelected;
@ -5978,21 +5978,14 @@ begin
// Fine. Number of deleted rows equals the selected node count. // Fine. Number of deleted rows equals the selected node count.
// In this case, just remove the selected nodes, avoid a full reload // In this case, just remove the selected nodes, avoid a full reload
Sender.BeginUpdate; Sender.BeginUpdate;
Node := Sender.GetFirstSelected; Nodes := Sender.GetSortedSelection(True);
Offset := 0; // Needed to decrease the array index after one element was deleted for i:=High(Nodes) downto Low(Nodes) do begin
while Assigned(Node) do begin for j := Nodes[i].Index to High(FDataGridResult.Rows)-1 do begin
if Node.Index + 1 - Offset < Cardinal(High(FDataGridResult.Rows)) then begin // Move upper rows by one so the selected row gets overwritten
// Delete node somewhere in the middle of the array FDataGridResult.Rows[j] := FDataGridResult.Rows[j+1];
System.Move(
FDataGridResult.Rows[Node.Index + 1 - Offset],
FDataGridResult.Rows[Node.Index - Offset],
(Cardinal(Length(FDataGridResult.Rows)) - (Node.Index - Offset - Cardinal(Low(FDataGridResult.Rows))) - 1) * SizeOf(TGridRow)
);
end; end;
SetLength(FDataGridResult.Rows, Length(FDataGridResult.Rows) - 1);
inc(Offset);
Node := Sender.GetNextSelected(Node);
end; end;
SetLength(FDataGridResult.Rows, Length(FDataGridResult.Rows) - Selected);
Sender.DeleteSelectedNodes; Sender.DeleteSelectedNodes;
Sender.EndUpdate; Sender.EndUpdate;
end else begin end else begin