我编写了一个带有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 *'
我认为这是因为静态数组需要编译时常量,因此第二个代码永远不会编译。有办法解决这个问题吗?
答案 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
事件,该事件为您提供Month
和Year
个参数:
vector<appointment> appts = calCalendar.getAllAppointmentsOnMonthOfYear(Month, Year);