Fix AV and multiple times called procs since rev 961. PopulateTreeTableList lead to calling LoadDatabaseProperties, which then again lead to the AV in ListTablesDblClick. Reproduction:

1. Doubleclick a table in ListTables
2. Go back to Database tab and doubleclick another table. -> AV
3. Look at the SQL log - shows at least 2 times the SHOW COLUMNS FROM table

This commit sets the behaviour of PopulateTreeTableList + SetSelectedTable to gracefully ignore the change-events of dbtree while adding or deleting tree items. Avoids unwanted cascaded procedure calls in some places.
This commit is contained in:
Ansgar Becker
2007-09-29 23:10:48 +00:00
parent ac8a9e4473
commit f150b336ff
2 changed files with 21 additions and 16 deletions

View File

@ -529,7 +529,7 @@ object MDIChild: TMDIChild
Enabled = False Enabled = False
ImageIndex = 9 ImageIndex = 9
Wrap = True Wrap = True
OnClick = btnDbPropertiesClick OnClick = ListTablesDblClick
end end
object btnDbEmptyTable: TToolButton object btnDbEmptyTable: TToolButton
Left = 0 Left = 0

View File

@ -334,7 +334,6 @@ type
procedure btnQuerySaveSnippetClick(Sender: TObject); procedure btnQuerySaveSnippetClick(Sender: TObject);
procedure SynCompletionProposal1AfterCodeCompletion(Sender: TObject; procedure SynCompletionProposal1AfterCodeCompletion(Sender: TObject;
const Value: String; Shift: TShiftState; Index: Integer; EndToken: Char); const Value: String; Shift: TShiftState; Index: Integer; EndToken: Char);
procedure btnDbPropertiesClick(Sender: TObject);
procedure SynCompletionProposal1CodeCompletion(Sender: TObject; procedure SynCompletionProposal1CodeCompletion(Sender: TObject;
var Value: String; Shift: TShiftState; Index: Integer; EndToken: Char); var Value: String; Shift: TShiftState; Index: Integer; EndToken: Char);
procedure SynCompletionProposal1Execute(Kind: TSynCompletionType; procedure SynCompletionProposal1Execute(Kind: TSynCompletionType;
@ -1942,6 +1941,10 @@ begin
else Exit; else Exit;
end; end;
// Postpone change event handling in tree
DBtree.OnChange := nil;
DBtree.OnChanging := nil;
// Clear children and populate tree with table names. // Clear children and populate tree with table names.
SynSQLSyn1.TableNames.BeginUpdate; SynSQLSyn1.TableNames.BeginUpdate;
cur := ''; cur := '';
@ -1966,6 +1969,11 @@ begin
if SynSQLSyn1.TableNames.IndexOf(s) = -1 then SynSQLSyn1.TableNames.Add(s); if SynSQLSyn1.TableNames.IndexOf(s) = -1 then SynSQLSyn1.TableNames.Add(s);
ds.Next; ds.Next;
end; end;
// Restore change event handlers
DBtree.OnChange := DBtreeChange;
DBtree.OnChanging := DBtreeChanging;
dbtree.Items.EndUpdate; dbtree.Items.EndUpdate;
SynSQLSyn1.TableNames.EndUpdate; SynSQLSyn1.TableNames.EndUpdate;
end; end;
@ -2430,6 +2438,7 @@ begin
NodeData := ListTables.GetNodeData(ListTables.FocusedNode); NodeData := ListTables.GetNodeData(ListTables.FocusedNode);
PopulateTreeTableList; PopulateTreeTableList;
SelectedTable := NodeData.Captions[0]; SelectedTable := NodeData.Captions[0];
ShowTable(SelectedTable);
ShowTableData(SelectedTable); ShowTableData(SelectedTable);
end; end;
end; end;
@ -3842,20 +3851,6 @@ begin
DBMemo1.Scrollbars := ssBoth; DBMemo1.Scrollbars := ssBoth;
end; end;
procedure TMDIChild.btnDbPropertiesClick(Sender: TObject);
var
NodeData : PVTreeData;
begin
if Assigned(ListTables.FocusedNode) then
begin
NodeData := ListTables.GetNodeData(ListTables.FocusedNode);
PopulateTreeTableList;
SelectedTable := NodeData.Captions[0];
ShowTableProperties(SelectedTable);
end;
end;
procedure TMDIChild.btnDbViewDataClick(Sender: TObject); procedure TMDIChild.btnDbViewDataClick(Sender: TObject);
var var
NodeData : PVTreeData; NodeData : PVTreeData;
@ -5502,7 +5497,14 @@ procedure TMDIChild.SetSelectedTable(table: string);
var var
allnodes: TTreeNodes; allnodes: TTreeNodes;
i: integer; i: integer;
procedure RestoreTreeEvents;
begin
DBtree.OnChange := DBTreeChange;
DBtree.OnChanging := DBTreeChanging;
end;
begin begin
DBtree.OnChange := nil;
DBtree.OnChanging := nil;
allnodes := DBTree.Items; allnodes := DBTree.Items;
if allnodes.Count > 0 then begin if allnodes.Count > 0 then begin
// Round 1: Search case-sensitive. // Round 1: Search case-sensitive.
@ -5510,6 +5512,7 @@ begin
for i := 0 to allnodes.Count - 1 do begin for i := 0 to allnodes.Count - 1 do begin
if (allnodes[i].Level = 2) and (allnodes[i].Text = table) then begin if (allnodes[i].Level = 2) and (allnodes[i].Text = table) then begin
allnodes[i].Selected := true; allnodes[i].Selected := true;
RestoreTreeEvents;
exit; exit;
end; end;
end; end;
@ -5518,10 +5521,12 @@ begin
for i := 0 to allnodes.Count - 1 do begin for i := 0 to allnodes.Count - 1 do begin
if (allnodes[i].Level = 2) and (AnsiCompareText(allnodes[i].Text, table) = 0) then begin if (allnodes[i].Level = 2) and (AnsiCompareText(allnodes[i].Text, table) = 0) then begin
allnodes[i].Selected := true; allnodes[i].Selected := true;
RestoreTreeEvents;
exit; exit;
end; end;
end; end;
end; end;
RestoreTreeEvents;
raise Exception.Create('Node ' + table + ' not found in tree.'); raise Exception.Create('Node ' + table + ' not found in tree.');
end; end;