From 1dc71c845d6a8654e39be3417bcd5068cc203b26 Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Sat, 28 Nov 2009 23:13:35 +0000 Subject: [PATCH] Set focus to next available node after deleting one or more rows in datagrid. Fixes issue #1471 --- source/main.pas | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/main.pas b/source/main.pas index e1db75c5..5945405e 100644 --- a/source/main.pas +++ b/source/main.pas @@ -7058,7 +7058,7 @@ end; } function TMainForm.GridPostDelete(Sender: TBaseVirtualTree): Boolean; var - Node: PVirtualNode; + Node, FocusAfterDelete: PVirtualNode; Nodes: TNodeArray; sql: WideString; Affected: Int64; @@ -7066,14 +7066,18 @@ var msg: String; begin Node := Sender.GetFirstSelected; + FocusAfterDelete := nil; sql := 'DELETE FROM '+mask(SelectedTable.Text)+' WHERE'; while Assigned(Node) do begin EnsureChunkLoaded(Sender, Node); sql := sql + ' (' + GetWhereClause(@DataGridResult.Rows[Node.Index], @DataGridResult.Columns) + ') OR'; + FocusAfterDelete := Node; Node := Sender.GetNextSelected(Node); end; + if Assigned(FocusAfterDelete) then + FocusAfterDelete := Sender.GetNext(FocusAfterDelete); sql := Copy(sql, 1, Length(sql)-3); try @@ -7104,6 +7108,10 @@ begin end; SetLength(DataGridResult.Rows, Length(DataGridResult.Rows) - Selected); Sender.DeleteSelectedNodes; + if not Assigned(FocusAfterDelete) then + FocusAfterDelete := Sender.GetLast; + if Assigned(FocusAfterDelete) then + SelectNode(Sender as TVirtualStringTree, FocusAfterDelete); Sender.EndUpdate; end else begin // Should never get called as we block DELETEs on tables without a unique key