Я реализую функцию Boilerplate - позволяет пользователям изменять описания некоторых компонентов - например, TLabel
s - во время выполнения.
например,
TFooClass = Class ( TBaseClass)
Label : Tlabel;
...
End;
Var FooClass : TFooClass;
...
Во время разработки свойство заголовка значения Label называется «Имя», когда
приложение запущено, есть функция, которая позволяет пользователю изменить заголовок
значение, чтобы сказать «Другое имя». Как только это будет изменено, заголовок для метки
экземпляр класса FooClass обновляется немедленно.
Проблема теперь в том, если пользователь по какой-либо причине хочет вернуться к дизайну
временное значение, скажем, «Имя», кажется невозможным.
Я могу использовать методы RTTIContext и все такое, но я, в конце концов, кажется
требовать экземпляр класса для меня, чтобы изменить значение и, так как это
уже изменился - я, кажется, ударил кирпичную стену, обходя ее.
У меня такой вопрос - есть ли способ использовать старые методы RTTI или новый RTTIContext
заполнить свойство члена класса без создания экземпляра класса - то есть получить
свойство из определения ClassType.
Это фрагмент кода моей попытки сделать это:
c : TRttiContext;
z : TRttiInstanceType;
w : TRttiProperty;
Aform : Tform;
....
Begin
.....
Aform := Tform(FooClass);
for vCount := 0 to AForm.ComponentCount-1 do begin
vDummyComponent := AForm.Components[vCount];
if IsPublishedProp(vDummyComponent,'Caption') then begin
c := TRttiContext.Create;
try
z := (c.GetType(vDummyComponent.ClassInfo) as TRttiInstanceType);
w := z.GetProperty('Caption');
if w <> nil then
Values[vOffset, 1] := w.GetValue(vDummyComponent.ClassType).AsString
.....
.....
....
....
Я получаю всевозможные ошибки, и любая помощь будет принята с благодарностью.