Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Действия для определенных событий 
:(
    Опции темы
Anikmar
Дата 14.12.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Я посмотрел проектик, у меня возникли некоторые вопросы (или предложения)

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

2. Назначать единую дату напоминания для всех дней рождений можно, но мне кажется, что логичнее было бы ввести дополнительное поле для каждого индивидума - получаем преимущество: про ДР Васи можно напомнить за день - так как больше бутылки пива я ему ничего не подарю, а вот к ДР тещи надо подготовится за неделю

3. Обработчик события превращается в некого резидента по таймеру - берем текущую дату, сравниваем со списком (который хранится во внутренней структуре, на диске и т.п. - но не в визуальном контроле (избавляемся от необходимости держать созданной форму все время работы программы), если он видит событие, о котором надо оповестить - выводим МОДАЛЬНУЮ ФОРМУ на экран (пользователь должен ее увидеть и отреагировать), далее, в зависимости от реакции пользователя помечает данное событие как отработанное (в этом году - например ввести поле последнего уведомления) и больше его не отрабатывает.

4. В реакции пользователя можно предусмотреть варианты: "Да, видел, учту", "Напомни мне через .... дней или часов"

Касательно текущего проекта - все равно надо вводить в описание события некоторые поля:
- Дата последнего уведомления пользователя (чтобы не напоминать каждый день повторно - проверять, уведомлялось ли об этом событии) Либо просто флаг "Уведомлено", но тогда что делать со следующим годом?

Оптимизация работы по таймеру тоже нужна - какой смысл проверять каждые 5 минут список, если он не изменялся? Достаточно проверять раз в сутки. Тогда проверка сработает, если программа будет висеть запущенной и не выключаться...

Добавлено @ 11:57 
Теперь касаемо кода:
Ты определяешь выводилось или нет предупреждение по значению переменной Key.
1-е замечание. Если ты хочешь, чтобы при смене значения в комбобоксе все сбрасывалось, почему ты там не сбрасываешь переменную Key?

Если ты уберешь дурацкий статик и внесешь переменную Key в раздел protected класса, то в конструкторе формы добавь:
Key = 1;

А в обработчике OnChange комбобокса тоже вставь эту строчку - ты получишь вожделенное напоминание повторно при смене значения в комбобоксе
PM MAIL ICQ   Вверх
codelord
Дата 14.12.2006, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



в таймер :
Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static key=1;
for(int j=0;j<StringGrid1->RowCount;j++)
 {
  if((DaysBetween(StringGrid1->Cells[0][j],DateTimePicker1->DateTime.CurrentDate())==ComboBox1->Text.ToInt()) && key)
       { key=0;
        switch(MessageBox(Handle,AnsiString("Напоминание:" + StringGrid1->Cells[0][j]).c_str(),
           "Информация!!!",MB_OK | MB_ICONINFORMATION))
         {
          case ID_OK:
          key=1;
          };
       }
  if(j==StringGrid1->RowCount-1) Timer1->Enabled=false;
 }
}

в комбо боксе на OnChange добавь 
Код

Timer1->Enabled=true;




--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Vyacheslav
Дата 14.12.2006, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Код

for(int j=1;j<=Form1->StringGrid1->RowCount;j++)
{
Form1->StringGrid1Click(Sender);
...
}



docwar,  
А теперь медленно и подробно объясни, где здесь " цилке мы пробегаем по всем строкам "
Это ?
Код

for(int j=1;j<=Form1->StringGrid1->RowCount;j++)


На мой вгляд здесь просто идет увеличение j  от 1 до  RowCount в цикле с вызовом метода 
Код

Form1->StringGrid1Click(Sender);

на каждом цикле.
Или  ты считаешь, что он(метод) обеспечит тебе выбор строки в соответствии со значением j? Интересно, как? Cвятым духом?
Я бы еще понял, если была бы строка
Код

Form1->StringGrid1->Row = j;


Цитата(docwar @  14.12.2006,  10:54 Найти цитируемый пост)
только я не понимаю, чем вызван такой интерес,

smile
Все очень просто. Когда ты утверждаешь, что данный код делает это и это, а в самом  коде нет ничего похожего, то приходится предполагать все что угодно.
Например, что  сам  процесс  по "пробежке по СтрингГриду " реализован еще где -то. А указанный цикл с j это просто для декорации




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Anikmar
Дата 15.12.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата

А теперь медденно и подробно объясни, где здесь " цилке мы пробегаем по всем строкам "


Этот вопрос меня интересовал с начала темы  smile 

Потом посмотрел проект и решил решение этого вопроса оставить на потом - так как вся логика проекта у меня вызывает сомнение.
Если это нужно для сдачи лабораторки - сойдет и так (только цикл по строкам нормальный сделать)

Если хочется свою небольшую напоминалку иметь - то надо все переделывать и делать по-взрослому - с хранением данных на диске, неким  дополнительным сервисом (например, просто напомнить о чем-то)

Хотя есть уйма готовых программ для таких вещей - не вижу особого смысла писать собственную...


PM MAIL ICQ   Вверх
docwar
Дата 15.12.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Anikmar, спасибо за внимание к моему вопросу!
А теперь ответы на "вопросы (или предложения)":
1. Все правильно. Есть у нас список людей(одна форма), напоминания настраиваются на другой. Я просто не до конца понял предложение Ваше...
2. А вот это отличное замечание, тем более, что мне кажется, что именно этот метод вызовет у меня наименьшее количество гемороя при реализации кода... Спасибо!!! ))))
3. Как я понял - список должен быть не визуальным и не быть частью программы, т.е. это какой-то буфер получается? Ну, не знаю... программа в обьеме сейчас почти метр и не думаю, что найдутся компьютеры, у которых оп будет загружена моим "творением"... или не в этой смысл?
4. Интересно (спасибо), но пока мне рано. "Да, видел, учту" я планировал сделать щелчком правой клавиши мыши по форме, содержащей предупреждение...
Цитата
- Дата последнего уведомления пользователя (чтобы не напоминать каждый день повторно - проверять, уведомлялось ли об этом событии) Либо просто флаг "Уведомлено", но тогда что делать со следующим годом?

