-
Константинов © (21.01.07 21:25) [0]Создаю компонент динамически.
Наверное, пишу слишком коряво, объясните, где ошибка.
Вылетает АВ в деструкторе, при закрытии приложения.
Компонент состоит из 2-х визуальных (TGraphicControl) пишу:
TMyShape = class(TShape)
private
FImage : TImage;
procedure SetParent(const Value: TWinControl);
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
end;
implementation
constructor TMyShape.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FImage := TImage.Create(AOwner);
end;
destructor TMyShape.Destroy;
begin
FImage.Free;
Вот тут по подробнее:
1. Если эта строчка присутствует, ловлю АВ
2. Если этой строчки нет, все в порядке, только интересует будет ли утечка памяти?
inherited Destroy;
end; -
Юрий Зотов © (21.01.07 21:48) [1]FImage := TImage.Create(Self);
И тогда Fimage будет автоматически уничтожаться вместе с Вашим компонентом. Сейчас же он уничтожается вместе с Owner'ом и при попытке повторного уничтожения возникает AV.
НО:
1. SetParent - название неудачное, такой метод уже есть.
2. Если поле FImage отбражается на свойство Image и это свойство не Read-only, то для него нужен метод Set (в котором надо вызвать Assign). -
Константинов © (21.01.07 23:14) [2]Спасибо!
Я так и думал, что деструктор вызывается дважды, но не мог понять почему.
Насчет Parent чуть позже напишу правильно ли я перегружаю свойство предка. -
Константинов © (21.01.07 23:26) [3]ПОлучается примерно так:type
TMyShape = class(TShape)
private
FImage : TImage;
procedure SetP(const Value: TWinControl);
function GetP: TWinControl;
public
constructor Create(AOwner : TComponent); override;
property Parent : TWinControl read GetP write SetP;
end;
implementation
{ TMyShape }
constructor TMyShape.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FImage := TImage.Create(Self);
end;
function TMyShape.GetP: TWinControl;
begin
Result := inherited Parent;
end;
procedure TMyShape.SetP(const Value: TWinControl);
begin
inherited Parent := Value;
FImage.Parent := Value;
end;
end.
Правильно? -
Юрий Зотов © (22.01.07 02:15) [4]Свойство Parent уже есть, зачем еще одно?
Просто перекройте SetParent, он же виртуальный. И обратите внимание на п.2 в [1].