Поиск:

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


Бывалый
*


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

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



Привет! =)
У меня есть вот такой код:
Код
AnsiString DateDTPicker="";
AnsiString DateTek="";
AnsiString DateDTPicker2="";
AnsiString DateTek2="";

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

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

if((DateTek.ToInt()-DateDTPicker.ToInt())==ComboBox1->Text.ToInt() && DateTek2.ToInt()==DateDTPicker2.ToInt())
Form3->Show();
}

Видно, что идет проверка: если сегодняшняя дата - дата из ДатаТаймПикера равна тексту из КомбоБокса и месяцы(сегодняшний и из ДТП) равны, то вызывается форма 3.

Однако, нужно как-то сделать так, чтобы для одного j форма вызывалась один раз, т.е. один j - одно открытие формы.
В моем коде вызов формы 3 будет идти бесконечно...

Спасибо за внимание!

Это сообщение отредактировал(а) docwar - 13.12.2006, 21:39
PM MAIL   Вверх
Anikmar
Дата 13.12.2006, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А что вообще этот цикл делает?
В приведенном коде я не увидел собственно использования цикла...
PM MAIL ICQ   Вверх
anwe
Дата 13.12.2006, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Используй логический флаг. Если флаг false, то покажи форму и установи флаг в true. Следующий раз форма не отобразится.
PM MAIL   Вверх
codelord
Дата 13.12.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



docwar, как ты думаешь что получится у тебя если даты будут текущая 3,01,2007 и 31,12,2006 прошлая???
или хотя бы 1,12,2006 и 31,11,2006 ? в первом случае день -28 (д.б 3) месяц - 11 (д.б 1) и т.д. Или тебе так надо?

по поводу вопроса, пробуем такое (опять таки если правильно понял).
В Си есть такая штука static которая инициализируется один раз.
вместо
Код

if((DateTek.ToInt()-DateDTPicker.ToInt())==ComboBox1->Text.ToInt() && DateTek2.ToInt()==DateDTPicker2.ToInt())
Form3->Show();

такое
Код

static int Key = 1;
if(((DateTek.ToInt()-DateDTPicker.ToInt())==ComboBox1->Text.ToInt() && DateTek2.ToInt()==DateDTPicker2.ToInt())&&Key){
Key=0;
Form3->Show();}




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


Бывалый
*


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

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



Цитата(Anikmar @  13.12.2006,  21:22 Найти цитируемый пост)
А что вообще этот цикл делает?
В приведенном коде я не увидел собственно использования цикла... 

А как же for(j=1;...)
Код обновлен - забыл в конце } поставить. =)
anwe, можно примерчик? =) Работал с переменными, но получается, что для каждого j необходимо заводить новую переменную, что не понятно мне как осуществить, поскольку знаем только количество переменных. =)
PM MAIL   Вверх
codelord
Дата 13.12.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



static int Key = 1;
лучше объявить до начала цикла, т.е. после того как Key стал равен 0 условие выполняться не будет и соответственно форма вызываться тоже.


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


Бывалый
*


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

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



Цитата
как ты думаешь что получится у тебя если даты будут текущая 3,01,2007 и 31,12,2006 прошлая???
или хотя бы 1,12,2006 и 31,11,2006 ? в первом случае день -28 (д.б 3) месяц - 11 (д.б 1) и т.д. Или тебе так надо?

Вроде, все нормально должно быть. Ведь результат вычитания сравниваем с текстом КомбоБокса...

По поводу вопроса этой темы: форма вызывается один раз, т.е. если одна из строк удовлетворяет условию Тек. дата-Данные из СГ=текст КомбоБокса, то форма вызывается один раз. 
НО! Она должна вызываться для всех строк, удовлетворяющих выше описанному условию... 
Как это проверил: ввел такие данные в таблицу: сегодняшняя дата, с.д.-1 день, с.д.-2 дня. В КомбоБокс ввел 1 день - вывелась форма. В КосбоБокс ввел 2 - ничего не произошло...
PM MAIL   Вверх
Anikmar
Дата 13.12.2006, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(docwar @ 13.12.2006,  21:42)
Цитата(Anikmar @  13.12.2006,  21:22 Найти цитируемый пост)
А что вообще этот цикл делает?
В приведенном коде я не увидел собственно использования цикла... 

