Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.22;
Скачать: CL | DM;

Вниз

TList   Найти похожие ветки 

 
Б   (2009-01-09 23:21) [0]

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


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


 
DVM ©   (2009-01-09 23:36) [1]


> изменить её свойство через список.

как бы ты обратился к конкретному элементу списка?


 
Б   (2009-01-09 23:45) [2]

как бы ты обратился к конкретному элементу списка?
Типа такого. (Как обращение к обычному массиву).

 If  (List.Items[0] is TPanel) then (List.Items[0] as TPanel).Visible:= False;

Дополнительные вопросы:
1) Для хранения контролов какие больше списки подходят?
2) А для структур?
3) А для типов, типа Object?


 
MsGuns ©   (2009-01-09 23:45) [3]

TPanel(List[i]).Align := alClient;


 
Leonid Troyanovsky ©   (2009-01-09 23:49) [4]


> Б   (09.01.09 23:45) [2]

> 1) Для хранения контролов какие больше списки подходят?

RTFM: Controls

--
Regards, LVT.


 
DVM ©   (2009-01-10 00:26) [5]


> Б   (09.01.09 23:45) [2]


> 1) Для хранения контролов какие больше списки подходят?

А что большой выбор? TList и подходит. Только хранит он не контролы, а скорее указатели, но не суть важно.


> 2) А для структур?

Тоже TList, только хранить надо указатели на структуры


> 3) А для типов, типа Object?

тоже самое, подходит TList.

Он вообще подходит для чего угодно, что можно идентифицировать числом типа integer


 
Б   (2009-01-10 00:32) [6]

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;


 
DVM ©   (2009-01-10 00:39) [7]


> В конструкторе класса пишу:
> .....
> BulletList.Add(Self);                         // Добавляем
> пулю в список

если BulletList не является полем класса пуля (а он судя по всему не является), то это очень плохая форма записи


 
Б   (2009-01-10 00:42) [8]

Да, список глобальный.
А как тогда сделать? (Сам хотел об этом спросить).


 
DVM ©   (2009-01-10 00:46) [9]


> А как тогда сделать?

В конструктор передавать ссылку на этот глобальный список?


 
DVM ©   (2009-01-10 00:50) [10]


> Б   (10.01.09 00:42) [8]

Обычно делают так:

Завести в классе Пуля поле Глобальный список
Ссылку на список передавать в конструктор пули и там делать присваивание полю  Глобальный список
В деструкторе пули удалять себя из списка


 
Б   (2009-01-10 00:54) [11]

Вроде понятно. Буду разбираться.

А как сделать проверку в таймере, чтобы не вылетало?


 
DVM ©   (2009-01-10 00:57) [12]


> А как сделать проверку в таймере, чтобы не вылетало?

Я вообще сомневаюсь в том. что ты точно выяснил причину вылета. Дело в том, что весь код у тебя выполняется в одном потоке (это надеюсь так?) и обращение к несуществующей пуле невозможно, т.к. если в списке есть элемент, то есть и пуля ибо она сама себя туда добавила. Что-то тут не так еще.


 
DVM ©   (2009-01-10 00:59) [13]


> В деструкторе:
> .....
> BulletList.Delete(BulletList.Count - 1); // Удаляем пулю
> из списка

Ээээ...Ты уверен, что удаляешь себя? Т.е. пуля уверена, что она последняя всегда в списке?


 
Б   (2009-01-10 01:08) [14]

> в одном потоке (это надеюсь так?)
Да, один таймер - один поток. Для первой игры сойдёт.
Таймер начинает работать за долго до того, как игрок выстрелит, т.е. после создания формы. А в это время в таймере прогонаяется список пуль, которых нет, вот и вылетает.
 
> Т.е. пуля уверена, что она последняя всегда в списке?

Пробовал написать так, но вылетало:
BulletList.Delete(BulletList.Count);                      // Удаляем пулю
С другой строны: начальный элемент с индексом (0), значит последний с нидексом (n-1).


 
DVM ©   (2009-01-10 01:10) [15]


> Б   (10.01.09 01:08) [14]


> робовал написать так, но вылетало:
> BulletList.Delete(BulletList.Count);                    
>   // Удаляем пулю
> С другой строны: начальный элемент с индексом (0), значит
> последний с нидексом (n-1).

Ты не понял. Допустим есть 3 пули. Умирает первая и в деструкторе она из списка с какого то перепугу удаляет третью из списка. У тебя так.


 
Б   (2009-01-10 01:16) [16]

Если мы добавляем в список 3 пули, то BulletList.Count = 3 (Почему-то не 2)
Затем в кнопке напишем: BulletList.Delete(BulletList.Count - 1). Нажимаем 3 раза и ВСЕ пули успешно удаляются из списка. Проверял.


 
DVM ©   (2009-01-10 01:20) [17]


> Б   (10.01.09 01:16) [16]

Еще раз для бестолковых:)

Ты в деструкторе пули удаляешь ее из списка. Но удаляешь почему то всегда последний элемент в списке. С какого перепугу пуля, которая положена в список первой, удаляет из списка последний элемент???????


 
DVM ©   (2009-01-10 01:20) [18]

У тебя пули мрут в произвольном порядке или по порядку?


 
DVM ©   (2009-01-10 01:22) [19]


> Если мы добавляем в список 3 пули, то BulletList.Count =
> 3 (Почему-то не 2)

Ясен пень, а сколько же. Было бы удивительно если бы 2. COUNT = количество


> Затем в кнопке напишем: BulletList.Delete(BulletList.Count
> - 1). Нажимаем 3 раза и ВСЕ пули успешно удаляются из списка.
>  Проверял.

Ну и что.


 
Б   (2009-01-10 01:24) [20]

> У тебя пули мрут в произвольном порядке или по порядку?
Мрут по порядку. Очередью... очередью.
А если враги подключаться, то в разнобой получиться.


 
DVM ©   (2009-01-10 01:26) [21]


> Б   (10.01.09 01:24) [20]


> Мрут по порядку. Очередью... очередью.
> А если враги подключаться, то в разнобой получиться.
>

даже если очередью, все равно см. [17] и ДУМАЙ!


 
Б   (2009-01-10 01:29) [22]

> С какого перепугу пуля, которая положена в список первой, удаляет из > списка последний элемент???????
Логично. :)
Это я не подумав сделал. Со списками работаю только 40 минут. :)


 
DVM ©   (2009-01-10 01:31) [23]


> Логично. :)

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


 
Eraser ©   (2009-01-10 01:33) [24]

> [0] Б   (09.01.09 23:21)

1. установить Делфи 2009.
2.
List:= TList<TPanel>.Create;
List.Add(Panel1);
List[0].Caption := "generic";


 
Игорь Шевченко ©   (2009-01-10 01:35) [25]

"Корректно оформляйте заголовок ветки, который должен кратко отражать суть вопроса"



Страницы: 1 вся ветка

Текущий архив: 2009.02.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
2-1231438760
NEWichok
2009-01-08 21:19
2009.02.22
Как организовать проверку перед "POST"?


6-1199546330
maxistent
2008-01-05 18:18
2009.02.22
Обновление событий...


6-1199280101
Venkin
2008-01-02 16:21
2009.02.22
отправить картинку на radikal.ru (INDY)


2-1231683091
Cj
2009-01-11 17:11
2009.02.22
Handle Type..???


15-1230157223
istok2
2008-12-25 01:20
2009.02.22
Прикладная учетная система...