Здравствуйте!
На форме (MainForm) динамически создаю панель (MyPanel). При клике на этой панели вызывается модальная форма. При клике по кнопке в модальной форме пытаюсь динамически удалить панель. Возникает ошибка EAbstractError. Я так понимаю, что после удаления объекта MyPanel происходит обращение к одному из его методов. Как этого избежать?
Код:
TMainForm = class(TForm)
btnCreate: TButton;
procedure btnCreateClick(Sender: TObject);
private
{ Private declarations }
MyGroupBox: TMyGroupBox;
MyPanel: TMyPanel;
procedure MyPanelClick(Sender: TObject);
procedure MyPanelDelete(Sender: TObject);
end;
procedure TMainForm.btnCreateClick(Sender: TObject);
begin
MyPanel := TMyPanel.Create(Self);
Self.InsertControl(MyPanel);
MyPanel.OnMyPanelClick := MyPanelClick;
MyPanel.OnMyPanelDelete := MyPanelDelete;
end;
procedure TMainForm.MyPanelDelete(Sender: TObject);
begin
(Sender as TMyPanel).OnMyPanelClick := nil;
Self.RemoveControl(Sender as TMyPanel);
(Sender as TMyPanel).Free;
end;
//============================================
TMyPanelDialogForm = class(TForm)
btnDelete: TButton;
procedure btnDeleteClick(Sender: TObject);
private
{ Private declarations }
HostMyPanel: TMyPanel;
public
{ Public declarations }
procedure Activated(aHostMyPanel: TMyPanel);
end;
procedure TMyPanelDialogForm.btnDeleteClick(Sender: TObject);
begin
HostMyPanel.DeleteMe;
Close;
end;
procedure TMyPanelDialogForm.Activated(aHostMyPanel: TMyPanel);
begin
HostMyPanel := aHostMyPanel;
ShowModal;
end;
//============================================
TMyPanel = class(TPanel)
protected
FOnMyPanelClick: TNotifyEvent;
FOnMyPanelDelete: TNotifyEvent;
private
procedure MyPanelClick(Sender: TObject);
public
procedure DeleteMe;
constructor Create(AOwner: TWinControl);
published
property OnMyPanelClick: TNotifyEvent read FOnMyPanelClick write FOnMyPanelClick;
property OnMyPanelDelete: TNotifyEvent read FOnMyPanelDelete write FOnMyPanelDelete;
end;
constructor TMyPanel.Create(AOwner: TWinControl);
begin
inherited create(AOwner);
OnClick := MyPanelClick;
end;
procedure TMyPanel.DeleteMe;
begin
if Assigned(FOnMyPanelDelete) then FOnMyPanelDelete(Self);
end;
procedure TMyPanel.MyPanelClick(Sender: TObject);
begin
if Assigned(FOnMyPanelClick) then FOnMyPanelClick(Self);
end;