LCL: Prevent recursive loop from TreeView OnChange handler when using LockSelectionChangeEvent. Issue #21652.

git-svn-id: trunk@46694 -
This commit is contained in:
juha 2014-10-28 16:16:50 +00:00
parent 003d585583
commit 907903d999
2 changed files with 9 additions and 5 deletions

View File

@ -3113,6 +3113,7 @@ type
FAccessibilityOn: Boolean; FAccessibilityOn: Boolean;
FBackgroundColor: TColor; FBackgroundColor: TColor;
FBottomItem: TTreeNode; FBottomItem: TTreeNode;
FCallingOnChange: Boolean;
FEditingItem: TTreeNode; FEditingItem: TTreeNode;
FExpandSignType: TTreeViewExpandSignType; FExpandSignType: TTreeViewExpandSignType;
FExpandSignSize: integer; FExpandSignSize: integer;

View File

@ -5035,7 +5035,11 @@ end;
procedure TCustomTreeView.Change(Node: TTreeNode); procedure TCustomTreeView.Change(Node: TTreeNode);
begin begin
if Assigned(FOnChange) then FOnChange(Self, Node); if Assigned(FOnChange) then begin
FCallingOnChange := True;
FOnChange(Self, Node);
FCallingOnChange := False;
end;
end; end;
procedure TCustomTreeView.Delete(Node: TTreeNode); procedure TCustomTreeView.Delete(Node: TTreeNode);
@ -5477,8 +5481,8 @@ begin
Exclude(FStates, tvsSelectionChanged); Exclude(FStates, tvsSelectionChanged);
DoSelectionChanged; DoSelectionChanged;
FChangeTimer.Enabled := False; FChangeTimer.Enabled := False;
FChangeTimer.Enabled := True; if not FCallingOnChange then // Prevent recursive loop from OnChange handler.
//debugln('TCustomTreeView.InternalSelectionChanged'); FChangeTimer.Enabled := True;
end; end;
end; end;
@ -5648,8 +5652,7 @@ begin
end; end;
end; end;
procedure TCustomTreeView.WriteDebugReport(const Prefix: string; procedure TCustomTreeView.WriteDebugReport(const Prefix: string; AllNodes: boolean);
AllNodes: boolean);
begin begin
DbgOut('%s%s.WriteDebugReport Self=%p', [Prefix, ClassName, Pointer(Self)]); DbgOut('%s%s.WriteDebugReport Self=%p', [Prefix, ClassName, Pointer(Self)]);
ConsistencyCheck; ConsistencyCheck;