StringList.Items.Objects, zwalnianie pamięci, TFrame

0

Heja

Tak sobie trochę kodzę w niedzielny poranek i natrafiłem na coś dziwnego. Opiszę na prostym przykładzie.

Rzecz dzieje się pod Turbo Delphi:

New > VCL Application ...

Na form1 mam combobox1. W OnCreate formy robię:

ComboBox1.AddItem('asdf', TObject.Create);

w dpr'ce na początku dałem

ReportMemoryLeaksOnShutdown := True;

Jak na tym zakończę to przy zamykaniu formatki jest komunikat o wycięku pamięci TObject x 1 - OK.
No to w OnDestroy dałem (wiem że brzydko ale to żeby pokazać):

ComboBox1.Items.Objects[0].Free;

I wyciek znika - wszystko cacy.

Ale teraz dodaje Frame'a do aplikacji. Na Frame'ie daję combo'sa. Tworze dwie procki:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFrame2 = class(TFrame)
    ComboBox1: TComboBox;
  public
    { Public declarations }
    constructor Create(aOwner : TComponent); override;
    destructor Destroy; override;
  end;

implementation

{$R *.dfm}

constructor TFrame2.Create(aOwner: TComponent);
begin
  inherited;
  ComboBox1.AddItem('adf', TObject.Create);
end;

destructor TFrame2.Destroy;
begin
//  ComboBox1.Items.Objects[0].Free; // jaja
  inherited;
end;

end.

Kladę tego Freme'ana form1 i odpalam program. I co 1 raz leak: TObject x 1. Okazuje się że w destruktorze frame'a ComboBox1.Items.Count = 0 ! Więc jak zwolnić obiekt ? Jak to robić przy frame'ach ? Sam się ten TObject nie zwolni, więc ReportMemoryLeak pokazuje raczej dobrą informację. Jakbym zwalniał ten TObject w destruktorze formatki głównej to by było OK. Tam Frame1.Combobox1.Items.Count = 1, ale wtedy psu na bude cała idea frame'ów. Skoro tworze coś w unicie z framem to tam chce to zwalniać ... Eh - co ja robie źle ?

Pozdrawiam

0

Może zrobić jakąś listę obiektów, które dodajesz do ListBoxa, a w Destroy frame'a przejść po niej i zwolnić te obiekty?

0

Że się da to się wiem, chodziło mi jednak o odpowiedź w stylu:

A. jest babaol w BDS'ie i sie dzieje jak się dzieje, a rozwiązanie to zmienić w linii XXX.pas z AAA na BBB.

B. źle robisz koleś, to co chcesz uzyskać trzeba robić tak a tak.

Tymczasowo zrobiłem tak: każda moja formatka dziedziczy po kilku bazowych, każdy mój frame dziedziczy po kilku bazowych. W Destroy'u jednej z bazowych formatek wywołuję metodę jednego z bazowych frame'ów. Tą metodę nadpisuje w każdym frame'ie. Ale IMHO jest to robota na obkoło. Powinno to się robić w destruktorze.

Tak czy siak dzięks za zainteresowanie.

0

mogę tylko napisać, że w D7 też tak jest :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1