2009-02-27 56 views
5
type 
    TStaticArray = array[1..10] of integer; 
    TDynamicArray = array of integer; 

    TMyClass = class(TObject) 
    private 
     FStaticArray: TStaticArray; 
     FDynamicArray: TDynamicArray; 
    published 
     property staticArray: TStaticArray read FStaticArray write FStaticArray; //compiler chokes on this 
     property dynamicArray: TDynamicArray read FDynamicArray write FDynamicArray; //compiler accepts this one just fine 
    end; 

Điều gì đang xảy ra ở đây? Một mảng tĩnh đưa ra lỗi, "thuộc tính được xuất bản 'staticArray' không thể là kiểu ARRAY" nhưng mảng động chỉ là tốt? Tôi bối rối. Bất cứ ai biết lý do đằng sau này, và làm thế nào tôi có thể làm việc xung quanh nó? (Và không, tôi không muốn redeclare tất cả các mảng tĩnh của tôi như năng động. Họ là kích thước mà họ đang có lý do.)Tại sao một số mảng có thể được xuất bản chứ không phải các mảng khác?

Trả lời

6

khai đăng cho trình biên dịch để lưu trữ thông tin trong bảng phương thức ảo. Chỉ có thể lưu trữ một số loại thông tin nhất định.
Loại thuộc tính đã xuất bản không được là con trỏ, bản ghi hoặc mảng. Nếu nó là một loại thiết lập, nó phải đủ nhỏ để được lưu trữ trong một số nguyên.
(O'REILLY, DELPHİ IN NUTSHELL)

+3

Chỉ một độ chính xác: không thể sử dụng bản ghi làm thuộc tính đã xuất bản. Hoặc trên thực tế, nó được cho phép, nhưng không có RTTI gắn liền với lĩnh vực này. Vì vậy, nó sẽ là vô dụng để thêm một bản ghi trong một phần được xuất bản của tài sản. Trong khi một mảng động được phép và được xử lý trong RTTI. –

-3

Không thể xuất bản các thuộc tính mảng. Vì vậy, mã sau không hoạt động. Công việc xung quanh có thể là làm cho nó public.

TMyClass = class(TObject) 
    private 
    FStaticArray: TStaticArray; 

    function GetFoo(Index: Integer): Integer; 
    procedure SetFoo(Index: Integer; Value: Integer); 
    public 
    property Foo[Index: Integer] : Integer read GetFoo write SetFoo; 
    end; 
+0

Không. Điều đó cũng không hiệu quả. Lỗi tương tự. –

+0

Làm thế nào bạn có thể gặp lỗi tương tự mà không sử dụng TStaticArray làm tài sản? –

+0

Đã bỏ phiếu bình chọn. –

0

Lý do tại sao bạn có thể xuất bản thuộc tính mảng động, là mảng động được triển khai dưới dạng tham chiếu hoặc 'con trỏ ngầm'. Họ làm việc giống như dây, thực sự.

Lý do tại sao bạn không thể xuất bản một mảng tĩnh, tôi không biết. Nó chỉ là cách nó được thực hiện, tôi đoán ..

Để biết thêm chi tiết về cách mảng động làm việc, hãy nhìn vào DrBobs site

0

Bạn phải có getters và setters. Theo D2009 (không kiểm tra các phiên bản khác), các tham số cho getters/setters không thể, vì một lý do nào đó, là const. ?

này hoạt động tốt dưới D2009:

type 
    TMyArray = array[0..20] of string; 

type 
    TMyClass=class(TObject) 
    private 
    FMyArray: TMyArray; 
    function GetItem(Index: Integer): String; 
    procedure SetItem(Index: Integer; Value: string); 
    public 
    property Items[Index: Integer]: string read GetItem write SetItem; 
    end; 

implementation 

function TMyClass.GetItem(Index: Integer): string; 
begin 
    Result := ''; 
    if (Index > -1) and (Index < Length(FMyArray)) then 
    Result := FMyArray[Index]; 
end; 

procedure TMyClass.SetItem(Index: Integer; Value: string); 
begin 
    if (Index > -1) and (Index < Length(FMyArray)) then 
    FMyArray[Index] := Value; 
end; 

Chú ý: Tôi sẽ không thường chỉ cần bỏ qua các giá trị Index ra khỏi phạm vi, rõ ràng. Đây là một ví dụ nhanh về cách tạo các thuộc tính mảng tĩnh trong định nghĩa lớp; IOW, đó là một ví dụ tương đồng.

1
TMyClass = class(TObject) 
    private 
    FStaticArray: TStaticArray; 
    FIdx: Integer; 
    function GetFoo(Index: Integer): Integer; 
    procedure SetFoo(Index: Integer; Value: Integer); 
    public 
    property Foo[Index: Integer] : Integer read GetFoo write SetFoo; 
    published 
    property Idx: Integer read fidx write fidx; 
    property AFoo: Integer read GetAFoo writte SetAFoo; 
    end; 
implementation 
function TMyClass.GetAFoo: Integer; 
begin 
    result := FStaticArray[FIdx]; 
end; 
procedure TMyClass.SetAFoo(Value: Integer); 
begin 
    FStaticArray[FIdx] := Value; 
end; 
+1

Điều này không chính xác cho chúng tôi biết bất cứ điều gì về * TẠI SAO *. –

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