2011-11-04 9 views
5

Đây là bài đăng đầu tiên của tôi ở đây, nhưng tôi muốn cảm ơn cộng đồng vì tôi đã tìm ra giải pháp cho các vấn đề của mình bằng cách đến đây và tìm giải pháp trong câu hỏi đã được trả lời rồi.Tạo lớp/phá hủy lớp ảo trong delphi

Điều đó đang được nói, tôi muốn đi đến vấn đề. Tôi đang làm việc trong Delphi 2007 IDE của Code Gear. Tôi vẫn còn khá mới để làm việc ở delphi, ít hơn 3 tháng để được chính xác, vì vậy hãy ghi nhớ điều này vì tôi có thể thiếu một cái gì đó cơ bản ở đây.

Trước tiên, tôi muốn đưa ra một ngữ cảnh nhỏ xung quanh vấn đề. Tôi đang viết một tiện ích lập kế hoạch để thực hiện các tác vụ vào những thời điểm cụ thể. Đối với mỗi tác vụ có sẵn, có 2 khung delphi liên quan có liên quan đến nhiệm vụ đó. Khung đầu tiên là để chỉnh sửa chi tiết cụ thể cho nhiệm vụ đó và khung thứ hai là để hiển thị thông tin thời gian chạy khi các tác vụ đang chạy.

Danh sách các tác vụ đang chạy được lưu giữ và trong hộp cuộn trong tiện ích, danh sách các khung tương ứng cho thông tin thời gian chạy được hiển thị. Các khung thời gian chạy này được tạo và hủy khi các tác vụ bắt đầu và kết thúc. Điều này đưa tôi đến vấn đề của tôi.

Tôi sử dụng trình quản lý lớp ảo để giữ danh sách màn hình hiển thị có sẵn và chỉnh sửa khung cho mỗi tác vụ và tạo chúng khi cần thiết. Trong thời gian chạy, mọi thứ hoạt động một cách thích hợp, khi ứng dụng thực sự đóng mà tôi thấy sự cố.

chương trình hạn chế ngoại lệ EAccessViolation khi đóng. Khi tôi đã cố gắng để theo dõi vấn đề bằng cách sử dụng IDE, dòng hoặc hành động tương ứng với vấn đề không thực sự tồn tại trong mã của tôi. Vì vậy, nó phải là một phần của một số chức năng làm sạch được thực hiện ở mặt đất trở lại.

Tôi đã thu hẹp nó xuống mã tạo các khung lớp ảo khi đang di chuyển, vì nó đóng lại tốt khi tôi nhận được mã đó. Vì vậy, điều này khiến tôi tin rằng tôi không thực hiện một số hành động liên quan đến việc sử dụng loại tạo lớp này.

var 
    tmpCCI: TComponentClassInfExt; 
    tmpS: String; 
    tc: TComponent; 
    bf: TBaseactionedit; 
... 
begin 
... 
tc := tmpCCI.fComponentClass.Create(nil); 
if tc is TBaseactionedit then 
begin 
    bf := TBaseActionEdit(tc); 
    bf.name := tmpCCI.fComponentClass.classname+IntToStr(nameCount); 
    bf.Visible := False; 
    bf.parent := pnlActionEdit; 
    bf.Align := alClient; 
    bf.Visible := True; 
end; 
... 

Đây là đoạn trích về cách tôi tạo khung bằng trình quản lý lớp ảo. Tôi đang giải phóng các trường hợp với FreeAndNil khi chúng không còn cần thiết nữa. Tôi đã truy tìm thông qua khả năng tốt nhất của mình để bảo đảm rằng tôi đã giải phóng mọi trường hợp trước khi ứng dụng đóng lại, nhưng rõ ràng là tôi đang thiếu một thứ gì đó.

Vì vậy, có ai có bất kỳ ý tưởng nào về việc từ đâu đến đây để gỡ lỗi một cái gì đó như thế này không?

P.S. một lần nữa tôi mới, vì vậy nếu có bất cứ điều gì tôi đã bỏ lỡ, bóng qua, hoặc quên thêm, xin vui lòng cho tôi biết. Cảm ơn một lần nữa vì đã đọc bài đăng của tôi!

+0

Tôi đã gặp phải AV khi tắt máy nếu bạn để hệ thống phân cấp 'Chủ sở hữu' hủy mọi thứ khi tắt máy. Hãy thử gọi 'Miễn phí' trên biểu mẫu chính của bạn (và các biểu mẫu khác mà bạn có thể đã mở) khi tắt máy. Làm điều này bằng cách thêm vào tệp .dpr sau dòng 'Application.Run'. –

Trả lời

2

Có thể là phụ huynh giải phóng tất cả các điều khiển chứa trong quá trình hủy.

+1

Nếu cha mẹ muốn phá hủy nó trong khi đóng ứng dụng, cách nào đúng đắn để phá hủy khung là khi nó không còn cần thiết trong thời gian chạy, hoặc có cách nói cho cha mẹ, nó không cần phải lo lắng về việc thử để tiêu diệt các thành phần? – PoultrySlave

+4

@PrematureOptimization 'TWinControl' cũng giải phóng các điều khiển con của nó, xem [tại đây] (http://stackoverflow.com/questions/7075637/). –

+0

@TOndrej, cảm ơn, góc khá thú vị và nguy hiểm của VCL –