2012-10-13 31 views
9

tôi xây dựng hệ thống lớpLàm cách nào để khai báo thuộc tính mảng?

TTableSpec=class(Tobject) 
    private 
    FName : string; 
    FDescription : string; 
    FCan_add : Boolean; 
    FCan_edit : Boolean; 
    FCan_delete : Boolean; 
    FFields : array[1..100] of TFieldSpec; 
    public 
    property Name: String read FName; 
    property Description: String read FDescription; 
    property Can_add : Boolean read FCan_add; 
    property Can_edit : Boolean read FCan_edit; 
    property Can_delete : Boolean read FCan_delete; 
    property Fields : array read FFields; 
    end; 

Vì vậy trong bất động sản TableSpec Fields sẽ là danh sách các lĩnh vực (Tôi đã từng mảng TFieldSpec). Làm thế nào để sắp xếp danh sách các lĩnh vực (sử dụng hoặc không sử dụng một mảng) như là kết quả của biên soạn tôi nhận được một lỗi

[Error] Objects.pas(97): Identifier expected but 'ARRAY' found 
[Error] Objects.pas(97): READ or WRITE clause expected, but identifier 'FFields' found 
[Error] Objects.pas(98): Type expected but 'END' found 
[Hint] Objects.pas(90): Private symbol 'FFields' declared but never used 
[Fatal Error] FirstTask.dpr(5): Could not compile used unit 'Objects.pas' 
+0

Trừ khi bạn chắc chắn rằng bạn sẽ cần chính xác 100 trường, tôi sẽ tạo kiểu như 'loại TFields = Array of TFieldSpec' và sau đó chỉ định thuộc tính trường là' FFields: TFields'. –

+0

Đã đổi tên tiêu đề và xóa mã không liên quan. Chúng tôi không cần phải xem toàn bộ đơn vị để xác định vấn đề ở đây. –

+0

Bạn có chắc chắn muốn một thuộc tính có kiểu mảng hay đúng hơn là một trình chỉ mục? – CodesInChaos

Trả lời

21

dòng của bạn

property Fields : array read FFields; 

là cú pháp hợp lệ. Nó phải là

property Fields[Index: Integer]: TFieldSpec read GetField; 

nơi GetField là một (tư nhân) chức năng mà phải mất một số nguyên (các Index) và trả về tương ứng TFieldSpec, ví dụ,

function TTableSpec.GetField(Index: Integer): TFieldSpec; 
begin 
    result := FFields[Index]; 
end; 

Xem the documentation on array properties.

11

Tôi đồng ý câu trả lời liên quan đến các thuộc tính INDEXED, do Andreas đưa ra, là giải pháp mà người đăng đang tìm kiếm.

Để hoàn tất, đối với khách truy cập trong tương lai, tôi muốn chỉ ra rằng thuộc tính có thể có loại mảng, miễn là loại được đặt tên. Điều tương tự cũng áp dụng cho các bản ghi, con trỏ và các loại có nguồn gốc khác.

type 
    tMyColorIndex = (Red, Blue, Green); 
    tMyColor = array [ tMyColorIndex ] of byte; 

    tMyThing = class 
    private 
     fColor : tMyColor; 
    public 
     property Color : tMyColor read fColor; 
    end;