在将我的 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计算机上编译)我有以下问题:
- 当单击右箭头 (>) 切换到下个月时,大多数情况下都会失败。当包含下个月 1 号的一周星期一仍在上个月时,它实际上会失败。例如:从 2014 年 9 月切换到 2014 年 10 月失败,因为 10 月 1 日之前的星期一是 9 月(9 月 29 日星期一)。 这让我回到了九月。 另一方面,从 8 月 14 日切换到 9 月 14 日是可行的,因为 9 月 1 日是星期一。
- 当点击下个月的第一天(您可以点击的几个灰色天)时,该月份不再切换。
所有这些以前都是有效的。
我做了一些具体的隔离测试:
- 在 XE6 下创建具有相同行为的最小应用 -> 仍然失败(当然)
- 在 Delphi 2006 下创建相同的最小应用程序 -> 一切都按预期工作。
我的直觉是,TMonthCalendar 现在采用 .Date 属性来定义要显示的月份,而在 D2006 上它过去采用 .EndDate 属性。 不知道这是 VCL 的演变还是 microsoft 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 控件本身,以及即使使用多选时哪些日期字段也会被视为选定。
如果您仔细观察,您会发现,即使使用多选,有一天也总是在它周围有一个被点缀的方 block 。该日期控制重点关注的月份。
因此,现在您需要弄清楚如何在启用多重选择的情况下更改该行为。我尝试设置 Date 和 EndDate 属性,使 EndDate 值实际上较低,因为我认为这样做会强制 MonthCalendar 在确定重点月份时选择弱项的最后一天,但它没有效果。但没有任何效果。
要查找开始和结束周日期,请使用以下函数:
TempDate := MonthCalendar1.Date;
WeekStart := StartOfTheWeek(TempDate);
WeekEnd := EndOfTheWeek(TempDate);
这两个函数都将星期一视为一周的第一天。
我希望能为您提供更多帮助。
关于delphi - TMonthCalendar 行为已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25648800/