BoldDays с TMonthCalendar

Я написал приложение 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 *.

Я думаю, это потому, что статический массив требует постоянных времени компиляции и, следовательно, второй код никогда не будет компилироваться. Это можно обойти?

1

Решение

Первые два параметра 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);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]