forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   BlitzMax (http://forum.boolean.name/forumdisplay.php?f=104)
-   -   Какой объект в TList сейчас обрабатывается? (http://forum.boolean.name/showthread.php?t=5195)

Trilliput 04.12.2007 16:28

Какой объект в TList сейчас обрабатывается?
 
Экземпляры класса заносятся в Obj:TList. Потом при помощи ф-ии UpdateEntities (Obj) происходит перебор всех объектов в списке с выполнением метода класса Update(). Возникла проблема как можно узнать какой объек из списка сейчас обрабатыется прямо из метода Update()? Нехотелось бы что бы при переборе передавать обрабатываемый объект в метод Update() (те Update(Obj)), тк придется переписывать все методы Update у всех классов.

johnk 04.12.2007 16:33

Re: Какой объект в TList сейчас обрабатывается?
 
Ну так элемент, что перебирается то и есть текущий.

dimanche13 04.12.2007 16:43

Re: Какой объект в TList сейчас обрабатывается?
 
код дай

Trilliput 04.12.2007 16:43

В том то и дело что просто для того что бы получить обрабатывемый элемент мне нужно пердать его методу Update(), но для этого мне придется дописывать все Update() - а мне это наф ненадо.
Есть ф-ия которая обрабатывает все списки:
Function UpdateEntities( list:TList )
For Local entity:TEntity=EachIn list
entity.Update
Next
End Function
Есть класс TEntity c абстрактным методом Update(), у него есть потомок класс TBuilding в котором и расписан метод Update().
Во время выполнения ф-ии UpdateEntities(list:TList) выполняется метод Update() класса TBuilding. Те из самого метода TBuilding.Update() я немогу узнать какой объект из списка выполняется.

В этом то и вся проблема, нехотелось бы в TBuilding.Update() делать еще один перебор For .. Next по списку объектов TBuilding.

Все это нужно для организации "выбора объекта" на который кликнули. У класса Tbuilding есть поле IsSelected. В методе Update() происходит проверка: Если кликнули на объекте, то IsSelected = true. А теперь надо сделать все IsSelected = false у других объектов. Делать для этого еще один перебор кокраз нехочеться. Идея была в том, что бы занести выбраный объект в поле "Global SelectedBuilding" и проверить если "текущий объект" <> "SelectedBuilding", то Selected = false.

При создании экземпляра класса используется:
Local Building:TBuilding=New TBuilding

Если занести Building при этом, например, в поле Obj этого же экземпляра класса будет ли он указывать именно на себя?
По логике: когда заносим созданый экземпляр класса в TList(например List.AddLast(Building), потом при переборе и изменении TList всеравно идет указание на созданый объект, НО вот будут ли те ссылки в TList и в поле класса Obj одинаковыми, что бы можно было использовать a=b?

dimanche13 04.12.2007 17:31

Re: Какой объект в TList сейчас обрабатывается?
 
мда... нифига не понял, надеюсь, что хть ты сам понимаешь что делаешь. Если хочешь, чтобы тебе помогли, учись правильно и четко формулировать вопросы.
Короче, попробуй так: сделай метод get()
Код:

type TBuilding
...
method Get:TBuilding()
  return self ' вернуть себя
end method
...
end type

и в любой момент можешь "взять" объект этим методом.

Trilliput 04.12.2007 17:48

Re: Какой объект в TList сейчас обрабатывается?
 
Сделал немного подругому:
Type TBuilding

' ссылка на себя, значение присваиватся при создании экземпляра класса
Field TowerName
'Текущий выбраный объект
Global TowerS = Null
'Выбран ли объект
IsSelected = false

Method Update()
If Click() then Not(IsSelected)
If IsSelected then
TowerS = TowerName
else
TowerS = Null
endif
If TowerName <> TTower.TowerS Then Selected=0
end method()

Ну а дальше Draw() уже рисует согласно разным параметрам.

Тк нет смысла каждый раз выполнять "вернуть себя", решил просто добавить еще одно поле в класс, но за метод спасиб, думаю что понадобиться.

jimon 04.12.2007 18:54

Re: Какой объект в TList сейчас обрабатывается?
 
не знаю нафиг такой гемор, я для редактора зделал
отдельный тип SelectedObjects и всю работу с ними
типа повернуть выделеные обьекты, переместить выделеные обьекты
и тд :) удобно и практично

ps. что мешает в Building.Update писать так ?
if something then
Selected = true
LastSelected.Selected = false
LastSelected = self
end if

Trilliput 04.12.2007 20:12

Re: Какой объект в TList сейчас обрабатывается?
 
Гы, можно и так.


Часовой пояс GMT +4, время: 04:16.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot