2012-12-14 34 views
7

Tôi có một đối tượng mở rộng từ TFrame. Điều này chứa một TCombobox.Tại sao đối tượng TStrings của tôi bị hủy trước khi trình phá hủy của tôi có cơ hội chạy?

Tôi muốn đảm bảo tôi giải phóng mọi đối tượng liên quan khi khung của tôi bị hủy. Tuy nhiên khi destructor của tôi được chạy tôi có thể truy cập vào combobox, nhưng nó đã bị xóa sổ.

Điều gì sẽ làm việc này? Làm thế nào tôi có thể truy cập các mục trong destructor?

trình phá hủy của tôi trông như thế này;

destructor TfraImportAttachments.Destroy; 
begin 

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

    inherited; 
end; 
+3

Hiển thị một số mã. – Lloyd

+0

Biểu mẫu chính của tôi sở hữu khung, khi OnDestroy được gọi cho biểu mẫu chính các mục tồn tại, nhưng sau đó destructor của tôi bị sa thải và chúng biến mất. Vì vậy, một cái gì đó phải xảy ra inbetween. – srayner

+0

IRC, với khung hình không có thời gian chính xác của sự sáng tạo và hủy diệt - có thể đó là vấn đề. – iamjoosy

Trả lời

11

Có thể đã đạt đến combobox trước trình hủy. Sau đó, các mục đã biến mất vì chúng không được lưu vào danh sách TCustomComboBox.FSavedItems trong TCustomComboBox.DestroyWnd.

Đối tượng Delphi của combobox vẫn tồn tại, nhưng điều khiển thực tế (đối tượng được truy cập thông qua tay cầm cửa sổ) đã biến mất. Bằng cách truy cập ComboBox.Items VCL tái tạo điều khiển thực tế để nó có thể truy xuất các mục, nhưng điều khiển mới không có bất kỳ mục nào, vì vậy Items.Count trả về 0.

Một giải pháp sẽ là đưa các mục vào hộp combo và a TObjectList, TList hoặc TList<TObject> tùy thuộc vào việc bạn muốn làm gì với chúng. Vì vậy, quyền sở hữu nằm trong danh sách "mã" trong khi các mục vẫn được tham chiếu trong hộp tổ hợp.

+1

Cảm ơn bạn. Tôi có mã đang hoạt động. – srayner

Các vấn đề liên quan