![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Сразу извеняюсь не знаю как лучше тему обозвать.
Код такой
Т.е. есть таблица со множеством значений из нее надо в CheckListBox запихнуть записи, удовлетворяющие условиюи и те записи, что в таблице помечены как true отметить в CheckListBox cheked. Но проблема в том, что не смотря на то, что установлен фильтр цикл бежит по всему набору данных и "i" принимает значение выходящее за границы того, что занесено в CheckListBox1.Items. Как быть? -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
прошу прощения, со своим кодом разобрался сам, у меня не срабатывал фильтр. После того как перенес все в условие фильтрации в OnFilterRecord все заработало. Хотя продолжает интересовать вопрос, а можно ли все это провернуть без фильтра?
<Spawn> твое предложение ничего не изменит, т.к. "i" бегает по всему набору данных и минус один ничего не меняет (оно может быть ровно 100, при том что в CheckListBox1.Items могло быть занесено всего 5 запесей, поэтому код: CheckListBox1.Checked[100] := true и вызывает ошибку). -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Не может быть. Ты добавляешь новое значение в CheckListBox1:
И для доступа к его свойству Checked необходимо использовать значение 0(в случае если это первый элемент списка) или CheckListBox1.Items.Count - 1. В твоем же примере, ты этого не делаешь, т.е. при добавлении новых значений, ты будешь пытаться получить доступ к несуществующим, что приведет к выходу за границы массива, так как отсчет начинается с 0, а не с 1 как сделал ты. Единственное из за чего может не произойти ошибки - если в Списке уже был хотя бы 1 элемент. -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
а учитывая, что у тебя идет эта проверка:
то тут тем более ошибка. К примеру на первой итерации цикла это условие не выполнилось, на второй прошло и оказалось, что добавляемое поле имеет тип Boolean, тогда будет произведена попытка изменить свойство Checked по индексу 2, хотя значений в списке будет всего 1 и получить доступ к нему можно будет только по значению 1-1 = 0. -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Правильным решением было бы завести переменную-счетчик, которую нужно было бы увеличивать на 1 при каждом добавлении значения в список.
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Cashey |
|
||||||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Ничего подобного. Ошибка возникала из-за того, что цикл бегал не по удовлетворяющим условию попадания в CheckListBox1.Items записям, а по всему набору данных. Из-за этого "i" принимало значение отличное от значения CheckListBox1.ItemIndex-1. Поэтому надо было либо сделать набор записей в таблице идентичными с набором в CheckListBox1 (что я и сделал), либо... вот я и не знаю как.
Проверка
А итерация цикла здесь не причем. -------------------- библия учит любить ближнего, а камасутра обучает как именно |
||||||
|
|||||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Можно так же создать массив, заполнить его в цикле, а потом из него заполнить CheckListBox1, тогда значения индекса массива будет всегда на единицу больше чем индекс CheckListBox1, а это легко учесть.
-------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
Cashey По моему ты не совсем понял, что я тебе сказал. Твой пример
это тот же самое что брать цикл от 0 до RecordCount - 1. Короче больше я обьяснять не собираюсь, если ты ни как не можешь понять. Это сообщение отредактировал(а) <Spawn> - 8.2.2004, 06:01 -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
<Spawn> это ты не понял. Вопрос звучит - можно ли это сделать без предварительной фильтрации, что бы цикл бегал не по всем записям, а только по удовлетворяющим значению.
-------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Насчет фильтра могу сказать: если таблица отфильтрована, то использовать RecNo нельзя (хотя может это не ко всем типам таблиц относится?). Лучше перед циклом сделать Table2.First; а в цикле делать Table2.Next, т.к. RecNo показывает физический номер записи...
Насчет Checked[i] можно сделать так: CheckListBox1.Checked[CheckBox1.Items.Count-1] := true
А чем фильтрация не нравится ? Но можно и без неё: FindKey - FindFirst - FindNext, только надо чтобы был активный индекс по полю id... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: 14 Всего: 154 |
Можно, используй SQL запрос.
-------------------- |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |