видалення фрейму

Як правельно видалити фрейм в такій ситуації:
1. фрейм на ньому кнопка
2. при натисканні на цю кнопку викликається метод форми
3. в цьому методі і потрібно видалить фрейм

Як це зробити?

Заздалегідь вдячний за допомогу!

А видаляти обов'язково? Приховати не допоможе?

Помоч то допоможе!
Але пам'ять то всетаки хочеться заощадити! (хоча б трохи!)
Тим більше що це фрейм потрібен на самому початку роботи програми, і більше не знадобитися!

а Form1OnClose (var Action.)
begin
Action: = caFree
end
усе приб'ється

А причому тут власне Close?
Мені треба видалити фрейм АЛЕ форма-то повинна залишитися!

При натисканні на кнопку Free

> Видалити фрейм АЛЕ форма-то повинна залишитися!
а фрейм - це що таке?

TFrame is a container for components; it can be nested within forms or other frames.
TForm is the component for a standard application window (form).

Ніколи з такою бідою не стикався наживо. F1 не допомогло. це в якійсь версії delphi?


>> При натисканні на кнопку Free
> EAccessViolation - що цілком зрозуміло.

Поясни. Бажано з прикладом коду.

По-моєму, обумовлений цілком зрозуміло.

Мені теж цікаво знати рішення проблеми.

Ніфіга не зрозуміло. Все олічной видаляється методом Free.

Якщо не видаляється за допомогою Free, тоді спочатку видали таким чином компоненти на фреймі, а потім вже порожній фрейм. Повинно допомогти.


> Все олічной видаляється методом Free.

У мене була підозра, що якщо після Free в обработчкіе кнопки фрейма більше нічого не викликати, то все буде нормально.
Але ж ні!
Виникає Access Violation. Але не завжди, деякі фрейми віддаляються коректно, а деякі з глюком. Залежно поки не вловив.
А ще зрідка випадає Abstract Error.

Чи не видаляє воно фрейм! Чи не видаляє.

> AGGRESSOR # 032; (14.02.03 12:27)
> Якщо не видаляється за допомогою Free, тоді спочатку видали таким чином компоненти на фреймі, а потім вже порожній фрейм. Повинно допомогти.

Ні не допомагає! І взагалі-то і не повинно!

1. Спробуй destroy замість free
2. перепризначити видалення фрейма який-небудь окремої кнопці на формі (але не на фреймі) і подивися, що вийде.

Якщо це не поможет- я здаюся. У мене все працює спочатку.


> 1. Спробуй destroy замість free

Не допоможе. Новомосковський в модулі System
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;

> AGGRESSOR # 032; (14.02.03 15:21)
> 2. Перепризначив видалення фрейма який-небудь окремої кнопці на формі (але не на фреймі) і подивися, що вийде.

Якщо це буде окрема кнопка на формі все буде чудово працювати!
Але в тотм-то вся проблема - цей метод не підходить.


> Якщо це буде окрема кнопка на формі все буде чудово
> Працювати!

Ну ось і відповідь на твоє питання. Програма після виконання меотда форми хоче передати управління процедурі натискання на кнопку, яку ти вже до цього часу успішно вбив.
Як вихід-використовуй free не в методі форми, а наступним рядком після виклику методу форми в процедурі обробки натиснення кнопки, і щоб цей рядок був останній перед end. Авось запрацює.


> Щоб цей рядок був останній перед end.

Не допомагає. Хоча, по ідеї, повинно.
Можливо, у мене глюки не у фреймах. Але більше підозрювати нікого.

Є ще один варіант. Перепризначив цій кнопці на фреймі властивість parent на форму, а не на фрейм, а потім звільняй. Можливо, твої помилки через поламаний z-order.

Вже більше доби ізобрітают велосипед, а правильних креслень так і немає :)

Якщо ми винаходимо велосипед значть його хтось уже винайшов! Так може цей хтось поділитися вже нарешті цими самими кресленнями?

> Щоб цей рядок був останній перед end.
На скорлько я розумію це ні до чого! тому для того щоб зрозуміти що цей рядок був останньою все одно потрібно повернутися до того місця виклику. А ця сама точка відноситься до об'єкту, а це якраз там. точніше то чого вже не існує!

> 1. фрейм на ньому кнопка
> 2. при натисканні на цю кнопку викликається метод форми

При натисканні має надсилатися повідомлення формі, щоб викликався метод форми (WM_USER).

> 3. в цьому методі і потрібно видалить фрейм
Видаляй.

А ця сама точка відноситься до об'єкту, а це якраз там. точніше то чого вже не існує!
- видаляється екземпляр об'єкта, код слінкован спочатку і до завершення процесу нікуди не дінеться (взагалі кажучи статичні методи, які не використовують полів і віртуальних / динамічних методів класу, можна цілком безболісне викликати навіть у зруйнованого об'єкта), інакше як-би працювало TObject (nil). Free.

> han_malign
Ну а в чому ж тоді проблема?


>. При натисканні має надсилатися повідомлення формі

через PostMessage