Красота. Но зачем тут указатели?
Сейчас еще меняем
- Код: Выделить всё
aedit: ^Tsedit;
atab: ^ttabsheet;
на
- Код: Выделить всё
aedit: Tsedit;
atab: ttabsheet;
трём все строки с
new и
disposeпоиском и заменой меняем везде
aedit^ и
atab^ на
aedit и
atab соответственно
Чудеса - всё работает без указателей - они не нужны для динамического создания классов
Можно работать с динамическими компонентами, без списка онных и указателя на конкретный? Просветите... Буду только рад
Можно и без списков и без указателей.
Списки уже заботливо есть внутри owner`ов, И если своему динамически созданому контролу назначить owner`а - указатель на него сохранится в внутреннем списке дочерних контролов хозяина и будет в дальнейшем убит вместе с хозяином.
Указателем уже является сама классовая переменная.
- Код: Выделить всё
procedure TmForm.create_tab(path,fext:string);
var
TEMPatab:ttabsheet;//TEMPatab по сути это указатель на инстанс класса ttabsheet
...
begin
TEMPatab:=ttabsheet.Create(pages);//тут в куче создается инстанс ttabsheet, адрес его сохраняется в TEMPatab, муть с new\dispose ненужна
//также раз указан владелец - указатель на созданый таб сохраняеися внутри pages
Указатели нужны чтобы создавать в куче например рекорды, обжекты, простые массивы. Классы, динмассивы, длинные стринги это уже указатели по своему внутреннему устройству.
Сохранять указатели в списках\переменныч\ещеекакто - в принципе обязательно чтоб работать с созданными данными и потом не забыть уничтожить их. Но в данном случае нам на помощь приходит LCL с своими "механизмами" owner и sender. Если потребуется чтото большее чем убийство контрола вместе с хозяином или "вспоминание" о контроле только при событии от него в виде содержимого sender - TEMPatab придется гдето-както сохранять