Skip to main content

DevExpress v24.2 Update — Your Feedback Matters

Our What's New in v24.2 webpage includes product-specific surveys. Your response to our survey questions will help us measure product satisfaction for features released in this major update and help us refine our plans for our next major release.

Take the survey Not interested

How to Convert the cxGetRecurrenceDescriptionString Routine From Delphi Into C++ Code

  • 3 minutes to read

If you need to change information provided by the cxGetRecurrenceDescriptionString routine (for example, for the localization purposes), implement a custom routine instead.

To inform a scheduler that a new routine is to be invoked in the application, use the cxGetRecurrenceDescriptionStringProc constant.

The following example demonstrates how to implement this routine in C++ code:

C++
// ... 
AnsiString __fastcall <Form>::cxMyGetRecurrenceDescriptionString(TcxSchedulerEventRecurrenceInfo *ARecurrenceInfo, bool  AFullDescription = false)
{
   const AnsiString Weeks[] = {"first", "second", "third", "fourth", "last"};
   const AnsiString EveryMonths1[]  = {"day %d of every %d months", "day %d of every month"};
   const AnsiString EveryMonths2[]  = {"the %s %s of every %d months", "the %s %s of every month"};
   AnsiString GetDateParts(AnsiString &ADayStr, &AWeekStr){
     if ((ARecurrenceInfo->DayNumber >= 1)||(ARecurrenceInfo->DayNumber <= 5)){
       AWeekStr = Weeks[DayNumber];
      }
     else {
       AWeekStr = "";
     };
     if (ARecurrenceInfo->DayType == cxdtEveryDay){
       ADayStr = "day";
     }
     else if (ARecurrenceInfo->DayType == cxdtWeekDay){
       ADayStr = "weekday";
     }
     else if (ARecurrenceInfo->DayType == cxdtWeekEndDay){
       ADayStr = "weekend day";
     }
     else {
       ADayStr = LongDayNames[(int)DayType) - (int)cxdtSunday + 1];
     }
   }
   AnsiString OccurDaysToString(){
     TDay * ADay;
     int ACount, ASaveCount;
     AnsiString  Result;
     ACount = 0;
     for (int I = 0; I < 7; I++) {
       if (ARecurrenceInfo->OccurDays->Contains(ADay)) {
         ACount++
       }
     }
     ASaveCount = ACount;
     for (int I = 0; I < 7; I++) {
       if (ARecurrenceInfo->OccurDays->Contains(ADay)) {
         if (ASaveCount == 1){
           Result = LongDayNames[(int)ADay + 1];
         }
         else {
            ACount--;
            if (ACount > 1){
              Result = "" + LongDayNames[(int)ADay + 1] + ", " ;
             }
            else if (ACount == 1){
              Result = "" + LongDayNames[(int)ADay + 1] + " " ;
            }
            else {
              Result = "and " + LongDayNames[(int)ADay + 1];
             }
         }
       }
     }
     return Result;
   };
  AnsiString  GetTimeBounds(TcxSchedulerEvent *APattern){
    AnsiString  Result;
     if ((APattern->AllDayEvent) && (APattern->Duration == 1))
       Result = "";
     if (APattern->Duration < 1)
       Result = " from " + FormatDateTime("t", APattern->Start) + " to " + FormatDateTime("t", APattern->Finish)
     else
       Result= " from " + FormatDateTime("t", APattern->Start) + " for " + cxMinutesToTextProc(Floor(APattern->Duration / MinuteToTime));
    return Result;
  }
  String GetDateBounds(TcxSchedulerEvent *APattern: TcxSchedulerEvent){
    if (ARecurrenceInfo->Count) >= 0)
      return " effective " + FormatDateTime("ddddd", ARecurrenceInfo->Start) + " until " + FormatDateTime("ddddd", ARecurrenceInfo->GetEndDate)
    else
      return " effective " + FormatDateTime("ddddd", ARecurrenceInfo->Start);
  };
  AnsiString ADayStr, AWeekStr, AMonthStr, Result;
  TcxSchedulerEvent  *APattern;
  if ((ARecurrenceInfo == NULL)||(!(ARecurrenceInfo->Event->IsRecurring))){
    return "";
  }
  switch (ARecurrenceInfo->Recurrence){
    cxreDaily:
      if (ARecurrenceInfo->DayType == Cxschedulerstorage::cxdtWeekDay){
        Result = "every weekday";
      }
      else {
        if (ARecurrenceInfo->Periodicity == 1)
          Result = Format("every %d days", ARRAYOFCONST((ARecurrenceInfo->Periodicity)))
        else
          Result = Format("every day", ARRAYOFCONST((ARecurrenceInfo->Periodicity)));
      };
    break;
    cxreWeekly:
      if (ARecurrenceInfo->DayType ==  1)
        Result = "every " + OccurDaysToString;
      else {
        Result = Format("every %d weeks on %s", ARRAYOFCONST((ARecurrenceInfo->Periodicity, OccurDaysToString)));
    break;
    cxreMonthly:
      if (ARecurrenceInfo->DayType == Cxschedulerstorage::cxdtDay){
        if (ARecurrenceInfo->Periodicity == 1)
          Result = Format(EveryMonths1[0], ARRAYOFCONST((ARecurrenceInfo->DayNumber, ARecurrenceInfo->Periodicity)))
        else
          Result = Format(EveryMonths1[1], ARRAYOFCONST((ARecurrenceInfo->DayNumber, ARecurrenceInfo->Periodicity)));
      }
      else {
        GetDateParts(ADayStr, AWeekStr);
        if (ARecurrenceInfo->Periodicity == 1)
          Result = Format(EveryMonths2[0], ARRAYOFCONST((AWeekStr, ADayStr, ARecurrenceInfo->Periodicity)))
        else
          Result = Format(EveryMonths2[1], ARRAYOFCONST((AWeekStr, ADayStr, ARecurrenceInfo->Periodicity)));
      };
    break;
    cxreYearly:
      if ((ARecurrenceInfo->Periodicity >= 1)&&(ARecurrenceInfo->Periodicity <= 12)){
        AMonthStr = LongMonthNames[ARecurrenceInfo->Periodicity];
      }
      else {
        AMonthStr = "";
      }
      if (ARecurrenceInfo->DayType == Cxschedulerstorage::cxdtDay){
        Result = Format(("every %s %d", ARRAYOFCONST((AMonthStr, ARecurrenceInfo->DayNumber)));
      }
      else {
        ADayStr = GetDateParts(ADayStr, AWeekStr);
        Result = Format("the %s %s of %s", ARRAYOFCONST((AWeekStr, ADayStr, AMonthStr)));
      }
  }
  if (ARecurrenceInfo->Event->EventType == Cxschedulerstorage::etPattern){
      APattern = ARecurrenceInfo->Event;
  }
  else {
    APattern = ARecurrenceInfo->Event->Pattern;
    if (APattern == NULL){
      APattern = ARecurrenceInfo->Event;
    }
  }
  if (AFullDescription){
    return Result + "Occurs " + GetDateBounds(APattern) + GetTimeBounds(APattern) + '.';
  }
  else {
    return Result + GetTimeBounds(APattern);
  }
}
See Also