Удалить TFrame с формы в рантайм

KachoK
Дата: 19.06.2009 11:57:31
Использую в проекте такую конструкцию:
На форме Form1 лежит ScrollBox1, на который в рантайме размещаю несколько фреймов.
for i := 1 to n do
begin
  F_Frame := TMyFrame.Create(nil);
  F_Frame.Name := 'Frame_' + IntToStr(i);
  ...
  F_Frame.Parent := ScrollBox1;
end;
В один момент наступает необходимость полностью обновить состав фреймов. Для этого их необходимо сначала удалить:
for i := ScrollBox1.ControlCount - 1 downto 0 do
begin
  F_Frame := TMyFrame(ScrollBox1.Controls[i]);
  ScrollBox1.RemoveControl(F_Frame);
  F_Frame.Free;
end;
И вот в тот момент, когда "F_Frame.Free" вываливается ошибка "неверная операция с указателем".
При этом точно известно, что F_Frame <> nil.

Подскажите, как освободить память от TFrame.
scorpyx
Дата: 19.06.2009 13:25:43
KachoK,
Насколько я понимаю ты создаёш все эти фреймы от 1 переменной, и когда пытаешся удалить то естесвенно переменная типа TFrame, незнает по какому адресу обратится, ты можеш при создании фреймов заносить их в массив, и потом проходится по массиву и убивать их, либо каждому фрейму присваивать имя (Name + порядковый номер фрейма) и убивать их потом по обращению через имя function FindComponent(const AName: string): TComponent;, решений данной задачи куча, это первые какие пришли на ум. Желаю удачи.
scorpyx
Дата: 19.06.2009 13:30:28
В один момент наступает необходимость полностью обновить состав фреймов. Для этого их необходимо сначала удалить:
for i := ScrollBox1.ControlCount - 1 downto 0 do
begin
TMyFrame.(ScrollBox1.FindComponent('Frame_'+ IntToStr(i))).Free;
end;

Пробуй)
ддддд
Дата: 19.06.2009 13:32:40
KachoK
Использую в проекте такую конструкцию:
На форме Form1 лежит ScrollBox1, на который в рантайме размещаю несколько фреймов.
for i := 1 to n do
begin
  F_Frame := TMyFrame.Create(nil);
  F_Frame.Name := 'Frame_' + IntToStr(i);
  ...
  F_Frame.Parent := ScrollBox1;
end;
В один момент наступает необходимость полностью обновить состав фреймов. Для этого их необходимо сначала удалить:
for i := ScrollBox1.ControlCount - 1 downto 0 do
begin
  F_Frame := TMyFrame(ScrollBox1.Controls[i]);
[b]  ScrollBox1.RemoveControl(F_Frame);
  F_Frame.Free;[/b]
end;
И вот в тот момент, когда "F_Frame.Free" вываливается ошибка "неверная операция с указателем".
При этом точно известно, что F_Frame <> nil.

Подскажите, как освободить память от TFrame.


После того, как контрол удален, пытаетесь его же обнулить?
Ega
Дата: 19.06.2009 13:40:35
А Owner у них при создании - какой?
scorpyx
Дата: 19.06.2009 13:47:34
Ega
А Owner у них при создании - какой?

Насколько помнится главное не Owner а Parent, а если бы он парента не указал то не смог бы и отобразить их на ScrollBox1. Только сам он чего то не спешит появится)
дддддд
Дата: 19.06.2009 13:49:29
Ega
А Owner у них при создании - какой?


Судя по исходнику, Owner = nil.
Так что ScrollBox не при делах...
ддддддд
Дата: 19.06.2009 13:50:53
scorpyx
Ega
А Owner у них при создании - какой?

Насколько помнится главное не Owner а Parent, а если бы он парента не указал то не смог бы и отобразить их на ScrollBox1. Только сам он чего то не спешит появится)


Parent - компонент, на котором он будет отображаться, а владельцем может быть кто угодно, даже другая форма или Application.
scorpyx
Дата: 19.06.2009 13:53:13
дддддд
Ega
А Owner у них при создании - какой?


Судя по исходнику, Owner = nil.
Так что ScrollBox не при делах...

Что значит не при делах? проверьте:
var 
  But: TButton;
begin
  But: TButton.Create(Nil);
  But.Parent := Form1;
end;
KachoK
Дата: 19.06.2009 14:00:48
ддддд
После того, как контрол удален, пытаетесь его же обнулить?

Пытаюсь, т.к. RemoveControl не освобождает память, занятую фреймом. Фрейм по прежнему не пустой и даже можно из него данные вытянуть.

Ega
А Owner у них при создании - какой?

Как сказал ддддд, Owner действительно nil, но пробовал в качестве Ownera ставить и ScrollBox1 - никакой разницы.

scorpyx
for i := ScrollBox1.ControlCount - 1 downto 0 do
begin
TMyFrame.(ScrollBox1.FindComponent('Frame_'+ IntToStr(i))).Free;
end;

Пробуй)

Сейчас буду пробовать :)