Czy istnieje sposób na iterowanie zmiennych składowych obiektu w D2010 bez wcześniejszej wiedzy o tym, co jest przed nimi?Zmienne członów Iterate
Odpowiedz
Tak, jeśli używasz Delphi 2010 lub nowszego. Możesz użyć rozszerzonego RTTI, aby uzyskać informacje o polach, metodach i właściwości obiektu. Prosta wersja:
procedure GetInfo(obj: TObject);
var
context: TRttiContext;
rType: TRttiType;
field: TRttiField;
method: TRttiMethod;
prop: TRttiProperty;
begin
context := TRttiContext.Create;
rType := context.GetType(obj.ClassType);
for field in rType.GetFields do
;//do something here
for method in rType.GetMethods do
;//do something here
for prop in rType.GetProperties do
;//do something here
end;
Niezbędne obiekty można znaleźć w jednostce RTTI
.
We wcześniejszych wersjach Delphi istnieje bardziej ograniczony RTTI, który może dostarczyć informacji o niektórych właściwościach i metodach, ale nie może zrobić tak wiele.
Czy metody/pola/właściwości muszą być "opublikowane" czy mogą być normalne? –
@John: Domyślnie dla wszystkich pól generowane jest rozszerzone RTTI oraz właściwości i metody "public" lub "published". Można to zmienić w kodzie, który piszesz, używając dyrektywy kompilującej '{$ RTTI}', ale jest dość zapiekanka dla standardowych bibliotek, chyba że używasz ich zmodyfikowanych wersji. (Który jest możliwy, ale oficjalnie zniechęcony przez Embarcadero.) –
Hmm, Borland był bardzo przyjazny dla odbudowy RTL, czy ostatnio zmienili politykę? –
której wersji delphi używasz? – RRUZ
Używam Delphi 2010. –