Trong các loại sau đây:Delphi - tên Extract setter phương pháp của một tài sản
MyClass = class(TInterfacedPersistent)
private
FMyProperty: Integer;
published
procedure setMyProperty(Value: Integer); virtual;
property MyProperty: Integer read FMyProperty write setMyProperty;
Tôi muốn biết tên của phương pháp setter của "myProperty" bất động sản qua RTTI. Tôi đã thử các cách sau:
procedure ShowSetterMethodsNames(pMyObject: TObject);
var
vPropList: TPropList;
vCount, I: Integer;
begin
vCount:= GetPropList(pMyObject.ClassInfo, tkProperties, @vPropList);
for I:= 0 to vCount -1 do
begin
if Assigned(vPropList[I]^.SetProc) then
ShowMessage(pMyObject.ClassType.MethodName(vPropList[I]^.SetProc));
end;
end;
Mặc dù con trỏ không phải là nil, tất cả những gì tôi có là thư trống. Có ai có một số mẹo cho tôi không?
P .: Tôi đang sử dụng Delphi XE4, và tôi biết tôi nên sử dụng RTTI mở rộng thay vì cổ điển, nhưng dù sao, tôi không thể làm những gì tôi muốn trong cả hai tính năng ... Vì vậy, bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn bạn đã trả lời.
EDITION CUỐI CÙNG, vấn đề giải quyết:
Đây là mã làm việc, có trụ sở tại (giúp đỡ của bạn bè của tôi và ...) RTTI đơn vị (phương pháp DoSetValue của lớp TRTTIInstanceProperty):
procedure ShowVirtualSettersNames(pObject: Pointer);
var
vSetter, vPointer: Pointer;
vPropList: TArray<TRttiProperty>;
vProp: TRttiProperty;
begin
vPropList:= RTTIUtils.ExtractProperties(TObject(pObject).ClassType); // Helper to get properties from a type, based in extended RTTI
for vProp in vPropList do
begin
vPointer:= TRttiInstanceProperty(vProp).PropInfo^.SetProc;
vPointer:= PPointer(PInteger(pObject)^ + Smallint(vPointer))^;
ShowMessage(TObject(pObject).ClassType.MethodName(vPointer));
end;
end;
CHỈ CÓ CÔNG TRÌNH ĐỐI VỚI BỘ LỆNH VIRTUAL, đối với các số liệu thống kê thông báo trống. Cảm ơn mọi người!
Chào mừng bạn đến với Stack Overflow. Bạn có lẽ nên bao gồm mã bạn sử dụng để gán vPropertyInfo. Nếu không, bạn không thể chắc chắn kết quả của mình không đơn giản là do bạn có thông tin thuộc tính sai. Ngoài ra, là lớp cơ sở của lớp học của bạn có liên quan, hoặc bạn có được kết quả tương tự từ TObject hoặc TPersistent? [Chỉnh sửa] câu hỏi của bạn để thêm chi tiết. –
Đã chỉnh sửa để hiển thị cách nhận PPropInfo. Lớp được liệt kê ở trên, nó được thừa hưởng từ TInterfacedPersistent, vì vậy tôi có thể làm việc với RTTI trong các thuộc tính đã xuất bản. Cảm ơn đã giúp đỡ. –
Bạn sử dụng phương pháp VIRTUAL làm setter. các biến, phương thức tĩnh và các phương thức ảo có ngữ nghĩa khác nhau. Để kiểm tra giải thích này, hãy xóa "virtual" sau khi setter và kiểm tra xem mã của bạn có bắt đầu hoạt động hay không. Ngoài ra, tôi nghĩ rằng bạn đặt một điểm ngắt và giá trị của 'IntToHex (vPropList [I] ^. SetProc)' - nó nên đã chỉ ra rằng nó là không thể tin được nhỏ là một con trỏ thực sự. –