Salve a tutti.
Sto costruendo un "form builder" con dei componenti custom e per editare le varie property ho costruito anche un "simil" object inspector usando RTTI che delphi mette a disposizione, in poche righe ad ogni click sul componente selezionato riempo una string grid con le varie property
var
ctx: TRttiContext;
objType: TRttiType;
Prop: TRttiProperty;
begin
ctx := TRttiContext.Create;
objType := ctx.GetType(oPropertyComp.ClassInfo);
for Prop in objType.GetProperties do
begin
aValue := Prop.GetValue(Pointer(oPropertyComp));
sgProp.Cells[0, nInc - 1] := Prop.Name;
sgProp.Cells[1, nInc - 1] := aValue.ToString;
Inc(nInc);
sgProp.RowCount := nInc;
end;
....
end;
e sino a qui, un po' rozzo, ma tutto bene, i problemi arrivano quando cerco di modificare una property "enum", nella cella selezionata creo un combo e dentro vorrei metterci tutte le scelte possibili, ma usando la unit RTTI non riesco a trovare la strada, e ho dovuto ripiegare usando la unit TypeInfo facendo:
var p: PByte;
AValue: TValue;
i: integer;
begin
// ricavo in AValue la property con RTTI e se aValue.TypeInfo.Kind è tkEnumeration
// usando typoinfo mi vado a prendere la lista dei enum della property
p := @System.TypInfo.GetTypeData(aValue.TypeData^.BaseType^)^.NameList;
// poi riusando la uniRTTI riempo il combo con i vari Item e lo mostro nella cella selezionata
for i := 0 to aValue.TypeData.MaxValue do
ComboEnum.Items.Add(ReadShortString(p));
end
Il tutto funziona abbastanza bene (devo fare qualche altro test, ma sono ottimista).
La mia curiosita è: come estrarre i type di una property usando solo la unit RTTI, senza doversi appoggiare al typeinfo, se possibile.
W.