Форум: "Начинающим";
Текущий архив: 2009.02.22;
Скачать: [xml.tar.bz2];
ВнизTList Найти похожие ветки
← →
Б (2009-01-09 23:21) [0]Что-то не могу понять, как добавив в список, к примеру панель,
изменить её свойство через список.e;
List:= TList.Create;
List.Add(Panel1);
??????
← →
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.005 c