Fix firing an OnChange and setting Modified when setting Text inside OnChange and new Text = old Text. Issue #0032602.

git-svn-id: trunk@56181 -
This commit is contained in:
bart 2017-10-25 09:26:50 +00:00
parent 9823f61682
commit c5637ad72a
3 changed files with 11 additions and 6 deletions

View File

@ -81,7 +81,7 @@ begin
BorderStyle := bsSingle;
FAutoSelect := True;
FAutoSelected := False;
FTextChangedByRealSetText := False;
FTextChangedByRealSetTextCounter := 0;
AutoSize := True;
// Accessibility
AccessibleRole := larTextEditorSingleline;
@ -548,10 +548,11 @@ begin
if (FEmulatedTextHintStatus=thsShowing) and (AValue<>'') then
HideEmulatedTextHint;
FTextChangedByRealSetText := True;
Inc(FTextChangedByRealSetTextCounter);
Modified := False;
inherited RealSetText(AValue);
FTextChangedByRealSetText := False;
Dec(FTextChangedByRealSetTextCounter);
if (FTextChangedByRealSetTextCounter < 0) then FTextChangedByRealSetTextCounter := 0;
if (FEmulatedTextHintStatus=thsHidden) and CanShowEmulatedTextHint then
ShowEmulatedTextHint;
@ -601,7 +602,7 @@ begin
begin
if ([csLoading,csDestroying]*ComponentState=[]) then
begin
if not FTextChangedByRealSetText then
if (FTextChangedByRealSetTextCounter = 0) then
Modified := True;
Change;
end;

View File

@ -8297,7 +8297,11 @@ begin
begin
WSSetText(AValue);
InvalidatePreferredSize;
inherited RealSetText(AValue);
//don't call inherited (=TControl.)RealSetText(AValue) since it can issue a
//second OnChange if RealSetText is called from within OnChange (#0032602)
//instead just update FCaption.
//WSSetText already makes sure an OnChange will be performed
FCaption := AValue;
AdjustSize;
end
else inherited RealSetText(AValue);

View File

@ -729,7 +729,7 @@ type
FOnChange: TNotifyEvent;
FSelLength: integer;
FSelStart: integer;
FTextChangedByRealSetText: Boolean;
FTextChangedByRealSetTextCounter: Integer;
FTextHint: TTranslateString;
procedure ShowEmulatedTextHint(const ForceShow: Boolean = False);
procedure HideEmulatedTextHint;