![]() |
|
![]() ![]() ![]() |
|
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Я посмотрел проектик, у меня возникли некоторые вопросы (или предложения)
1. Не вижу смысла делать логику отработки события через визуальные контролы - разделяем мух от котлет - т.е. мы должны иметь некий список людей с днями варений оных. Чем его редактировать и отображать - дело десятое. Преимущество такого подхода - процедура напоминания не будет зависеть от дальнейших усовершенствований интерфейсной части программы. 2. Назначать единую дату напоминания для всех дней рождений можно, но мне кажется, что логичнее было бы ввести дополнительное поле для каждого индивидума - получаем преимущество: про ДР Васи можно напомнить за день - так как больше бутылки пива я ему ничего не подарю, а вот к ДР тещи надо подготовится за неделю 3. Обработчик события превращается в некого резидента по таймеру - берем текущую дату, сравниваем со списком (который хранится во внутренней структуре, на диске и т.п. - но не в визуальном контроле (избавляемся от необходимости держать созданной форму все время работы программы), если он видит событие, о котором надо оповестить - выводим МОДАЛЬНУЮ ФОРМУ на экран (пользователь должен ее увидеть и отреагировать), далее, в зависимости от реакции пользователя помечает данное событие как отработанное (в этом году - например ввести поле последнего уведомления) и больше его не отрабатывает. 4. В реакции пользователя можно предусмотреть варианты: "Да, видел, учту", "Напомни мне через .... дней или часов" Касательно текущего проекта - все равно надо вводить в описание события некоторые поля: - Дата последнего уведомления пользователя (чтобы не напоминать каждый день повторно - проверять, уведомлялось ли об этом событии) Либо просто флаг "Уведомлено", но тогда что делать со следующим годом? Оптимизация работы по таймеру тоже нужна - какой смысл проверять каждые 5 минут список, если он не изменялся? Достаточно проверять раз в сутки. Тогда проверка сработает, если программа будет висеть запущенной и не выключаться... Добавлено @ 11:57 Теперь касаемо кода: Ты определяешь выводилось или нет предупреждение по значению переменной Key. 1-е замечание. Если ты хочешь, чтобы при смене значения в комбобоксе все сбрасывалось, почему ты там не сбрасываешь переменную Key? Если ты уберешь дурацкий статик и внесешь переменную Key в раздел protected класса, то в конструкторе формы добавь: Key = 1; А в обработчике OnChange комбобокса тоже вставь эту строчку - ты получишь вожделенное напоминание повторно при смене значения в комбобоксе |
|||
|
||||
codelord |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
в таймер :
в комбо боксе на OnChange добавь
|
||||
|
|||||
Vyacheslav |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
docwar, А теперь медленно и подробно объясни, где здесь " цилке мы пробегаем по всем строкам " Это ?
На мой вгляд здесь просто идет увеличение j от 1 до RowCount в цикле с вызовом метода
на каждом цикле. Или ты считаешь, что он(метод) обеспечит тебе выбор строки в соответствии со значением j? Интересно, как? Cвятым духом? Я бы еще понял, если была бы строка
![]() Все очень просто. Когда ты утверждаешь, что данный код делает это и это, а в самом коде нет ничего похожего, то приходится предполагать все что угодно. Например, что сам процесс по "пробежке по СтрингГриду " реализован еще где -то. А указанный цикл с j это просто для декорации -------------------- С уважением, Вячеслав Ермолаев |
||||||||
|
|||||||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Этот вопрос меня интересовал с начала темы ![]() Потом посмотрел проект и решил решение этого вопроса оставить на потом - так как вся логика проекта у меня вызывает сомнение. Если это нужно для сдачи лабораторки - сойдет и так (только цикл по строкам нормальный сделать) Если хочется свою небольшую напоминалку иметь - то надо все переделывать и делать по-взрослому - с хранением данных на диске, неким дополнительным сервисом (например, просто напомнить о чем-то) Хотя есть уйма готовых программ для таких вещей - не вижу особого смысла писать собственную... |
|||
|
||||
docwar |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Anikmar, спасибо за внимание к моему вопросу!
А теперь ответы на "вопросы (или предложения)": 1. Все правильно. Есть у нас список людей(одна форма), напоминания настраиваются на другой. Я просто не до конца понял предложение Ваше... 2. А вот это отличное замечание, тем более, что мне кажется, что именно этот метод вызовет у меня наименьшее количество гемороя при реализации кода... Спасибо!!! )))) 3. Как я понял - список должен быть не визуальным и не быть частью программы, т.е. это какой-то буфер получается? Ну, не знаю... программа в обьеме сейчас почти метр и не думаю, что найдутся компьютеры, у которых оп будет загружена моим "творением"... или не в этой смысл? 4. Интересно (спасибо), но пока мне рано. "Да, видел, учту" я планировал сделать щелчком правой клавиши мыши по форме, содержащей предупреждение...
Так ведь и так есть проверка... повторное уведомление может быть, только если интервал до ДР изменен так, что сумма сегодняшней даты и интервал составит дату ДР. Теперь касаемо кода: сделал, но возникли новые проблемы: программа без конца выдает напоминания! ))) (но это можно решить). Думаю, что, действительно, придется указывать сроки напоминания для каждого человека отдельно... codelord, спасибо большое, но код не работает: напоминание при смене текста КБ не работает... =) Vyacheslav, действительно... забыл в СГКлик выделять строки с номером j... =) Anikmar, программу начинал для себя, но решил прикрутить ее и к курсовой(если дай бог доучусь до конца второго курса)) ). Программа моя - телефонный справочник, к которой я решил добавить напоминание о днях Рождений.
С удовольствием выслушаю ваши предложения!!! Благодарю всех за отзывчивость и желание помочь!! Спасибо!!! |
||||
|
|||||
codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
ты уверен что сделал как говорил.? Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Хм... у меня не работал! =)
Недостаток метода в том, что колонка обязательно должна содержать дату.... а если пользователь не хочет ее вводить?! |
|||
|
||||
codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 777 Регистрация: 7.5.2005 Где: ты моя темноглаза я где?! Репутация: 16 Всего: 39 |
ты хочешь чтобы я вместо тебя это писал? причем метод скажем так не совсем мой. я лишь сделал то что ты попросил. Добавлено @ 00:12 к тому же выше назавнный не достаток устраняется одной строкой проверки. |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
По поводу моего первого замечания.
Для того, чтобы узнать, попадает ли указанное событие в разряд "Надо напомнить" производится куча совершенно лишних действий - задействуются контролы, которые предназначены для вывода информации на экран. зачем? В первую очередь нас интересует список событий (их данные). Отсюда - получаем некую структуру описания события, которая включает в себя следующую информацию: 1. Идентификатор объекта (например, ссылка на запись телефонного справочника) - по сути кто это такой или что это такое 2. Дата (и, может быть, время) возникновения события 3. За какое количество дней (часов, минут) предупредить пользователя о возникновении события 4. Является ли событие одноразовым (встреча) или регулярным (ежегодно, ежемесячно и т.п.) Эту информацию запихиваем, например, в структуру. Если используется СУБД - то в БД. Если БД по какой-либо причине использовать нежелательно, то просто массив структур, сохраняемых в файле (не думаю, что их будет несколько тысяч, так что особо мудрить может и не придется - можно загрузить весь список в память). Далее программа. Состоит из двух частей (логических): 1 Часть - обеспечение редактирования информации. Тут задействованы визуальные контролы и т.п. - для того, чтобы пользователь мог забить и отредактировать информацию. Тут используется форма, которая создается динамически, когда нужна. Таким образом не будет сидеть в памяти все время жизни проги. 2 Часть - резидент (таймер). Допустим каждые 10 минут он просматривает нашу БД, определяет необходимость выдать оповещение и оповещает пользователя. Здесь должна быть логика, определяющая, что об этом событиии пользователь уже был оповещен и он уже не хочет смотреть на напоминание. Причем это должно сохраняться и после выключения компа - т.е. храниться вместе с БД. Дальше уже проектирование - продумываем формат структуры, способ сохранения на диске, делаем интерфейсную часть. По поводу большого размера EXE - тут уж надо смириться. На самом деле 1 метр - это немного, достаточно посмотреть в диспетчере задач сколько памяти занимает микрософтовский Outlook. К тому же винда достаточно умная, чтобы скинуть большую часть проги в своп. Почему я и предлагаю отделить визуальные элементы от собственно логики: если интерфесная часть будет постоянно в памяти, то ее понадобится много, особенно, если наворотов много. А вот резидент, которые раз в 10 минут пробегает по базе структур (если их не много, то можно в память записхать, если много - то по файлу пробежаться) будет занимать не так уж много места. Дальше можно и оптимизировать. Например: Если действо происходит внутри одного сеанса, файл с данными не изменялся, а ближайшее событие наступит через месяц, то пропускать проверку - сэкономим пару-тройку миллисекунд ![]() |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Набросал вообщем такой вот код:
if(Form6->Closed==0). Closed - переменная, принимующая значение ноль при закрытии формы. 1 - при прорисовке формы(по идеи,это когда вызываем...) Только одно но... окно с напоминанием постоянно вылетает, т.е. открывается правильно, но закрыть нельзя... =) anikmar, а какие именно лишние контролы используются? По поводу остальных пунктов вашего комментария: я думаю, что пока нужно осуществить самое простое, а потом приниматься за модернизирование! =) Касательно моего нынешнего положения есть замечания или советы? =) |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 34 Всего: 59 |
Задача: узнать попадает ли заданная дата в нужный нам критерий (т.е. до нее сколько-то дней) Сегодняшнюю дату - мы знаем За сколько дней предупреждать - берем пока из контрола А вот для остального сравнения используем и StringGrid и DateTimePicker... Вот я и предложил все хранить в структурах и от туда же и сравнивать |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Интересно... надо подумать...
Пока же надо сделать хотя бы со СтрингГридом и ДатаТаймПикером. =) |
|||
|
||||
docwar |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Вопрос все еще актуален.
|
|||
|
||||
codelord |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 !!!!!!!!!!!!!!!!!!!!! или ты все еще не согласен? А по поводу актуальности в чем собственно вопрос? |
|||
|
||||
docwar |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
НУ! Все правильно!!! Даты не равны, поэтому мы ничего не будем делать!!! Ведь напоминание выводится только в том случае, если числа РАВНЫ!
Вот ссылка на мое сообщение с описанием проблемы... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |