Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ListView, TObjectList в программе "Будильник", Проверка на срабатывание и удаление 
:(
    Опции темы
CasperSC
Дата 27.11.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Всё, что в коде имеет в начале букву F, это поля объекта TClock

Есть TObjectList , TClock и TListView, когда создаю будильник нажатием на кнопку “Новый”, то создаётся будильник:
Для полного понимания моего вопроса

Код

procedure TForm1.BtnNewClockClick(Sender: TObject);
var Alarm : TClock;
    IndexAlarms : integer;
begin
  FormNewClock := TFormNewClock.Create(self);
  FormNewClock.RadBut_1Raz.Checked := True;
  FormNewClock.ReserveVolume := FormNewClock.GetVolume; //зарезервировать текущую громкость звука
 try
  if FormNewClock.ShowModal = mrOK then //если в FormNewClock нажали "ОК" то выполняется код
  begin
    Alarm := TClock.CreateClock;
    FormNewClock.SetData(Alarm); //получить настройки будильника из формы FormNewClock
    IndexAlarms :=  Alarms.Add(Alarm);
    Label2.Caption := 'Индекс в массиве:'+ IntToStr(Alarms.IndexOf(Alarm));
if (Alarm.FMode = ONE_ALARM) then
begin
    with ListViewAlarm.Items.Add do
    begin
      Caption := Alarm.FTextMessage;
      SubItems.Add(DateToStr(FormNewClock.DatePicker.Date));
      SubItems.Add(TimeToStr(FormNewClock.TimePicker.Time));
      SubItems.Add(Alarm.FPeriodAlarm);//добавляется периодичность срабатывания
      Data := Pointer(Alarms[IndexAlarms]); //ВОТ ТУТ ИЗМЕНЕНИЕ
      Checked := True;
      Alarm.ClockEnable;
    end;
end;
...


Так выглядит проверка привязанных к каждой строке списка ListView будильников:

Код

procedure TForm1.TimerAlarmsTimer(Sender: TObject);
var I : integer;
begin
  DateTimeNow := Now;
  DecodeDate(DateTimeNow, YearNow, MonthNow, DayNow);
  DecodeTime(DateTimeNow, HourNow, MinNow, SecNow, MilSecNow);
  for I := 0 to (ListViewAlarm.Items.Count - 1)  do
  begin
   if TClock(ListViewAlarm.Items.Item[i].Data).CheckTime then [color=orangered]//НИЖЕ СМОТРИТЕ  ЧТО ПРОИСХОДИТ В CheckTime[/color]
   begin
     if MP.Mode = mpPlaying then 
     begin
       MP.Stop;
       MP.Close;
     end;
     FormMessage := TFormMessage.Create(Self);
     FormMessage.CreateMessage(TClock(ListViewAlarm.Items.Item[i].Data), ListViewAlarm.Items.Item[i]); 
     FormMessage.Show;
   end;
  end;
end;


Вот что происходит при TClock(ListViewAlarm.Items.Item[i].Data).CheckTime:

Код

function TClock.CheckTime : boolean;  //возвращает True, если время совпало
var
    DayOfWeekNow : integer;
begin
  result := False;
  if FMode = ONE_ALARM then
  begin
    if not FHandled and (FYear = YearNow) and (FMonth = MonthNow) and (FDay = DayNow) and (FHour = HourNow) and (FMin = MinNow) and (FSec <= SecNow) then
    begin
        FToRemoval := True; //подлежит удалению после закрытия сообщения
        FHandled := True;
        result := True;
        //ShowMessage('Да время и дата совпадают "Один раз"');
        exit; //нет смысла дальше вести проверку, так как каждый будильник проверяется в отдельности
    end;
  end;

…
Далее при срабатывании будильника создаётся сообщение 
Код

FormMessage := TFormMessage.Create(Self);
FormMessage.CreateMessage(TClock(Li stViewAlarm.Items.Item[i].Data), ListViewAlarm.Items.Item[i]); 

Эти строки взяты из примера выше

После того как пользователь нажимает в окошке сообщения на кнопку «Закрыть»
Происходит следующее:
Код:

Код

procedure TFormMessage.SpeedButton1Click(Sender: TObject);
var
  I: Integer;
begin
  Form1.TimerAlarms.Enabled := False; //Отключаем таймер проверки будильников на срабатывание
  if Form1.MP.Mode = mpPlaying then //если музыка ещё играет отключаем
  begin
   Form1.MP.Stop;
   Form1.MP.Close;
  end;

  if ReserveVol <> 0 then
  begin
    waveOutSetVolume(WAVE_MAPPER, ReserveVol);
  end;
  for I := 0 to Form1.ListViewAlarm.Items.Count - 1 do  
  begin
    if TClock(Form1.ListViewAlarm.Items.Item[i].Data).FToRemoval then //проверяем подлежит ли будильник удалению
    begin
      with Form1.ListViewAlarm do
      begin
        Alarms.Delete(Alarms.IndexOf(TClock(Items.Item[i].Data)));
        Alarms.Pack;
        Alarms.Capacity := Alarms.Count;
        Items.Item[i].Delete;
      end;
    end;
  end;
  Form1.TimerAlarms.Enabled := True;
  FormMessage.Close;
end;

Тут проверяется подлежит ли будильник удалению, так как при срабатывании будильника в режиме «Один раз», то полю FToRemoval объекта TClock, присваивается True. И если такой будильник находиться в списке он удаляется, получается изменяется ObjectList.Count и ListView.Items.Count, становятся на 1 меньше, для этого и выключался таймер проверки времени срабатывания будильников, так как там тоже цикл :
for I := 0 to (ListViewAlarm.Items.Count - 1) do, если Count уменьшился будет ошибка в цикле, но её вроде нету, так как выключаю таймер (выше в коде всё это есть). Проблема в другом, если в списке ListView один будильник и он в режиме «Один раз», то такой код срабатывает, но если добавить например ещё один с режимом, тоже например «Каждый день», то вылетает ошибка. Помогите пожалуйста, я уже устал над ним колдовать, ничё не могу понять. И вообще зачем тут ObjectList? Я его использую вообще только… по сути вообще не использую, это видно в коде.

вот что написано при ошибке: Project AlarmClock.exe raised exception class EAccessViolation with message 'Access violation at address 004B778E in module 'AlarmClock.exe' Read of address 0000000C.'
и компилятор выделяет строку if TClock(Form1.ListViewAlarm.Items.It em[i].Data).FToRemoval then
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0400 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.