2011-08-04 7 views
8

Tôi đã có một lớp thành phần đơn giản với tài sản boolean:Lớp bất động sản mặc định của bộ boolean true cho sai về thời gian chạy

TmyClass = class(TComponent) 
    private 
     fSomeProperty: boolean; 
    published 
     property SomeProperty: boolean 
        read fSomeProperty 
        write fSomeProperty 
        default true; 

    end; 

tôi đặt nó vào mẫu của tôi, thiết lập nó là true (SomeProperty được đặt thành false, tại sao?), Nhưng khi tôi đang cố gắng truy cập SomeProperty từ thời gian chạy, nó cho tôi sai. Tại sao vậy?

Trả lời

15

Thats vì thông số default không thực sự gán giá trị cho thuộc tính, nó chỉ nói với hệ thống phát trực tuyến có giá trị mặc định (và do đó không cần phải lưu). Bạn vẫn phải khởi tạo prop/field trong hàm khởi tạo với giá trị mặc định mong muốn. Đây là tài liệu trong help btw, đọc "Storage Specifiers" phần

+0

+1; Tôi đã không tìm thấy bất cứ điều gì hữu ích về 'mặc định' specifier ngoại trừ trong Object Inspector khi bạn thay đổi giá trị của một số tài sản từ' mặc định' một, nó được đánh dấu bằng chữ đậm; nếu bạn thay đổi nó về 'mặc định' thì kiểu đậm sẽ bị xóa. –

+2

Như @ain đã nói, hãy đọc phần Bộ lưu trữ của trình trợ giúp hoặc DocWiki. Điều này nói: 'Lưu ý: Giá trị thuộc tính không được tự động khởi tạo thành giá trị mặc định. Nghĩa là, chỉ thị mặc định chỉ điều khiển khi các giá trị thuộc tính được lưu vào tệp biểu mẫu, nhưng không phải giá trị ban đầu của thuộc tính trên một cá thể mới được tạo.' –

+2

Vì vậy, để khắc phục nó, hãy thêm mã hàm xây dựng 'FSomeProperty: = true' –

5

Bạn cũng nên thiết lập thuộc tính là True trong constructor - nếu không nó là một lỗi:

constructor TMyClass.Create(AOwner: TComponent); 
begin 
    inherited; 
    FSomeProperty:= True; 
    ... 
end; 

Mặc định giá trị xác định những gì sẽ được lưu trữ trong tệp * .DFM. Nếu bạn đặt FSomeProperty thành True vào thời gian thiết kế và giá trị mặc định cho FSomePropertyTrue thì FSomeProperty sẽ không được lưu trữ trong * .DFM.

Nếu bạn không khởi FSomeProperty-True trong constructor bạn nhận được một lỗi bạn mô tả - FSomeProperty xuất hiện False khi chạy, mặc dù nó đã được thiết lập True lúc thiết kế.