我的一个表单有一个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计算机上编译),我有以下问题:
>当单击右箭头(>)切换到下个月时,它大部分时间都会失败.当包含下个月的第一个星期的星期一仍然在上个月时,它实际上失败了.例如:从9月14日到2014年10月的转换失败是因为10月1日之前的星期一是9月(9月29日星期一).
这让我回到九月.
另一方面,从8月14日到9月14日的转换是因为9月1日是星期一.
>当点击下个月的第一天(可以点击的几个灰色的那个)时,月份不再切换.
之前曾经工作的所有东西.
我做了一些特定的隔离测试:
>在XE6下创建具有相同行为的最小应用程序 – >仍然失败(当然)
>在Delphi 2006下创建相同的最小应用程序 – >这一切都按预期工作.
我的直觉是,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
您面临的问题是TMonthCalender控件本身以及哪些日期字段即使在使用多选时也会被选中.
如果你仔细观察,你会注意到,即使有一天使用多选,也总是在它周围加上方形.该日期控制着哪个月的重点.
因此,现在您需要弄清楚如何在启用多个选择的情况下更改该行为.我laredy尝试设置Date和EndDate属性,以便EndDate值实际上更低,因为我认为这样做miygt强制MonthCalendar来处理弱者的最后一天被选中当decrmining哪个月集中但是它没有效果.但它没有效果.
至于查找开始和结束周日期,请使用以下函数:
TempDate := MonthCalendar1.Date; WeekStart := StartOfTheWeek(TempDate); WeekEnd := EndOfTheWeek(TempDate);
这两个函数都将星期一视为一周中的第一天.
我希望我能帮助你更多.