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

Поиск:

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


Бессмертный
****


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

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



Сразу извеняюсь не знаю как лучше тему обозвать.

Код такой
Код
procedure TInsert.Button3Click(Sender: TObject);
var
i : Integer;
begin
with Table2 do begin
Filter :=
'id =' + inttostr(Table1.FieldByName('id').AsInteger);
Filtered := true;
CheckListBox1.Clear;
for i := 1 to RecordCount do begin
       Recno := i;
       if FieldByName('id').AsInteger = Table1.FieldByName('id').AsInteger then begin
               CheckListBox1.Items.Add(FieldByName('Answer').AsString);
               if FieldByName('Rightness').AsBoolean then
                       CheckListBox1.Checked[i] := true
              end;
end;
end;


Т.е. есть таблица со множеством значений из нее надо в CheckListBox запихнуть записи, удовлетворяющие условиюи и те записи, что в таблице помечены как true отметить в CheckListBox cheked.
Но проблема в том, что не смотря на то, что установлен фильтр цикл бежит по всему набору данных и "i" принимает значение выходящее за границы того, что занесено в CheckListBox1.Items. Как быть?


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
<Spawn>
Дата 7.2.2004, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


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

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



Код
for i := 0 to RecordCount - 1 do



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Cashey
Дата 7.2.2004, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


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

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



прошу прощения, со своим кодом разобрался сам, у меня не срабатывал фильтр. После того как перенес все в условие фильтрации в OnFilterRecord все заработало. Хотя продолжает интересовать вопрос, а можно ли все это провернуть без фильтра?

<Spawn> твое предложение ничего не изменит, т.к. "i" бегает по всему набору данных и минус один ничего не меняет (оно может быть ровно 100, при том что в CheckListBox1.Items могло быть занесено всего 5 запесей, поэтому код: CheckListBox1.Checked[100] := true и вызывает ошибку).


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
<Spawn>
Дата 7.2.2004, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


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

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



Не может быть. Ты добавляешь новое значение в CheckListBox1:

Код
CheckListBox1.Items.Add(FieldByName('Answer').AsString);


И для доступа к его свойству Checked необходимо использовать значение 0(в случае если это первый элемент списка) или CheckListBox1.Items.Count - 1.

В твоем же примере, ты этого не делаешь, т.е. при добавлении новых значений, ты будешь пытаться получить доступ к несуществующим, что приведет к выходу за границы массива, так как отсчет начинается с 0, а не с 1 как сделал ты. Единственное из за чего может не произойти ошибки - если в Списке уже был хотя бы 1 элемент.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 7.2.2004, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


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

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



а учитывая, что у тебя идет эта проверка:
Код
if FieldByName('id').AsInteger = Table1.FieldByName('id').AsInteger then begin

то тут тем более ошибка.
К примеру на первой итерации цикла это условие не выполнилось, на второй прошло и оказалось, что добавляемое поле имеет тип Boolean, тогда будет произведена попытка изменить свойство Checked по индексу 2, хотя значений в списке будет всего 1 и получить доступ к нему можно будет только по значению 1-1 = 0.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 7.2.2004, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


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

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



Правильным решением было бы завести переменную-счетчик, которую нужно было бы увеличивать на 1 при каждом добавлении значения в список.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Cashey
Дата 7.2.2004, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


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

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



Ничего подобного. Ошибка возникала из-за того, что цикл бегал не по удовлетворяющим условию попадания в CheckListBox1.Items записям, а по всему набору данных. Из-за этого "i" принимало значение отличное от значения CheckListBox1.ItemIndex-1. Поэтому надо было либо сделать набор записей в таблице идентичными с набором в CheckListBox1 (что я и сделал), либо... вот я и не знаю как.

Проверка
Код
if FieldByName('id').AsInteger = Table1.FieldByName('id').AsInteger then
была лишней. просто я много перепробовал прежде чем выкладывать на форум и перед выкладыванием не исправил, точно также как и
Код
CheckListBox1.Checked[i] := true
правильно, разумеется
Код
CheckListBox1.Checked[i-1] := true

А итерация цикла здесь не причем.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Cashey
Дата 7.2.2004, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


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

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



Можно так же создать массив, заполнить его в цикле, а потом из него заполнить CheckListBox1, тогда значения индекса массива будет всегда на единицу больше чем индекс CheckListBox1, а это легко учесть.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
<Spawn>
Дата 8.2.2004, 05:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


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

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



Cashey По моему ты не совсем понял, что я тебе сказал. Твой пример
Код
CheckListBox1.Checked[i-1] := true


это тот же самое что брать цикл от 0 до RecordCount - 1. Короче больше я обьяснять не собираюсь, если ты ни как не можешь понять.

Это сообщение отредактировал(а) <Spawn> - 8.2.2004, 06:01


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Cashey
Дата 8.2.2004, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


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

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



<Spawn> это ты не понял. Вопрос звучит - можно ли это сделать без предварительной фильтрации, что бы цикл бегал не по всем записям, а только по удовлетворяющим значению.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
p0s0l
Дата 8.2.2004, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 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...



--------------------
С уважением, г-н Посол.
PM   Вверх
Medved
Дата 9.2.2004, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

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



Можно, используй SQL запрос.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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