2017-08-10 13 views
6

Tôi có ghi lại loạiLàm thế nào để có được tài sản của 'kỷ lục' loại sử dụng TypInfo đơn vị

TDoublePoint = record 
       X : Double; 
       Y : Double; 
       end; 

này sau đó tôi có đối tượng với tài sản

uses ..TypInfo; 

TCell = class(TPersistent) 
    private 
    FZoom : TDoublePoint 
    published 
    property Zoom : TDoublePoint read FZoom write FZoom; 
end; 

này Nhưng khi tôi muốn nhận được PropInfo thuộc tính này với chức năng này:

function GetKind(AObject:TObject; Propertyname :shortstring):TTypeKind; 
var p :ppropinfo; 
begin 
    p:=GetPropInfo(AObject, Propertyname); // <p = nil 
    Result:= p^.proptype^.Kind; 
end; 

.. ..

c := TCell.Create; 
GetKind(c, 'Zoom'); // <- error 
c.Free; 

tôi nhận lỗi, bởi vì biến p là con số không trong hàm.

Nhưng tại sao? Có tkRecord trong TTypeKind, vì vậy tôi mong đợi không có vấn đề gì để đọc/ghi tài sản của loại bản ghi, nhưng có vẻ như, không thể (?) Tìm kiếm của Google không nói nhiều.

Trả lời

10

Delphi 7 không tạo RTTI cho loại bản ghi theo mặc định và do đó, thuộc tính published sử dụng loại bản ghi sẽ không có RTTI (bạn có thể sử dụng TypInfo.GetPropList() để xác nhận).

Tại một thời điểm, đây là một hạn chế tài liệu:

tính Published bị hạn chế với các loại dữ liệu nhất định. Các kiểu con trỏ, chuỗi, lớp, giao diện, biến thể và kiểu con trỏ có thể được xuất bản.

Tuy nhiên, có một giải pháp thay thế. IF loại bản ghi chứa bất kỳ loại dữ liệu do trình biên dịch quản lý (chuỗi dài, giao diện, mảng động, v.v.), sau đó RTTI sẽ được tạo cho loại bản ghi đó, như bất kỳ thuộc tính published nào sử dụng loại bản ghi đó, và do đó GetPropInfo() tìm các thuộc tính như vậy (Tôi đã xác nhận rằng điều này không hoạt động trong Delphi 7).

Bản ghi TDoublePoint của bạn không chứa bất kỳ loại dữ liệu do trình biên dịch quản lý nào, vì vậy đó là lý do tại sao GetPropInfo() quay lại không cho thuộc tính TCell.Zoom của bạn.

Vấn đề RTTI đó đã được sửa trong phiên bản sau (không chắc chắn vấn đề nào. Tôi đoán có lẽ trong Delphi 2010, khi mở rộng RTTI lần đầu tiên được giới thiệu). Ví dụ, mã bạn đã hiển thị hoạt động cho tôi như trong XE. GetPropInfo() có thể tìm thấy thuộc tính Zoom như mong đợi, mà không cần phải giới thiệu bất kỳ loại trình biên dịch được quản lý nào vào loại bản ghi TDoublePoint.

+0

thanx để làm rõ ... cách duy nhất để giải quyết sự cố, là thay đổi bản ghi thành đối tượng, tôi thấy – lyborko

+0

Có, và đảm bảo nó xuất phát từ 'TPersistent' hoặc hậu duệ của nó. –

+0

Thực ra, câu trả lời của tôi hơi gây hiểu nhầm. Nó * IS * có thể trong Delphi 7, nhưng nó có lẽ không phải là giải pháp bạn đang hy vọng. Tôi đã cập nhật câu trả lời của mình. –

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