Так ведь и так есть проверка... повторное уведомление может быть, только если интервал до ДР изменен так, что сумма сегодняшней даты и интервал составит дату ДР.
Теперь касаемо кода: сделал, но возникли новые проблемы: программа без конца выдает напоминания! ))) (но это можно решить).

Думаю, что, действительно, придется указывать сроки напоминания для каждого человека отдельно...

codelord, спасибо большое, но код не работает: напоминание при смене текста КБ не работает... =)

Vyacheslav, действительно... забыл в СГКлик выделять строки с номером j... =)

Anikmar, программу начинал для себя, но решил прикрутить ее и к курсовой(если дай бог доучусь до конца второго курса)) ).
Программа моя - телефонный справочник, к которой я решил добавить напоминание о днях Рождений.
Цитата
то надо все переделывать и делать по-взрослому - с хранением данных на диске, неким  дополнительным сервисом (например, просто напомнить о чем-то)

С удовольствием выслушаю ваши предложения!!!

Благодарю всех за отзывчивость и желание помочь!! Спасибо!!!
PM MAIL   Вверх
codelord
Дата 15.12.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата

codelord, спасибо большое, но код не работает: напоминание при смене текста КБ не работает... =)

ты уверен что сделал как говорил.?

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  docwar.zip 16,70 Kb


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
docwar
Дата 15.12.2006, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хм... у меня не работал! =)
Недостаток метода в том, что колонка обязательно должна содержать дату.... а если пользователь не хочет ее вводить?!
PM MAIL   Вверх
codelord
Дата 16.12.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата(docwar @  15.12.2006,  19:10 Найти цитируемый пост)
Хм... у меня не работал! =)Недостаток метода в том, что колонка обязательно должна содержать дату.... а если пользователь не хочет ее вводить?!

ты хочешь чтобы я вместо тебя это писал?
причем метод скажем так не совсем мой. я лишь сделал то что ты попросил.

Добавлено @ 00:12 
 к тому же выше назавнный не достаток устраняется одной строкой проверки.


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Anikmar
Дата 16.12.2006, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



По поводу моего первого замечания.

Для того, чтобы узнать, попадает ли указанное событие в разряд "Надо напомнить" производится куча совершенно лишних действий - задействуются контролы, которые предназначены для вывода информации на экран. зачем? В первую очередь нас интересует список событий (их данные).

Отсюда - получаем некую структуру описания события, которая включает в себя следующую информацию:
1. Идентификатор объекта (например, ссылка на запись телефонного справочника) - по сути кто это такой или что это такое
2. Дата (и, может быть, время) возникновения события
3. За какое количество дней (часов, минут) предупредить пользователя о возникновении события
4. Является ли событие одноразовым (встреча) или регулярным (ежегодно, ежемесячно и т.п.)

Эту информацию запихиваем, например, в структуру. Если используется СУБД - то в БД. Если БД по какой-либо причине использовать нежелательно, то просто массив структур, сохраняемых в файле (не думаю, что их будет несколько тысяч, так что особо мудрить может и не придется - можно загрузить весь список в память).

Далее программа. Состоит из двух частей (логических):

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

2 Часть - резидент (таймер). Допустим каждые 10 минут он просматривает нашу БД, определяет необходимость выдать оповещение и оповещает пользователя. Здесь должна быть логика, определяющая, что об этом событиии пользователь уже был оповещен и он уже не хочет смотреть на напоминание. Причем это должно сохраняться и после выключения компа - т.е. храниться вместе с БД.

