Перейти к содержанию
Fire Monkey от А до Я
  • 0

Пример работы с TObjectList


Anasazi

Вопрос

Всем привет. Чиатю книгу Осипова по Delphi. В книге есть один пример создания простой игры, вроде бы в нем все понятно кроме одного момента.

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

С первым все просто и понятно понятно:

procedure TForm1.Timer1Timer(Sender: TObject);
Var
Circle:Tcircle;
begin
Randomize;
Circle:=TCircle.Create(nil);
List.Add(circle);
Circle.Parent:=Form1;
Circle.Position.Y:=0;
Circle.Position.X:=Random(Round(Form1.Width-Circle.Width));
end;

А вот со вторым какие-то чудеса:

procedure TForm1.Timer2Timer(Sender: TObject);
var
i: integer;
begin
For i:=0 to List.Count-1 do
with List.Items do
begin
Position.Y:=Position.Y+0.5;

Я не могу понять почему при перемещении шариков вниз мы пишем просто Position.Y:=Position.Y+0.5;

Как компилятор понимает что это Position.Y именно шарика, а не формы допустим или квадрата?

Я привык обращаться к свойству Position так Rectengle1.Position.Y.

Подскажите пожалуйста как так.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы
1 час назад, Anasazi сказал:

Я не могу понять почему при перемещении шариков вниз мы пишем просто Position.Y:=Position.Y+0.5;

Как компилятор понимает что это Position.Y именно шарика, а не формы допустим или квадрата?

Я привык обращаться к свойству Position так Rectengle1.Position.Y.

Подскажите пожалуйста как так.

если вам не понятен этот код

For i:=0 to List.Count-1 do
with List.Items[i] do
begin
	Position.Y:=Position.Y+0.5;
end;

то его можно переписать следующим образом

for i:=0 to List.Count-1 do
    List.Items[i].Position.Y := List.Items[i].Position.Y+0.5;

 

UPDATE: http://delphicode.org/delphi/with.htm

Ссылка на комментарий
  • 0
  • Модераторы
2 часа назад, kami сказал:

И это будет гораздо более правильно. не используйте with!

ну почему сразу не используйте, нужно просто знать как с этим работать.

например вот в таких конструкциях очень удобно, не требуется заводить переменную

with TStringList.Create do
begin
  Text := 'ТЕКСТ';
  SaveToFile('c:\file.txt');
  Free;
end;

 

Ссылка на комментарий
  • 0
18 минут назад, ZuBy сказал:

например вот в таких конструкциях очень удобно

Не буду разводить холивар, тем более что with или не with имеет кучу обсуждений, в которых высказывались и именитые разработчики. Скажем так - использование with делает код не явным  (например - в классе, где используется эта конструкция с with тоже есть метод SaveToFile или свойство Text) и плохо читается сторонним разработчиком. Но - каждый решает для себя.

Ссылка на комментарий
  • 0
В 03.11.2016 в 16:04, ZuBy сказал:

если вам не понятен этот код


For i:=0 to List.Count-1 do
with List.Items[i] do
begin
	Position.Y:=Position.Y+0.5;
end;

то его можно переписать следующим образом


for i:=0 to List.Count-1 do
    List.Items[i].Position.Y := List.Items[i].Position.Y+0.5;

 

UPDATE: http://delphicode.org/delphi/with.htm

Спасибо! Так гораздо понятнее!

Ссылка на комментарий
  • 0
В 03.11.2016 в 22:49, ZuBy сказал:

ну почему сразу не используйте, нужно просто знать как с этим работать.

например вот в таких конструкциях очень удобно, не требуется заводить переменную


with TStringList.Create do
begin
  Text := 'ТЕКСТ';
  SaveToFile('c:\file.txt');
  Free;
end;

 

Все же более правильный вариант будет такой:

with TStringList.Create do
try
  Text := 'ТЕКСТ';
  SaveToFile('c:\file.txt');
finally  
  Free;
end;

Иначе, если при каких то проблемах с файлом, Free не будет вызван и мы получим утечку.

Ссылка на комментарий
  • 0
В 03.11.2016 в 19:04, ZuBy сказал:

если вам не понятен этот код


For i:=0 to List.Count-1 do
with List.Items[i] do
begin
	Position.Y:=Position.Y+0.5;
end;

то его можно переписать следующим образом


for i:=0 to List.Count-1 do
    List.Items[i].Position.Y := List.Items[i].Position.Y+0.5;

 

UPDATE: http://delphicode.org/delphi/with.htm

Еще пару вариантов. 
1. Можно немного сократить, не указывая Items (почему - ищите в "корнях" property)

for i:=0 to List.Count-1 do
    List[i].Position.Y := List[i].Position.Y+0.5;

2. Можно использовать такой вариант
 

var
  c: TCircle;
begin
  for c in List do
    c.Position.Y := c.Position.Y + 0.5;
end;

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...