Я написал приложение C ++ Builder VCL Forms с элементом управления TMonthCalendar под названием 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», требует lvalue типа «unsigned int»
Полный контекст парсера
Assessment2.cpp (359): синтаксический анализ: void _fastcall TformMain :: TMonthCalendarGetMonthInfo (TObject *, длинный без знака, длинный без знака &)
а также
[Ошибка BCC32] Assessment2.cpp (361): E2342 Несоответствие типов в параметре ‘MonthBoldInfo’ (требуется), unsigned int &’, получил «unsigned long»)
Полный контекст парсера
Assessment2.cpp (359): синтаксический анализ: void _fastcall TformMain :: TMonthCalendarGetMonthInfo (TObject *, длинный без знака, длинный без знака &)
ОБНОВИТЬ
Я хочу получить все дни определенного месяца из вектора, а затем установить дни, выделенные жирным шрифтом, с помощью элемента управления 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 *.
Я думаю, это потому, что статический массив требует постоянных времени компиляции и, следовательно, второй код никогда не будет компилироваться. Это можно обойти?
Первые два параметра BoldDays()
в C ++ состоит из одного параметра открытого массива в 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);
Других решений пока нет …