TMonthCalendar行为已更改

时间:2014-09-03 15:59:12

标签: delphi vcl monthcalendar

在将我的一个Win32 VCL应用程序从Delphi 2006迁移到delphi XE6的过程中,我遇到了以下问题:

我的一个表单有一个TMonthCalendar(插入TPanel用于记录),以帮助用户选择一周在图表中查看。按周我的意思是星期一是第一天,星期日是最后一天(法国语言环境)。为了实现这样的周选择模式,我将multiSelect属性设置为true,并将以下代码放在CalendarClick事件中:

MonthCalendar1.MultiSelect := True;
//Temporarily storing the selected day in a variable
TempoDate := MonthCalendar1.Date;

//searching for the monday right before the selected day (by user)
while dayOfWeek(TempoDate) <> 2 do
  TempoDate := IncDay( TempoDate , -1 );

//Setting the monday as the start date of the selection
MonthCalendar1.Date := TempoDate;
//Setting the Sunday as the last day of selection
MonthCalendar1.EndDate := IncDay(tempoDate, 6);

以前在Delphi 2006上运行良好(在win XP计算机上编译)。 现在我已将相同的代码移植到Delphi XE6(在win7计算机上编译),我遇到以下问题:

  • 单击右箭头(&gt;)切换到下个月时,大部分时间都会失败。当包含下个月的第一个星期的星期一仍然在上个月时,它实际上失败了。例如:从9月14日到2014年10月的转换失败是因为10月1日之前的星期一是9月(9月29日星期一)。 这让我回到九月。 另一方面,从8月14日到9月14日的转换是因为9月1日是星期一。
  • 点击下个月的第一天(可以点击的几个灰色的月份),月份不再切换。

之前曾经工作过的所有事情。

我做了一些特定的隔离测试:

  1. 在XE6下创建具有相同行为的最小应用程序 - &gt;仍然失败(当然)
  2. 在Delphi 2006下创建相同的最小应用程序 - &gt;这一切都按预期工作。
  3. 我的直觉是,TMonthCalendar现在使用.Date属性来定义要显示的月份,而在D2006上,它使用.EndDate属性。 不知道这是VCL演变还是微软的MonthCalendar底层组件行为改变(因为我在XP上编译然后SEVEN)。

    感谢您的帮助

    有用的文档:

    http://docwiki.embarcadero.com/Libraries/XE7/en/Vcl.ComCtrls.TMonthCalendar  http://msdn.microsoft.com/en-us/library/system.windows.forms.monthcalendar(v=vs.110).aspx

1 个答案:

答案 0 :(得分:1)

不幸的是,我无法为您提供解决方案,但我已经为当前行为提供了解释。

您面临的问题是TMonthCalender控件本身以及即使使用多选也将哪些日期字段作为选中状态进行处理。
如果你仔细观察,你会注意到,即使有一天使用多选,也总是在它周围加上方形。该日期控制着哪个月的重点 因此,现在您需要弄清楚如何在启用多个选择的情况下更改该行为。我laredy尝试设置Date和EndDate属性,以便EndDate值实际上更低,因为我认为这样做miygt强制MonthCalendar来处理弱者的最后一天被选中当decrmining哪个月集中但是它没有效果。但它没有效果。

至于查找开始和结束周日期,请使用以下函数:

TempDate := MonthCalendar1.Date;
WeekStart := StartOfTheWeek(TempDate);
WeekEnd := EndOfTheWeek(TempDate);

这两个函数都将星期一视为一周的第一天。

我希望我能帮助你更多。