БИБЛИОТЕКА.VCL.TCustomFrame.Не вызывается метод RemoveActionList
ПРОДУКТ
Delphi
ПЛАТФОРМА
Windows
При создании фрейма с ActionList в методе TCustomFrame.Notification вызывается метод TCustomFrame.AddActionList, добавляющий ActionList в FActionLists родильской формы. Но при уничтожении метод TCustomFrame.Notification не вызывается, и, соответственно, метод TCustomFrame.RemoveActionList тоже не вызывается.
При простом уничтожении формы в этом нет ничего страшного, но при динамическом создании и уничтожении фрейма это приведет к тому, что в методе TCustomForm.IsShortCut будет обращение к уже уничтоженному объекту класса TCustomActionList с соответствующим Access Violation.
type
TTestFrame = class(TFrame)
ActionList1: TActionList;
public
destructor Destroy; override;
end;
destructor TTestFrame.Destroy;
begin
// ActionList1.Free; 1 вариант решения
// Notification(ActionList1, opRemove); 2 вариант решения
inherited;
end;
var FFrame: TTestFrame;
procedure TForm1.Button1Click(Sender: TObject);
begin
FFrame := TTestFrame.Create(nil);
FFrame.Parent := Self;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FFrame.Free;
end;
Проверено в Delphi 6 и 7.
Типовые решения
Способы решения:
Непосредственно вызывать ActionList1.Free в деструкторе фрейма
Непосредственно вызывать Notification(ActionList1, opRemove) в деструкторе фрейма
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.