А как же for(j=1;...)
Код обновлен - забыл в конце } поставить. =)
anwe, можно примерчик? =) Работал с переменными, но получается, что для каждого j необходимо заводить новую переменную, что не понятно мне как осуществить, поскольку знаем только количество переменных. =)

Я просто не понял его (цикла) назначение:
Ну бежим мы в цикле столько раз, сколько строчек в гриде, вызываем событие OnClick этого грида столько раз, сколько в нем строчек - это его основное назначение?

Я просто не часто видел циклы, в которых ничего не зависит от переменной цикла. Обычно это какие-то математические итерационные вычисления - а тут явно логика, а переменная цикла нигде не участвует...
Вот я и спросил, а что собственно этот цикл делает? Если нужно вызвать событие OnClick для каждой строчки грида - то тогда где смена строчки?
А если только вызвать событие OnClick столько раз, сколько в гриде строчек, то тогда зачем дальше в цикле сравнение величин (которые по идее не меняются внутри цикла)...
Или их меняет событие Onclick?
PM MAIL ICQ   Вверх
docwar
Дата 13.12.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В цилке мы пробегаем по всем строкам и четвертому столбцу(третьему, если принимать во внимание нумерацию с 0) и вызываем метод StringGrid1Click, который копирует данные выделенной строки четвертого столбца в ДатаТаймПикер. А дальше просто вводим переменные DateDTPicker и DateDTPicker2, а потом проверка условия, которое уже расписывал...
=)
PM MAIL   Вверх
Anikmar
Дата 13.12.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Либо я просто не выспался, либо туплю, но в упор не вижу где меняется строка и берется 4-й столбец...
PM MAIL ICQ   Вверх
docwar
Дата 13.12.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Anikmar @  13.12.2006,  23:43 Найти цитируемый пост)
Либо я просто не выспался, либо туплю...

нет. =) это я криво обьясняю.
Мы выделяем все строки по очереди, а в ф. StringGrid1Click прописано, что текст из четвертого столбца выделенной строки копируется в ДатаТаймПикер. А строки меняются благодаря прибавлению значения j, максимальное число которого - количество строк СтрингГрида, начиная с первой(или второй, если считать по-человечески - с 1 =) ).
PM MAIL   Вверх
Anikmar
Дата 14.12.2006, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Где меняется строка, я все равно не понял, но не суть.
Т.е. при наличии в гриде строки с необходимым условием (что-то там с датами) нам необходимо вывести форму на экран.

Если форму необходимо вывести ДЛЯ КАЖДОГО СЛУЧАЯ СОВПАДЕНИЯ внутри цикла, то может проще вызвать ее методом ShowModal - форму вывели, сделали какое-то действие, закрыли, перешли к другой строчке

Если форму необходимо вывести ПРИ ПЕРВОМ СОВПАДЕНИИ - то опять таки проще ее вывести модально, а потом выскочить из цикла - так как больше ее выводить не надо, использовав конструкция типа
if (условие истино)
{
    Form3->ShowModal();
    break;
}

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

Я просто недопонимаю что нужно сделать, если в очередной строчке грида есть необходимые для выполнения условия данные - попросить у пользователя что-то сделать или вывести на экран информацию...
PM MAIL ICQ   Вверх
docwar
Дата 14.12.2006, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



break не решает вопроса! =)
Попробую обьяснить еще подробнее - на примере.
Сегодня 14.12.2006.
В КомбоБоксе стоит 2.
Если сегодняшняя дата - текст КомбоБокса == дате из ДатаТаймПикера, то выводим сообщение "Работает!".
Этот этап я преодолел.
А вот, если не закрывать приложение и в КомбоБокс ввести новое число, то сообщение уже не выводится, хотя подходящяя дата есть в ДатаТаймПикере(процесс занесения даты в ДТП основывается на "пробежке" по СтрингГриду).

Как быть???
PM MAIL   Вверх
Anikmar
Дата 14.12.2006, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(docwar @ 14.12.2006,  00:10)
(процесс занесения даты в ДТП основывается на "пробежке" по СтрингГриду).

Можно посмотреть как реализован этот процесс?
PM MAIL ICQ   Вверх
docwar
Дата 14.12.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Конечно можно, только я не понимаю, чем вызван такой интерес, ведь это почти не имеет никакого отношения к моему вопросу... =)
Внимание! Немного изменил код: теперь даты не вычитаются, а складываются - исправляю последствия невнимательности.

Выкладываю проектик, визуализирующий мой вопрос...

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  docwar.zip 54,30 Kb
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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