Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TList [D7]


Страницы:   1 2

Б ©   (2009-01-09 23:21:00) 

Что-то не могу понять, как добавив в список, к примеру панель,
изменить её свойство через список.


List:= TList.Create;
List.Add(Panel1);
??????
e;


Игорь Шевченко   (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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо