![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TList [D7]
Б © (2009-01-09 23:21:00)Что-то не могу понять, как добавив в список, к примеру панель,
изменить её свойство через список.
e;
List:= TList.Create;
List.Add(Panel1);
??????
Игорь Шевченко (2009-01-10 01:35:00) [1]"Корректно оформляйте заголовок ветки, который должен кратко отражать суть вопроса"
Eraser (2009-01-10 01:33:00) [2]> [0] Б (09.01.09 23:21)
1. установить Делфи 2009.
2.
List:= TList<TPanel>.Create;
List.Add(Panel1);
List[0].Caption := 'generic';
DVM (2009-01-10 01:31:00) [3]
> Логично. :)
вот у тебя и получается, что первая пуля сдохла, а первый элемент в списке остался, но указатель в нем ссылается в пустоту, в то же время продолжат жить третья пуля, но третий элемент из списка удален. После прохода по списку мы сразу наткнемся на первый элемент и будет ошибка.
Б (2009-01-10 01:29:00) [4]> С какого перепугу пуля, которая положена в список первой, удаляет из > списка последний элемент???????
Логично. :)
Это я не подумав сделал. Со списками работаю только 40 минут. :)
DVM (2009-01-10 01:26:00) [5]
> Б (10.01.09 01:24) [20]
> Мрут по порядку. Очередью... очередью.
> А если враги подключаться, то в разнобой получиться.
>
даже если очередью, все равно см. [17] и ДУМАЙ!
Б (2009-01-10 01:24:00) [6]> У тебя пули мрут в произвольном порядке или по порядку?
Мрут по порядку. Очередью... очередью.
А если враги подключаться, то в разнобой получиться.
DVM (2009-01-10 01:22:00) [7]
> Если мы добавляем в список 3 пули, то BulletList.Count =
> 3 (Почему-то не 2)
Ясен пень, а сколько же. Было бы удивительно если бы 2. COUNT = количество
> Затем в кнопке напишем: BulletList.Delete(BulletList.Count
> - 1). Нажимаем 3 раза и ВСЕ пули успешно удаляются из списка.
> Проверял.
Ну и что.
DVM (2009-01-10 01:20:00) [8]У тебя пули мрут в произвольном порядке или по порядку?
DVM (2009-01-10 01:20:00) [9]
> Б (10.01.09 01:16) [16]
Еще раз для бестолковых:)
Ты в деструкторе пули удаляешь ее из списка. Но удаляешь почему то всегда последний элемент в списке. С какого перепугу пуля, которая положена в список первой, удаляет из списка последний элемент???????
Б (2009-01-10 01:16:00) [10]Если мы добавляем в список 3 пули, то BulletList.Count = 3 (Почему-то не 2)
Затем в кнопке напишем: BulletList.Delete(BulletList.Count - 1). Нажимаем 3 раза и ВСЕ пули успешно удаляются из списка. Проверял.
DVM (2009-01-10 01:10:00) [11]
> Б (10.01.09 01:08) [14]
> робовал написать так, но вылетало:
> BulletList.Delete(BulletList.Count);
> // Удаляем пулю
> С другой строны: начальный элемент с индексом (0), значит
> последний с нидексом (n-1).
Ты не понял. Допустим есть 3 пули. Умирает первая и в деструкторе она из списка с какого то перепугу удаляет третью из списка. У тебя так.
Б (2009-01-10 01:08:00) [12]> в одном потоке (это надеюсь так?)
Да, один таймер - один поток. Для первой игры сойдёт.
Таймер начинает работать за долго до того, как игрок выстрелит, т.е. после создания формы. А в это время в таймере прогонаяется список пуль, которых нет, вот и вылетает.
> Т.е. пуля уверена, что она последняя всегда в списке?
Пробовал написать так, но вылетало:
BulletList.Delete(BulletList.Count); // Удаляем пулю
С другой строны: начальный элемент с индексом (0), значит последний с нидексом (n-1).
DVM (2009-01-10 00:59:00) [13]
> В деструкторе:
> .....
> BulletList.Delete(BulletList.Count - 1); // Удаляем пулю
> из списка
Ээээ...Ты уверен, что удаляешь себя? Т.е. пуля уверена, что она последняя всегда в списке?
DVM (2009-01-10 00:57:00) [14]
> А как сделать проверку в таймере, чтобы не вылетало?
Я вообще сомневаюсь в том. что ты точно выяснил причину вылета. Дело в том, что весь код у тебя выполняется в одном потоке (это надеюсь так?) и обращение к несуществующей пуле невозможно, т.к. если в списке есть элемент, то есть и пуля ибо она сама себя туда добавила. Что-то тут не так еще.
Б (2009-01-10 00:54:00) [15]Вроде понятно. Буду разбираться.
А как сделать проверку в таймере, чтобы не вылетало?
DVM (2009-01-10 00:50:00) [16]
> Б (10.01.09 00:42) [8]
Обычно делают так:
Завести в классе Пуля поле Глобальный список
Ссылку на список передавать в конструктор пули и там делать присваивание полю Глобальный список
В деструкторе пули удалять себя из списка
DVM (2009-01-10 00:46:00) [17]
> А как тогда сделать?
В конструктор передавать ссылку на этот глобальный список?
Б (2009-01-10 00:42:00) [18]Да, список глобальный.
А как тогда сделать? (Сам хотел об этом спросить).
DVM (2009-01-10 00:39:00) [19]
> В конструкторе класса пишу:
> .....
> BulletList.Add(Self); // Добавляем
> пулю в список
если BulletList не является полем класса пуля (а он судя по всему не является), то это очень плохая форма записи
Б (2009-01-10 00:32:00) [20]2 MsGuns
Спасибо!
Возникла следущая задачка:
В конструкторе класса пишу:
.....
BulletList.Add(Self); // Добавляем пулю в список
.....
В деструкторе:
.....
BulletList.Delete(BulletList.Count - 1); // Удаляем пулю из списка
....
В таймере такой код
....
Var i: word;
begin
For i:= 0 to BulletList.Count-1 do
TBullet(BulletList[i]).Move;
// Тут всё время вылетает, из-за того, что идёт обращение к ещё не существующим пулям. Вопрос в том как сдесь сделать правильную проверку.
End;