Heh, sprawdziłem bo myślałem, że znasz jakąś magiczną sztuczkę, ale raczej nie ma możliwości tego dokonać dla struktur (chyba że magia ze wskaźnikami - kiedyś coś w tym stylu pokazywał @Patryk27 o ile dobrze pamiętam);
Dla klas oczywiście że można, ale nie tak jak chciał pytacz; Za pomocą funkcji GetPropInfo można pobrać wskaźnik do struktury z informacjami o polu danej właściwości i odpowiednią funkcją ustawić jej nową wartość, ale właściwość tak jak wspomniałeś - musi być w sekcji Published;
Przykład dla właściwości łańcuchowej:
uses
TypInfo;
type
TFoo = class(TObject)
private
FName: AnsiString;
public
constructor Create(AName: AnsiString);
published
property Name: AnsiString read FName write FName;
end;
constructor TFoo.Create(AName: AnsiString);
begin
inherited Create();
FName := AName;
end;
var
fooItem: TFoo;
piName: PPropInfo;
begin
fooItem := TFoo.Create('_13th_Dragon');
try
WriteLn('Name: ', fooItem.Name);
piName := GetPropInfo(fooItem.ClassInfo, 'Name');
if Assigned(piName) then
SetStrProp(fooItem, piName, 'Furious Programming');
WriteLn('Name: ', fooItem.Name);
finally
fooItem.Free();
ReadLn;
end;
end.
na wyjściu dostaniemy:
Name: _13th_Dragon
Name: Furious Programming
Jest więcej funkcji pozwalających na ustalanie nowych wartości dla właściwości (a raczej pól tych właściwości):
-
SetStrProp,
-
SetWideStrProp,
-
SetUnicodeStrProp,
-
SetFloatProp,
-
SetInt64Prop,
-
SetOrdProp,
-
SetVariantProp,
-
SetEnumProp,
-
SetSetProp,
-
SetInterfaceProp,
-
SetMethodProp,
-
SetObjectProp
i jeszcze kilka innych, ale nie chce mi się ich wszystkich wymieniać.