Fix AV when displaying data of a table which has 0 rows. Mainly caused by range differences of VT.RootNodeCount (Cardinal) and TDBQuery.RecordCount (Int64).

This commit is contained in:
Ansgar Becker
2012-09-30 12:07:52 +00:00
parent d4f5a32fe8
commit 8b51f19ed0
2 changed files with 18 additions and 14 deletions

View File

@ -289,8 +289,8 @@ type
function ComposeOrderClause(Cols: TOrderColArray): String; function ComposeOrderClause(Cols: TOrderColArray): String;
procedure DeInitializeVTNodes(Sender: TBaseVirtualTree); procedure DeInitializeVTNodes(Sender: TBaseVirtualTree);
function ListIndexByRegExpr(List: TStrings; Expression: String): Integer; function ListIndexByRegExpr(List: TStrings; Expression: String): Integer;
function FindNode(VT: TVirtualStringTree; idx: Cardinal; ParentNode: PVirtualNode): PVirtualNode; function FindNode(VT: TVirtualStringTree; idx: Int64; ParentNode: PVirtualNode): PVirtualNode;
procedure SelectNode(VT: TVirtualStringTree; idx: Cardinal; ParentNode: PVirtualNode=nil); overload; procedure SelectNode(VT: TVirtualStringTree; idx: Int64; ParentNode: PVirtualNode=nil); overload;
procedure SelectNode(VT: TVirtualStringTree; Node: PVirtualNode); overload; procedure SelectNode(VT: TVirtualStringTree; Node: PVirtualNode); overload;
function GetVTSelection(VT: TVirtualStringTree): TStringList; function GetVTSelection(VT: TVirtualStringTree): TStringList;
procedure SetVTSelection(VT: TVirtualStringTree; Captions: TStringList); procedure SetVTSelection(VT: TVirtualStringTree; Captions: TStringList);
@ -1618,27 +1618,31 @@ begin
end; end;
function FindNode(VT: TVirtualStringTree; idx: Cardinal; ParentNode: PVirtualNode): PVirtualNode; function FindNode(VT: TVirtualStringTree; idx: Int64; ParentNode: PVirtualNode): PVirtualNode;
var var
Node: PVirtualNode; Node: PVirtualNode;
begin begin
// Helper to find a node by its index // Helper to find a node by its index
Result := nil; Result := nil;
if Assigned(ParentNode) then // Grid.RootNodeCount is unfortunately Cardinal, not Int64.
Node := VT.GetFirstChild(ParentNode) // Work around that as long as VT does not change that.
else if (idx >= Low(Cardinal)) or (idx <= High(Cardinal)) then begin
Node := VT.GetFirst; if Assigned(ParentNode) then
while Assigned(Node) do begin Node := VT.GetFirstChild(ParentNode)
if Node.Index = idx then begin else
Result := Node; Node := VT.GetFirst;
break; while Assigned(Node) do begin
if Node.Index = idx then begin
Result := Node;
break;
end;
Node := VT.GetNextSibling(Node);
end; end;
Node := VT.GetNextSibling(Node);
end; end;
end; end;
procedure SelectNode(VT: TVirtualStringTree; idx: Cardinal; ParentNode: PVirtualNode=nil); overload; procedure SelectNode(VT: TVirtualStringTree; idx: Int64; ParentNode: PVirtualNode=nil); overload;
var var
Node: PVirtualNode; Node: PVirtualNode;
begin begin

View File

@ -4373,7 +4373,7 @@ begin
if not SynMemoFilter.Focused then if not SynMemoFilter.Focused then
vt.SetFocus; vt.SetFocus;
DataGridFocusedNodeIndex := Min(DataGridFocusedNodeIndex, vt.RootNodeCount-1); DataGridFocusedNodeIndex := Min(DataGridFocusedNodeIndex, Int64(vt.RootNodeCount)-1);
SelectNode(vt, DataGridFocusedNodeIndex); SelectNode(vt, DataGridFocusedNodeIndex);
for i:=0 to vt.Header.Columns.Count-1 do begin for i:=0 to vt.Header.Columns.Count-1 do begin
if vt.Header.Columns[i].Text = DataGridFocusedColumnName then begin if vt.Header.Columns[i].Text = DataGridFocusedColumnName then begin