Дальше уже проектирование - продумываем формат структуры, способ сохранения на диске, делаем интерфейсную часть.
По поводу большого размера EXE - тут уж надо смириться. На самом деле 1 метр - это немного, достаточно посмотреть в диспетчере задач сколько памяти занимает микрософтовский Outlook. К тому же винда достаточно умная, чтобы скинуть большую часть проги в своп. Почему я и предлагаю отделить визуальные элементы от собственно логики: если интерфесная часть будет постоянно в памяти, то ее понадобится много, особенно, если наворотов много. А вот резидент, которые раз в 10 минут пробегает по базе структур (если их не много, то можно в память записхать, если много - то по файлу пробежаться) будет занимать не так уж много места.

Дальше можно и оптимизировать. 
Например: Если действо происходит внутри одного сеанса, файл с данными не изменялся, а ближайшее событие наступит через месяц, то пропускать проверку - сэкономим пару-тройку миллисекунд  smile 


PM MAIL ICQ   Вверх
docwar
Дата 16.12.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Набросал вообщем такой вот код:
Код
void __fastcall TForm5::Timer1Timer(TObject *Sender)
{
AnsiString DateDTPicker="";
AnsiString DateTek="";
AnsiString DateDTPicker2="";
AnsiString DateTek2="";

DateTimeToString(DateTek,"dd",Date());
DateTimeToString(DateTek2,"mm",Date());

static key=1;
for(int j=1;j<=Form1->StringGrid1->RowCount;j++)
{
DateTimeToString(DateDTPicker,"dd",Form1->DateTimePicker1->Date);
DateTimeToString(DateDTPicker2,"mm",Form1->DateTimePicker1->Date);

  Form1->StringGrid1Click(Sender);
  if(Form1->StringGrid1->Cells[3][j]!="")
  {
  Form1->StringGrid1->Row=j;
  if((DateTek.ToInt()+ComboBox1->Text.ToInt()==DateDTPicker.ToInt()) && DateTek2.ToInt()==DateDTPicker2.ToInt() && key)
  {
  key=0;Form6->ShowModal();
if(Form6->closed==0){ key=1; break;}
  }
  if(j==Form1->StringGrid1->RowCount-1) Timer1->Enabled=false;
  }
}
}

if(Form6->Closed==0). Closed - переменная, принимующая значение ноль при закрытии формы. 1 - при прорисовке формы(по идеи,это когда вызываем...)
Только одно но... окно с напоминанием постоянно вылетает, т.е. открывается правильно, но закрыть нельзя... =)

anikmar, а какие именно лишние контролы используются?
По поводу остальных пунктов вашего комментария: я думаю, что пока нужно осуществить самое простое, а потом приниматься за модернизирование! =) Касательно моего нынешнего положения есть замечания или советы? =)
PM MAIL   Вверх
Anikmar
Дата 16.12.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Цитата

anikmar, а какие именно лишние контролы используются?


Задача: узнать попадает ли заданная дата в нужный нам критерий (т.е. до нее сколько-то дней)

Сегодняшнюю дату - мы знаем
За сколько дней предупреждать - берем пока из контрола
А вот для остального сравнения используем и StringGrid и DateTimePicker...
Вот я и предложил все хранить в структурах и от туда же и сравнивать
PM MAIL ICQ   Вверх
docwar
Дата 16.12.2006, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Интересно... надо подумать...
Пока же надо сделать хотя бы со СтрингГридом и ДатаТаймПикером. =)
PM MAIL   Вверх
docwar
Дата 19.12.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вопрос все еще актуален.
PM MAIL   Вверх
codelord
Дата 19.12.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



Цитата

Вопрос все еще актуален.

скажи пожалуйста чем тебе не нравится конструкция которую я  описал в прошлом своем посте в прикрепленном файле, вроде работает по крайней мере я ничего не рабочего не видел. А то что делаешь ты, извини исправлять не могу, потому как затея изначально (касаемо дат) мягко сказать не жизнеспособная. пример:
допустим сегодня дата 19,12,2006, дата которую мы вписываем 12,02,2007, нам надо напомнить за 
55 дней. А что будет делать твой код: по порядку:
DateTek = 19
DateTek2 = 12

DateDTPicker = 12
DateDTPicker2 = 02
что ты делаешь дальше:
if(19+55 ==  12 && 12==02 &&1)
ТАКОЕ УСЛОВИЕ НИКОГДА НЕ ВЫПОЛНИТЬСЯ ПОТОМУ ЧТО 74!=12 а 12!=2 !!!!!!!!!!!!!!!!!!!!!
или ты все еще не согласен?



А по поводу актуальности в чем собственно вопрос?


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
docwar
Дата 22.12.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
ТАКОЕ УСЛОВИЕ НИКОГДА НЕ ВЫПОЛНИТЬСЯ ПОТОМУ ЧТО 74!=12 а 12!=2 !!!!!!!!!!!!!!!!!!!!!

НУ! Все правильно!!! Даты не равны, поэтому мы ничего не будем делать!!! Ведь напоминание выводится только в том случае, если числа РАВНЫ!
Цитата
А по поводу актуальности в чем собственно вопрос? 

Вот ссылка на мое сообщение с описанием проблемы...
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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