Ở đây tôi có một tình huống khó khăn, tôi đoán vậy. Tôi cần để có thể giải phóng một đối tượng là một lĩnh vực của một bản ghi. Tôi thường viết mã dọn dẹp trong destructor, nếu nó là một lớp. Nhưng vì các loại bản ghi không thể giới thiệu một "destructor", làm thế nào nó có thể gọi TObject (Field) .Free;?Làm thế nào để giải phóng một đối tượng trong hồ sơ?
Sẽ có hai loại sử dụng tôi dự đoán:
Thay kỷ lục với một hình mới.
Tôi nghĩ việc sử dụng này sẽ dễ triển khai. Vì các bản ghi là các kiểu giá trị và do đó chúng được sao chép khi gán, tôi có thể quá tải toán tử gán và giải phóng các đối tượng thuộc sở hữu của bản ghi cũ.
(Edit: Chuyển nhượng quá tải đã không thể Đó là một thông tin mới đối với tôi ...)
Thoát khỏi phạm vi nơi biến kỷ lục được xác định.
Tôi có thể nghĩ ra một phương thức riêng để giải phóng các đối tượng và phương pháp này có thể được gọi là kích thích phạm vi theo cách thủ công. NHƯNG, đây là cùng một câu hỏi: Làm thế nào để làm cho nó nhiều hơn ghi? Hành vi này có loại cảm giác giống như một lớp học ...
Đây là một mẫu (và rõ ràng không việc sử dụng dự định):
TProperties = record
... some other spesific typed fields: Integers, pointers etc..
FBaseData: Pointer;
FAdditionalData: TList<Pointer>;
//FAdditionalData: array of Pointer; this was the first intended definition
end;
Giả sử,
FAdditionalData:=TList<Pointer>.Crete;
gọi trong hàm tạo bản ghi hoặc theo cách thủ công trong phạm vi biến thể ghi bằng cách truy cập trường công khai như
procedure TFormX.ButtonXClick(Sender: TObject);
var
rec: TProperties;
begin
//rec:=TProperties.Create(with some parameters);
rec.FAdditionalData:=TList<Pointer>.Create;
//do some work with rec
end;
Sau khi ra khỏi phạm vi ButtonClick các rec là không còn nữa nhưng một TList vẫn giữ sự tồn tại của nó gây ra rò rỉ bộ nhớ ...
Bài tập ghi không thể bị quá tải. – kludg
Tôi đã không nhận thức được rằng (không bao giờ cần thiết trước), nhưng tôi đã học được nó ngay bây giờ :) Yeah, nó không thể được quá tải ... –