当前位置 : 主页 > 编程语言 > delphi >

delphi – TMonthCalendar行为发生了变化

来源:互联网 收集:自由互联 发布时间:2021-06-23
在将我的一个Win32 VCL应用程序从Delphi 2006迁移到delphi XE6的过程中,我遇到了以下问题: 我的一个表单有一个TMonthCalendar(插入TPanel用于记录),以帮助用户选择一周在图表中查看.按周我的意
在将我的一个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计算机上编译),我有以下问题:

>当单击右箭头(>)切换到下个月时,它大部分时间都会失败.当包含下个月的第一个星期的星期一仍然在上个月时,它实际上失败了.例如:从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);

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

我希望我能帮助你更多.

网友评论