2010-08-13 39 views
8

Tôi đang sử dụng một bản ghi gồm các chuỗi, booleans, số nguyên, tiền tệ và mảng các bản ghi khác bên trong một phương thức của một lớp. Tôi muốn đệ quy khởi tạo tất cả các trường của kiểu nguyên thủy thành rỗng/false/zero. Delphi dường như không làm điều này theo mặc định. Có cách nào đơn giản để thực hiện việc này không liên quan đến việc truy cập từng trường theo tên và đặt thủ công không?Làm cách nào để tôi có thể khởi tạo bản ghi được khai báo dưới dạng biến cục bộ?

+0

Lưu ý rằng Delphi khởi tạo các loại được quản lý lâu dài (chuỗi, mảng động, giao diện). – kludg

+4

Trong Delphi-2009 và sau đó một bản ghi có thể được khởi tạo bởi 'Foo: = Mặc định (TFoo);'. Xem [Câu trả lời của David] (http://stackoverflow.com/a/11066205/576719) cho câu hỏi [Làm cách nào để ghi lại các bản ghi miễn phí có chứa nhiều loại khác nhau trong Delphi cùng một lúc?] (Http://stackoverflow.com/q/ 11065821/576719). –

+2

cũng thấy: [Biến nào được khởi tạo khi ở Delphi?] (Http://stackoverflow.com/questions/861045/which-variables-are-initialized-when-in-delphi) – Ampere

Trả lời

10

Bạn có thể sử dụng hoặc một các cấu trúc sau đây (trong đó Foo là bản ghi).

FillChar(Foo, SizeOf(Foo), 0); 

ZeroMemory(@Foo, SizeOf(Foo)); 

Từ một bài đăng từ Allen Bauer

Trong khi nhìn vào những ứng dụng phổ biến nhất cho FillChar nhằm xác định dù hầu hết mọi người sử dụng FillChar để thực sự lấp đầy bộ nhớ với nhân vật dữ liệu hoặc chỉ sử dụng nó để khởi tạo bộ nhớ với một số giá trị byte nhất định, chúng tôi phát hiện rằng đó là trường hợp thứ hai mà chi phối việc sử dụng nó thay vì trước đây là . Với điều đó, chúng tôi quyết định giữ lại FillChar byte-centric.

+4

Hoặc cùng một mã với (có thể) tốt hơn khả năng đọc: ZeroMemory (@Foo, SizeOf (Foo)); – Im0rtality

+0

@ Im0rtality: Tôi đã cập nhật câu trả lời để đưa vào giải pháp ZeroMemory của bạn. –

+0

Lưu ý rằng ZeroMemory là trình bao bọc cho FillChar trong * một số phiên bản * của Delphi (d6 và 7 ít nhất). –

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