Исправленный вариант PlusMinutes

Вместо итеративного цикла, лучше сразу добавить минуты и обновить все значения одним выражением:

procedure TGORG64Event.PlusMinutes(m: Int64);
var
  totalMinutes, newMinutes, daysToAdd: Int64;
begin
  if m < 1 then Exit; // Если минут нет, ничего не делаем

  // Считаем общее количество минут с начала суток
  totalMinutes := hour * 60 + minute + m;

  // Вычисляем новое количество минут и дней, которые нужно добавить
  newMinutes := totalMinutes mod 1440; // 1440 минут в сутках
  daysToAdd := totalMinutes div 1440;  // Сколько суток прибавить

  // Обновляем время
  hour := newMinutes div 60;
  minute := newMinutes mod 60;

  // Корректируем дату
  PlusDays(daysToAdd);
end;

✅ Что изменилось?

    Теперь все минуты считаются сразу, а не по одной.
    Если добавленные минуты приводят к смене дня, то корректно увеличивается день.
    Используется PlusDays(daysToAdd) для правильного перехода между датами.

Исправленный вариант PlusHours

Аналогично можно оптимизировать PlusHours, чтобы избежать ошибок:

procedure TGORG64Event.PlusHours(h: Int64);
var
  totalHours, newHours, daysToAdd: Int64;
begin
  if h < 1 then Exit;

  // Считаем общее количество часов
  totalHours := hour + h;

  // Вычисляем новое количество часов и дней, которые нужно добавить
  newHours := totalHours mod 24;
  daysToAdd := totalHours div 24;

  // Обновляем значения
  hour := newHours;

  // Корректируем дату
  PlusDays(daysToAdd);
end;


//procedure TGORG64Event.AdjustMonth(DeltaMonths: Int64);
//var
//  TotalMonths,tmpmonth: Int64;
//begin
//  // Оптимизируем пересчёт месяцев и лет
//  TotalMonths := month + DeltaMonths;
//  year := year + (TotalMonths div 12);
//  tmpmonth := TotalMonths mod 12;
//  if tmpmonth <= 0 then
//  begin
//    Dec(year);
//    month := 12 + tmpmonth;
//  end;
//day := 1;
//end;