From ab2ef6e0e6886a5ef0861399125075a9cba75508 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 22 Jun 2011 22:58:11 +0000 Subject: [PATCH] Fix bug with out of range date in wxMSW wxDatePickerCtrl under XP too. The bug fix of r67990 relied on DateTime_SetSystemtime() returning FALSE if setting the date failed but, unfortunately, this function doesn't behave correctly under XP (and presumably earlier systems) and returns TRUE even if it didn't actually change the date because it was out of range. Implement an alternative solution not relying on this function return value but simply checking the range ourselves. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@68027 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/datectrl.cpp | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/msw/datectrl.cpp b/src/msw/datectrl.cpp index 2bf4df09b2..c544e32251 100644 --- a/src/msw/datectrl.cpp +++ b/src/msw/datectrl.cpp @@ -188,22 +188,39 @@ void wxDatePickerCtrl::SetValue(const wxDateTime& dt) SYSTEMTIME st; if ( dt.IsValid() ) - dt.GetAsMSWSysTime(&st); - if ( !DateTime_SetSystemtime(GetHwnd(), - dt.IsValid() ? GDT_VALID : GDT_NONE, - &st) ) { - // Attempts to set the date outside of the valid range should fail so - // there is nothing unexpected if they do but still log a message if we - // failed for some other reason. + // Don't try setting the date if it's out of range: calendar control + // under XP (and presumably all the other pre-Vista Windows versions) + // doesn't return false from DateTime_SetSystemtime() in this case but + // doesn't actually change the date, so we can't update our m_date + // unconditionally and would need to check whether it was changed + // before doing it. It looks simpler to just check whether it's in + // range here instead. + // + // If we ever drop support for XP we could rely on the return value of + // DateTime_SetSystemtime() but this probably won't happen in near + // future. wxDateTime dtStart, dtEnd; GetRange(&dtStart, &dtEnd); - if ( (!dtStart.IsValid() || dt >= dtStart) && - (!dtEnd.IsValid() || dt <= dtEnd) ) + if ( (dtStart.IsValid() && dt < dtStart) || + (dtEnd.IsValid() && dt > dtEnd) ) { - wxLogDebug(wxT("DateTime_SetSystemtime() unexpectedly failed")); + // Fail silently, some existing code relies on SetValue() with an + // out of range value simply doing nothing -- so don't. + return; } + dt.GetAsMSWSysTime(&st); + } + + if ( !DateTime_SetSystemtime(GetHwnd(), + dt.IsValid() ? GDT_VALID : GDT_NONE, + &st) ) + { + // The only expected failure is when the date is out of range but we + // already checked for this above. + wxFAIL_MSG( wxT("Setting the calendar date unexpectedly failed.") ); + // In any case, skip updating m_date below. return; } -- 2.45.2