delphi - TMonthCalendar 行为已更改

标签 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计算机上编译)我有以下问题:

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

所有这些以前都是有效的。

我做了一些具体的隔离测试:

  1. 在 XE6 下创建具有相同行为的最小应用 -> 仍然失败(当然)
  2. 在 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/

相关文章:

c#有没有一种简单的方法可以将月份整数转换为名称

delphi - 在 Delphi 中获取 Advantage 数据库查询的进度

svn - 对于小型 Delphi 团队来说,什么是好的版本控制系统?

delphi - ExportAsFixedFormat 的 IgnorePrintAreas 参数好像没有效果

delphi - 如何绘制旋转的圆角矩形

delphi - 我应该如何在 Delphi 应用程序中选择日期和时间范围?

delphi - 如何在 DevExpress QuantumGrid (VCL) 的 onCustomDrawCell 事件中获取列索引

delphi - 如何在Indy中创建可创建文件下载页面?

java - 从用户输入获取星期几

python - 我如何使用python获取上个月和前一年