1.Делать свой конструктор класса необязательно, т.к. по умолчанию все классы наследуются от базового класса у которого есть конструктор Create, но этот конструктор ничего не знает о наследнике и его переменных. И если для статических переменных вызов собственного конструктора можно упустить, то вот для динамических это уже обязательно.
2. Работа с динамическим массивом тоже требует определенных правил. Процедура SetLength инициализирует и устанавливает размерность для динамического масива. Без вызова хотя-бы раз этой процедуры, с таким массивом работать нельзя. В вашем случае, размерность изначально неизвестна, поэтому создаем пустой массив. При добавлении элеменета к массиву надо делать так:
Код:
SetLength(List, Length(List)+1);
Для получения текущей длины массива вызываем Length(List)
Но вот, если вам потребуется вставить или удалить элемент из массива, то уже придется потрудится, т.к. готовых процедур для этого нет.
Как альтернатива динамическому массиву, рекомендуется использовать базовый класс TList. Там уже предусмотрены все основные методы работы с таким массивом.
3. Объявить свойством в данном случае, это воспользоваться специальной конструкцией для классов - property.
В вашем случае для чтения Count надо вызвать Length(List) и для записи в него SetLength(List, Length(List)+1).
Код:
WorldObjects = class
private
procedure SetCount(Value: Integer);
function GetCount: Integer;
public
list:array of Obj;
count:integer;
property Count: Integer read GetCount write SetCount;
...
end;
...
implementation
procedure WorldObjects.SetCount(Value: Integer);
begin
SetLength(List, Value);
end;
function WorldObjects.GetCount: Integer;
begin
Result := Length(List);
end;