使用TMonthCalendar的BoldDays

时间:2012-10-09 06:25:41

标签: c++ c++builder monthcalendar

我编写了一个带有TMonthCalendar控件的C ++ Builder VCL Forms应用程序,名为TMonthCalendar。

我希望将控件的某些日子设置为粗体。

这是我目前的代码:

TMonthCalendar->BoldDays([1,8], MonthBoldInfo);

但是我收到以下错误:

E2193 Too few parameters in call to '_fastcall TCommonCalendar::BoldDays(unsigned int *,const int,unsigned int &)'

我可以帮忙做一下吗?

以下是文档的链接:http://docwiki.embarcadero.com/Libraries/XE3/en/Vcl.ComCtrls.TMonthCalendar.OnGetMonthInfo

我发现我的代码和文档没有区别。但我仍然会遇到错误。

感谢

更新

我正在尝试以下代码:

unsigned int arr[2] = {1,8};
TMonthCalendar->BoldDays(arr, 1, MonthBoldInfo);

然而我收到以下错误:

  

[BCC32错误] Assessment2.cpp(361):E2357使用'unsigned long'初始化的引用,需要'unsigned int'类型的左值     完整的解析器上下文       Assessment2.cpp(359):解析:void _fastcall TformMain :: TMonthCalendarGetMonthInfo(TObject *,unsigned long,unsigned long&)

  

[BCC32错误] Assessment2.cpp(361):E2342参数'MonthBoldInfo'中的类型不匹配(想要'unsigned int&',得到'unsigned long')     完整的解析器上下文       Assessment2.cpp(359):解析:void _fastcall TformMain :: TMonthCalendarGetMonthInfo(TObject *,unsigned long,unsigned long&)

更新

我想从向量中检索某个月的所有日子,然后通过TMonthCalendar控件将日期设置为粗体。

这是我的代码:

vector<appointment> appointmentsOnMonth = calCalendar.getAllAppointmentsOnMonth(TMonthCalendar->Date);
if (appointmentsOnMonth.size() > 0)
{
    unsigned int arr[appointmentsOnMonth.size()];
    for (int i = 0; i < appointmentsOnMonth.size(); i++)
    {
        int dayOfAppointment = DayOf(appointmentsOnMonth[i].getAppDateTime());
        arr[i] = dayOfAppointment;
    }
    TMonthCalendar->BoldDays(arr, 1, reinterpret_cast<unsigned int&>(MonthBoldInfo));
}

dayOfAppointment变量正常工作,并将值作为应以粗体显示的天数的整数。我正在寻求帮助,请将这些日子展示为大胆的日子。

我收到一些与unsigned int arr []有关的错误并显示粗体日。 他们在这里:

  

[BCC32错误] Assessment2.cpp(366):E2313需要常量表达式   [BCC32错误] Assessment2.cpp(372):E2034无法将'int [1]'转换为'unsigned int *'

我认为这是因为静态数组需要编译时常量,因此第二个代码永远不会编译。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

C ++中BoldDays()的前两个参数由Delphi中的单个开放数组参数组成。开放数组由数据指针和指向的数据的最大索引组成。在C ++中,您不能使用[1,8]语法。那就是Delphi语法。在C ++中,请使用ARRAYOFCONST()OPENARRAY()宏,例如:

TMonthCalendar->BoldDays(ARRAYOFCONST((1,8)), MonthBoldInfo);

或者:

TMonthCalendar->BoldDays(OPENARRAY(unsigned int, (1,8)), MonthBoldInfo);

或者,只需使用您自己的数组手动声明参数值:

unsigned int arr[2] = {1,8};
TMonthCalendar->BoldDays(arr, 1, MonthBoldInfo);

更新MonthBoldInfo活动的OnGetMonthInfo参数为unsigned long&,但BoldDays()代替unsigned int&。通过引用传递值时,数据类型需要匹配。你有两个选择:

1)使用中间变量:

unsigned int arr[2] = {1,8};
unsigned int days;
TMonthCalendar->BoldDays(arr, 1, days);
MonthBoldInfo = days;

2)使用类型转换:

unsigned int arr[2] = {1,8};
TMonthCalendar->BoldDays(arr, 1, reinterpret_cast<unsigned int&>(MonthBoldInfo));

更新:您无法使用运行时值声明静态固定长度数组。您必须使用动态分配的数组。由于您已经在使用std::vector,因此您可以将其用于数组:

vector<appointment> appts = calCalendar.getAllAppointmentsOnMonth(TMonthCalendar->Date);
if (!appts.empty())
{
    vector<unsigned int> arr(appts.size());
    for (vector<appointment>::iterator i = appts.begin(); i != appts.end(); ++i)
    {
        arr[i] = DayOf(i->getAppDateTime());
    }
    TMonthCalendar->BoldDays(&arr[0], arr.size()-1, reinterpret_cast<unsigned int&>(MonthBoldInfo));
}

话虽如此,OnGetMonthInfo事件用于检索所有年份中给定月份的粗体日,即重复发生的事件,因此使用TMonthCalendar::Date是没有意义的像你这样的财产。您应该使用提供的Month参数:

vector<appointment> appts = calCalendar.getAllAppointmentsOnMonth(Month);

要设置特定年份的特定月份的加粗日期,请改为使用OnGetMonthBoldInfo事件,该事件为您提供MonthYear个参数:

vector<appointment> appts = calCalendar.getAllAppointmentsOnMonthOfYear(Month, Year);