Конференция "Компоненты" » Создание компонента
 
  • Константинов © (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].
 
Конференция "Компоненты" » Создание компонента
Есть новые Нет новых   [119228   +48][b:0][p:0.001]