Проблема с недельным хранилищем массива Delphi для системы планирования

У меня есть бланк с календарями. При щелчке по календарям они устанавливают переменную CurDateSel на дату, выбранную в календаре.

У меня есть постоянный массив (неделя), в котором хранятся значения от Monday [индекс 0] до Sunday [индекс 6].

У меня также есть StringGrid, у которого раньше были дни недели, охватывающие верхнюю часть сетки, с воскресенья по понедельник, однако теперь я изменил это, чтобы показать первый столбец сетки как CurDateSel день (Now день, когда форма запускается) и следующие столбцы сетки для хранения дней, следующих за выбранным днем.

Например, если выбрана суббота:

Saturday|Sunday|Monday|Tuesday|Wednesday|Thursday|Friday  

Затем у меня есть процедура, которая просматривает сохраненный список бронирований и добавляет в сетку бронирования с соответствующими днями и датами. Например, если бронирование было в субботу 23-го в 14:00, процедура перейдет к 14:00 по оси Y и перейдет к 5-му столбцу на оси, так как это соответствует субботе в моем массиве WEEK.

Однако, поскольку мои столбцы теперь меняются в соответствии с текущим днем, сохраненные значения бронирования не переходят в соответствующие дни, а переходят в столбцы, которые обычно хранят дни, если столбцы начинаются с понедельника и заканчиваются в воскресенье.

Я решил создать новый массив, в котором будут храниться значения недели, где началом недели будет текущий день, а концом недели будет текущий день + 6 дней. Я назвал этот массив SelDayArray.

Например, если бы была суббота, этот массив начинался бы с Index[0] = Saturday и заканчивался Index[6] = Friday.

Я попытался написать код для заполнения этого второго массива, но, похоже, у меня возникли проблемы с его правильным заполнением.

procedure ReturnUpdatedDay;  
 var  
  i, x, p, CurDayNo: Integer;  
begin  
  i := 0;  
  CurDayNo := ReturnDayCell(FormatDateTime('dddd', CurDateSel));  
  repeat  
    SelDayArray[i] := Week[CurDayNo+i];  
    Inc(i);  
  until (CurDayNo + i) = 7;  
  Dec(i);  
  p := i;  
  for x := 0 to (CurDayNo-p) do  
    begin  
      Inc(i);  
      SelDayArray[i] := Week[x];  
    end;
end;

Моя ReturnDayCell Функция возвращает DayNo в соответствии с фиксированным постоянным массивом массива WEEK. Таким образом, если в качестве текущего дня выбрать субботу, процедура вернет 5, а значение CurDayNo будет = 5

Следовательно, моя ReturnUpdatedDay процедура должна установить значения моего SelDayArray на TheCurrentDay [Index 0] на TheCurrentDay+6 [Index 6]

Это работает для дня «суббота». Когда я распечатываю список в памятке, я получаю значения: суббота, воскресенье, понедельник ... пятница.

Однако, когда я пробую за несколько дней до субботы, я либо получаю сообщение об ошибке нарушения прав доступа, либо последние два дня списка не сохраняются / не распечатываются. Когда я выбираю воскресенье, я получаю сообщение об ошибке нарушения прав доступа.

Пожалуйста, не могли бы кто-нибудь помочь мне понять, что я делаю не так. Приносим извинения за возможные опечатки или вводящую в заблуждение информацию. Спасибо.


person Babah254    schedule 19.02.2013    source источник


Ответы (1)


Оператор mod позволяет вам обращаться к вектору недели циклически, возвращаясь к 0 после 6-го элемента.

Измените свой код на этот:

procedure ReturnUpdatedDay;  
 var  
  I, CurDayNo: Integer;  
begin  
  CurDayNo := ReturnDayCell(FormatDateTime('dddd', CurDateSel));  
  for I := 0 to 6 do
    SelDayArray[I] := Week[(CurDayNo + I) mod 7];  
end;
person jachguate    schedule 19.02.2013