переобявить оператор присвоения.
- Код: Выделить всё
Operator := (r : TMyClass1) z : TMyClass1;
begin
z := r;
if not assigned(z.list) then z.list := tstringlist.create;
if not assigned(z.C2) then z.C2 := TMyClass2.create;
end;
Также можно сделать чтоб работало вообще для всех классов не являющихся персистентом, тогда нужно переобявлять оператор присвоения для TObject и проверять после присвоения не является ли он TPersistent, затем найти в нем все TPersistent и создать их тем классом которым они являются (количество пропертей узнать можно, а вот переменных не знаю).
С освобождением(если не добавлять в клас destroy) можно поступить разными методами:
1. При создании объектов записывать их в какой-то список и освобождать на finalization.
2. Создать процедуру освобождения
- Код: Выделить всё
Free(MC1)
которая будет искать все чилды и освобождать(если переменные найти не получится - их можно будет сразу где-то записать).
как альтернатива - можно написать препроцессор который будет добавлять в классы конструктор и дестрой.