2012-12-14 9 views
7

Mam obiekt, który rozciąga się od TFrame. Zawiera TCombobox.Dlaczego mój obiekt TStrings jest niszczony, zanim mój destruktor ma szansę uruchomić?

Chcę się upewnić, że uwolnię wszelkie powiązane obiekty, gdy moja ramka zostanie zniszczona. Jednak gdy mój destruktor zostanie uruchomiony, mogę uzyskać dostęp do combobox, ale jego elementy zostały zmiecione.

Co by to zrobić? Jak mogę uzyskać dostęp do elementów w destruktorze?

mój destruktor wygląda tak;

destructor TfraImportAttachments.Destroy; 
begin 

    MessageDlg(IntToStr(cboCategory.Items.count), mtInformation, [mbOK], 0); 
    FreeObjects(cboCategory.Items); 

    inherited; 
end; 
+3

Pokaż kod. – Lloyd

+0

Moja główna forma jest w posiadaniu ramki, kiedy OnDestroy zostaje wezwany do głównej formy, w której istnieją przedmioty, ale wtedy mój destruktor zostaje zwolniony i już go nie ma. Więc coś musi się dziać między nimi. – srayner

+0

IRC, z ramami nie ma dokładnego harmonogramu tworzenia i niszczenia - może to jest problem. – iamjoosy

Odpowiedz

11

Być może DestroyHandle osiągnął combobox przed destruktorem. Następnie elementy zniknęły, ponieważ nie zostały zapisane na liście TCustomComboBox.FSavedItems w TCustomComboBox.DestroyWnd.

Obiekt Delphi combobox nadal istnieje, ale faktyczna kontrola (dostępna za pomocą uchwytu okna) zniknęła. Uzyskując dostęp do ComboBox.Items, VCL odtwarza rzeczywistą kontrolę, aby mógł pobrać elementy, ale ta nowa kontrolka nie ma żadnych pozycji, więc zwraca 0 i zwraca 0.

Rozwiązaniem byłoby umieszczenie elementów w comboboxie i a TObjectList, TList lub TList<TObject> w zależności od tego, co chcesz z nimi zrobić. Tak więc własność znajduje się na liście "kodu", podczas gdy elementy wciąż są przywoływane w comboboxie.

+1

Dziękuję. Mam teraz działający kod. – srayner

Powiązane problemy