Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.028 c
1-1207677282
Тыщ
2008-04-08 21:54
2009.02.22
Как выравнить код и данные на границу 16 байт?


2-1231757559
Программер
2009-01-12 13:52
2009.02.22
Как выделить item в listbox?


2-1231532495
Б
2009-01-09 23:21
2009.02.22
TList


15-1230014400
Германн
2008-12-23 09:40
2009.02.22
Глюки обоняния


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский