mirror of
https://github.com/HeidiSQL/HeidiSQL.git
synced 2025-08-26 11:17:57 +08:00
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:
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user