constructor Create(AOwnsObjects: Boolean = True);
var Forml: TForm;
List: TObjectList<TCircle>; //список объектов TCircieimplementation
{$R *.fmx}
procedure TForml.FormCreate(Sender: TObj ect); begin
List:=TObjectList<TCircle>.Create;//здесь будут храниться шарики end;
Как видите, в момент объявления объектной переменной List: TObjectList<TCircie> мы явным образом указываем, что список намерен дружить исключительно с шариками TCircie.
В программе задействованы два таймера. Первый из них, компонент Timeri, отвечает за создание очередной порции шариков, это происходит каждый раз, как у таймера генерируется событие отсчета времени
procedure TForml.TimerlTimer(Sender: TObject);
var Circle:TCircle;
begin
Randomize;
Circle:=TCircle.Create(nil); //очередной шарик
List.Add(Circle); //добавляем шарик в список
Circle.Parent:= Forml;
Circle.Position,Y:=0;//место появления шарика на форме Circle.Position.X:=Random(Round(Forml.ClientWidth-Circle.Width));end;
В коде программы для добавления очередного объекта к списку задействуется метод
function Add(const Value: T): Integer;
Однако это не единственный способ пополнения списка, кроме метода Add (), добавляющего объект самым последним в список, в арсенале класса TObjectList<T>имеется метод
procedure Insert(Index: Integer; const Value: T);
благодаря которому мы сможем явным образом указать позицию объекта, передав значение в параметр index.
Кроме того, у класса предусмотрен целый ряд перегружаемых методов procedure AddRange(const Values: array of T);
procedure InsertRange(Index: Integer; const Values: array of T); умеющих за один присест добавить/вставить целую партию объект
ов.
Возвращаемся к нашей программе, а точнее, ко второму таймеру Timer2. В круг обязанностей этого компонента входит:
- управление процессом постепенного опускания шариков от места их создания (верхней грани формы) вниз формы, где их попытается поймать пользователь;
- удаление пойманных и пропущенных шариков.
Очевидно, что для решения этих задач мы должны уметь обращаться к элементу списка. Для этого стоит узнать общее количество элементов
property Count: Integer;
и передать индекс интересующего нас элемента в свойство
property Items[Index: Integer]: T;
Пойманным
считается шарик, попавший на поверхность биты, реализованной на основе
компонента TRectangie, пропущенным — шарик,
пролетевший мимо
procedure TForml.Timer2Timer(Sender: TObj ect);
var i:integer;
begin
for i :=0 to List.Count-1 do //перебираем все объекты with List.Items[i] do begin
Position.Y:=Position.Y+0.5;//опускаем шарик вниз //проверяем, не попал ли шарик на биту Rectanglel:TRectangieif (Position.Y+Height>=Rectanglel.Position.Y)and (Position.X>=Rectanglel.Position.X)and
(Position.X<=Rectanglel.Position.X+Rectanglel.Width)thenbegin
//элемент пойман List.Delete(i); //удаляем шарик//... подсчет пойманных шариков Break; //прерываемцикл
end else
if (Position.Y+Height>=Rectanglel.Position.Y) then begin //элемент не пойман List.Delete(i);//удаляем шарик //... подсчет пропущенных шариков Break; //прерываем цикл
end;
end;
end;