From fc3d2bac2a1acd5874a4d6fbe242861ef4c84713 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Fri, 17 Jul 2015 15:11:01 +0200 Subject: [PATCH] Avoid bogus assert after calling wxDatePickerCtrl::SetRange() in wxMSW. If the old value didn't lie inside the new range, it was changed by the native control internally but the value stored by wxDatePickerCtrl itself remained unchanged, resulting in asserts later when the mismatch between them was detected. Closes #13189. --- docs/changes.txt | 1 + include/wx/msw/datectrl.h | 3 +++ src/msw/datectrl.cpp | 16 ++++++++++++++-- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 0807ff4f0b..19bea8eccc 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -158,6 +158,7 @@ wxMSW: - Don't send events for already selected radio popup menu items (Kinaou Hervé). - wxListCtrl::GetItemCount() in wxEVT_LIST_INSERT_ITEM is no longer off by 1. - Don't send bogus root selection events when clicking wxTreeCtrl (sbrowne). +- Avoid bogus assert after calling wxDatePickerCtrl::SetRange(). wxOSX/Cocoa: diff --git a/include/wx/msw/datectrl.h b/include/wx/msw/datectrl.h index e7f8da5c45..aeb3d30830 100644 --- a/include/wx/msw/datectrl.h +++ b/include/wx/msw/datectrl.h @@ -60,6 +60,9 @@ protected: virtual bool MSWAllowsNone() const { return HasFlag(wxDP_ALLOWNONE); } virtual bool MSWOnDateTimeChange(const tagNMDATETIMECHANGE& dtch); +private: + wxDateTime MSWGetControlValue() const; + wxDECLARE_DYNAMIC_CLASS_NO_COPY(wxDatePickerCtrl); }; diff --git a/src/msw/datectrl.cpp b/src/msw/datectrl.cpp index 916fbb37a8..92d7dc0d3f 100644 --- a/src/msw/datectrl.cpp +++ b/src/msw/datectrl.cpp @@ -138,9 +138,8 @@ void wxDatePickerCtrl::SetValue(const wxDateTime& dt) m_date.ResetTime(); } -wxDateTime wxDatePickerCtrl::GetValue() const +wxDateTime wxDatePickerCtrl::MSWGetControlValue() const { -#if wxDEBUG_LEVEL wxDateTime dt; SYSTEMTIME st; if ( DateTime_GetSystemtime(GetHwnd(), &st) == GDT_VALID ) @@ -148,6 +147,14 @@ wxDateTime wxDatePickerCtrl::GetValue() const dt.SetFromMSWSysDate(st); } + return dt; +} + +wxDateTime wxDatePickerCtrl::GetValue() const +{ +#if wxDEBUG_LEVEL + const wxDateTime dt = MSWGetControlValue(); + wxASSERT_MSG( m_date.IsValid() == dt.IsValid() && (!dt.IsValid() || dt == m_date), wxT("bug in wxDateTimePickerCtrl: m_date not in sync") ); @@ -176,7 +183,12 @@ void wxDatePickerCtrl::SetRange(const wxDateTime& dt1, const wxDateTime& dt2) if ( !DateTime_SetRange(GetHwnd(), flags, st) ) { wxLogDebug(wxT("DateTime_SetRange() failed")); + return; } + + // Setting the range could have changed the current control value if the + // old one wasn't inside the new range, so update it. + m_date = MSWGetControlValue(); } bool wxDatePickerCtrl::GetRange(wxDateTime *dt1, wxDateTime *dt2) const